如何将字符串转换为变量名?

9
我想知道如何将字符串输入转换为变量名以在Python代码中使用。这里有一个具体的例子:
def insrospect(foo, bar):
    requested_module = makestringvariable(foo)
    requested_object = makestringvariable(bar)
    import requested_module
    for item in inspect.getmemebers(requested_module.requested_object):
        member = makestringvariable(item[0])
        if callable(requested_object.member):
           print item

if __name__ == '__main__':
    introspect(somemodule, someobject)

因为我不知道在启动之前要检查哪个模块,所以需要将字符串转换为可用的模块名称。由于getmembers()返回成员作为字符串,我还需要将它们转换为可用的变量名称以检查它们是否可调用。

是否有这样一个makestringvariable()函数?


1
使用“object”作为变量名并不是一个很好的想法,因为它会与Python2的“object”类型或Python3的“object”类发生冲突。 - utdemir
1
请,请,请搜索:http://stackoverflow.com/search?q=%5Bpython%5D+string+variable+name。这个问题 - 以这种字面形式 - 已经被问了数百次。 - S.Lott
@S.Lott:实际上我昨天就查找了这些并查看了Python文档,但这里提出的问题是将变量名转换为字符串,而关于将字符串转换为变量名的一个问题实际上是关于格式化字符串的。谢谢您的检查,如果您能指出一个回答我的问题的内容的问题,我准备接受我的错误 :) - neydroydrec
@Benjamin:“但问题是如何将变量名转换为字符串”,这显然是错误的。我猜你根本没有仔细阅读它们。例如,https://dev59.com/WUjSa4cB1Zd3GeqPCA2t 是一个重复的问题。 - S.Lott
3个回答

11

利用__import__函数和getattr函数的魔法,你可以直接编写如下代码:

import importlib
def introspect(foo, bar):
    imported_module = importlib.import_module(foo)
    imported_object = getattr(imported_module, bar)
    for item in inspect.getmembers(imported_object):
        if callable(getattr(imported_object, item[0]):
           print item

if __name__ == '__main__':
    introspect(somemodule, someobject)

7
如果名称包含点,__import__在导入时将无法返回您所期望的结果,建议使用importlib.import_module - Cat Plus Plus
@Cat Plus Plus:很棒的模块,我曾经自己拆分过这种导入语句的部分。我学到了很棒的东西 :) 并编辑了我的答案。 - Cédric Julien
谢谢,这正是我所需要的,太棒了 :) 所以我甚至可以通过这种方式向类添加一些成员,比如 getattr(self, string) = value - neydroydrec
2
@Benjamin:使用setattr(self, string, value)来设置值,而不是使用getattr() ;) - Cédric Julien
更好! :) -- 我爱Python :D - neydroydrec

6

您不能将一个字符串直接转换为变量,因为变量是您的代码的一部分,而不是您的数据的一部分。通常,如果您需要类似 "可变变量" 的功能,您会使用字典:

data = {
    foo: foo_value,
    bar: bar_value
}

然后使用data [foo]而不是尝试使用foo作为变量。然而,在这个例子中,您实际上是在询问如何通过字符串导入模块以及如何使用字符串名称获取属性,这两个都是Python提供的服务:通过__import__getattr函数。


在阅读了您对我的回答的评论后,我删除了我的评论和我的-1。当前的-1不是我的。 - orlp

3

模块的成员只是该模块上的属性,因此您可以在模块对象上使用getattr来检索它们。

模块对象本身存储在sys.modules字典中:

module = sys.modules[modulename]
member = getattr(module, membername)

如果模块尚未被导入,它也不会存在于 sys.modules 中。你需要使用 __import__ 来实现。 - Thomas Wouters
足够正确,但我假设它已经被导入了。 :-) - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接