【问题标题】:How to convert string to variable name?如何将字符串转换为变量名?
【发布时间】:2011-05-25 10:14:52
【问题描述】:

我想知道如何将字符串输入转换为变量名以用于 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()这样的函数吗?

【问题讨论】:

  • 使用“object”作为变量名不是很好,因为它与Python2的“object”类型或Python3的“object”类冲突。
  • @everybody:感谢大家的精彩回答!
  • 请,请,请搜索:stackoverflow.com/search?q=%5Bpython%5D+string+variable+name。这个问题——以这种字面形式——已经被问了数百次。
  • @S.Lott:我确实从昨天开始寻找这些并查看了 python 文档,但这里提出的问题是将变量名转换为字符串,而关于将字符串转换为变量名的一个问题是实际上是关于格式化字符串。感谢您的检查,如果您能指出一个问题,其内容回答了我的问题,我准备接受我的错误:)
  • @Benjamin:“但问题问[如何]将变量名转换为字符串”这显然是错误的。我猜你根本没有真正仔细阅读它们。例如,stackoverflow.com/questions/1009831/… 是重复的。

标签: python string variables module introspection


【解决方案1】:

使用__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)

【讨论】:

  • __import__ 在名称中包含点时不会返回您期望的结果,最好使用importlib.import_module
  • @Cat Plus Plus :很棒的模块,我曾经将这些导入语句的部分分开。我学到了一些很棒的东西:)并编辑了我的答案。
  • 谢谢,这正是我所需要的,太棒了:) 所以我什至可以像 getattr(self, string) = value 这样的方式将一些成员添加到一个类中?
  • @Benjamin : 使用 setattr(self, string, value) 而不是 getattr 来设置值 ;)
  • édric:更好! :) -- 我喜欢 Python :D
【解决方案2】:

您不能将字符串转换为变量,因为变量是代码的一部分,而不是数据的一部分。通常,如果您需要“变量变量”,您会使用字典:

data = {
    foo: foo_value,
    bar: bar_value
}

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

【讨论】:

  • 在阅读了您对我的回答的评论后,我删除了我的评论和我的 -1。当前的 -1 不是我的。
【解决方案3】:

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

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

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

【讨论】:

  • 如果模块还没有被导入,那么它也不会存在于sys.modules 中。为此,您需要__import__
  • 确实如此,但我假设它已经被导入了。 :-)
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 2010-12-04
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多