我正在尝试找到一种按名称访问模块变量的方法,但还没有找到任何东西。我现在使用的是:
var = eval('myModule.%s' % (variableName))
但是它很模糊并且破坏了IDE错误检查(即在eclipse / pydev import中myModule标记为未使用,而上面的行需要它)。有没有更好的方法呢?可能是我不知道的模块内置函数?
答案 0 :(得分:26)
import mymodule
var = getattr(mymodule, variablename)
答案 1 :(得分:5)
getattr(themodule, "attribute_name", None)
如果属性不存在,则第三个参数是默认值。
来自https://docs.python.org/2/library/functions.html#getattr
返回object的named属性的值。 name必须是一个字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,' foobar')等同于x.foobar。如果named属性不存在,则返回default(如果提供),否则引发AttributeError。
答案 2 :(得分:0)
另一种选择是使用INSPECT和getmembers(modulename)函数。
它将返回模块中内容的完整列表,然后可以对其进行缓存。例如。
>>>cache = dict(inspect.getmembers(module))
>>>cache["__name__"]
Pyfile1 test
>>>cache["__email__"]
'name@email.com'
>>>cache["test"]("abcdef")
test, abcdef
此处的优点是您只执行一次查找,并且假定模块在程序执行期间未更改。
答案 3 :(得分:0)
如果要从当前运行的模块中获取一个变量(而不是另一个):
import sys
# sys.modules[__name__] is the instance of the current module
var = getattr(sys.modules[__name__], 'var_name')
var
当然可以是一个regualr变量,类,或者基本上是其他任何东西:)