在Python中使用变量值作为字典/类名

时间:2013-08-23 08:25:31

标签: python

我的要求是使用变量值来引用Python中的类/字典。作为示例示例,我有以下数据: -

class test1:
    pass

class test2:
   pass

test1_dict = {}
test2_dict = {}

testvariable = "test1"

现在我想检查testvariable的值并创建一个类的实例并将其附加到字典中。

e.g。

if testvariable == "test1":
    test1inst = test1()
    test1_dict["test1"] = test1inst
elif testvariable == "test2":
    test2inst = test2()
    test2_dict["test2"] = test2inst

在上面的代码中,我必须明确使用if/else检查testvariable的值并相应地执行操作。

在我的实际情况中,我可以有多个testvariable值,并且可能有多个地方需要if/else检查。那么,有可能以某种方式,我可以直接使用testvariable的值来引用字典/类实例而不使用if/else

3 个答案:

答案 0 :(得分:10)

几乎从不有一个很好的理由来查找这样的名字。 Python有一个非常好的数据结构,用于将名称映射到对象,这是一个字典。如果你发现自己说'#34;我需要动态查找某些内容",那么dict就是答案。在你的情况下:

from collections import defaultdict
test_classes = {
    'test1': test1,
    'test2': test2
}
test_instances = defaultdict(list)
test_instances[testvariable].append(test_classes[testvariable])

答案 1 :(得分:0)

我同意Daniel Roseman的说法,几乎从不这是一个很好的理由。但是,我挑战了! OP在他或她自己的危险中跟随我的领导。

秘诀是使用Python的exec函数,它允许以Python代码的形式执行字符串的内容:

所以,

if testvariable == "test1":
    test1inst = test1()
    test1_dict["test1"] = test1inst
elif testvariable == "test2":
    test2inst = test2()
    test2_dict["test2"] = test2inst

变为

exec("%sinst = %s()" % (testvariable, testvariable))
exec("%s_dict[testvariable] = %sinst" % (testvariable, testvariable))

尽管需要注意的是,在OP的情况下,testvariable的其他值不执行任何操作,并且在使用exec()的情况下会导致NameError异常。

答案 2 :(得分:0)

我将结合其他一些帖子并说Python已经有一个将对象名称映射到对象的字典。您可以访问本地和全局变量,只要您可以在模块中定义类:

my_inst[testvariable] = locals()[testvariable]()