2

这可能是非常基本和简单的事情,我可能只是在搜索错误的术语,但希望这里有人可以帮助我。(我仍然是编程的初学者,这从这个问题中可能很明显。)

我正在寻找一种从字符串访问变量的方法。

像这样:

A1 = {}
B1 = {}
C1 = {}

mylist = ["A","B","C"]

for blurb in mylist:
    blurb1.foo()

现在我在这种情况下使用 if/elif-constructions:

if blurb == "A":
    A1.foo()
elif blurb == "B":
    B1.foo()
elif blurb == "C":
    C1.foo()

这行得通,但肯定有更优雅的方法吗?

谢谢你的帮助!拉斯塔尔达


Edit2:试图再次澄清(抱歉之前不是很连贯,我很难理解这一点):

我想从字符串创建和访问对象。

因此,如果我有一个返回字符串的函数,我想创建一个使用此字符串作为列表名称的列表,然后使用该列表进行操作。

x = foo() # foo returns a string, e.g. "A"
# create list named whatever the value of x is
# in this case: 
A = []

没有什么比为 x 的所有可能结果准备列表并使用长 elif 结构或字典更优雅的了?在这种情况下我必须使用 eval() 吗?(我对使用 eval() 犹豫不决,因为它被认为是危险的。)

我希望现在终于清楚了。任何帮助仍然很感激!

4

4 回答 4

10

我想你想要类似的东西

lookup = {"A": A1, "B": B1, "C": C1}
obj = lookup.get(blurb,None)
if obj:
   obj.foo()

当有人想用 switch 语句(来自 c/java/etc)做某事时,通常会建议这样做。请注意,lookup.get(而不仅仅是 lookup[blurb] 处理的情况是,blurb 不是值之一你定义它...你也可以将它包装在一个 try/except 块中。


根据您修改后的问题更新答案,该问题建立在 Joachim Pileborg 在另一个答案中所说的基础上。

可能有更好/更清洁的方法可以做到这一点,但如果你真的想通过字符串设置/获取来操作全局对象,你可以这样做。一种方法是:创建一个名为“myvariable”的新对象(或将“myvariable”设置为新值)

joe = "myvariable"
globals().update([[joe,"myvalue"]])

要将对象“myvariable”分配给:

globals().get(joe,None) 

(或者如另一个答案中所述,您可以使用 try/except 直接散列而不是使用 get)

因此,对于后面的示例,您可以执行以下操作:

for myobject in mylist:
    # add myobject to list called locus
    # e.g. if locus == "A", add to list "A", if locus == "B" add to list B etc.
    obj = globals().get(myobject.locus,None) # get this list object
    if not obj: # if it doesn't exist, create an empty list named myobject.locus
        obj = []
        globals().update([[myobject.locus,obj]]
    obj.append(myobject) #append my object to list called locus
于 2012-08-08T12:55:18.097 回答
6

您可以获取模块对象,并用于getattr从字符串中获取变量/函数:

import sys

A = {}
B = {}
C = {}

modname = globals()['__name__']
modobj  = sys.modules[modname]

mylist = ["A","B","C"]

for name in mylist:
    print '%s : %r' % (name, getattr(modobj, name))

上面的程序将打印:

一个 : {}
乙:{}
C : {}

但是,它与您在问题中引用的“通配符”无关,但您没有显示对“通配符”的任何搜索。

于 2012-08-08T13:07:58.580 回答
3

使用eval().

例子:

A1 = []
B1 = []
C1 = []

mylist = ["A","B","C"]

for blurb in mylist:
    eval("%s1.append(blurb)" % blurb)

print A1,B1,C1
>>> 
['A'] ['B'] ['C']

对于您的代码,它可以是:

for blurb in mylist:
    eval("%s1.foo()" % blurb)
于 2012-08-08T13:07:20.210 回答
1

我看起来你只是想要一本字典并查找它而不是运行一堆检查。

dict_look_up = {'A' : A1, 'B' : B1, 'C' : C1}
try:
    dict_look_up[blurb].foo()
except KeyError:
    #whatever on item not found

try/except块在 Python 中非常重要(请求原谅比请求许可更好),所以如果你正在学习,我建议从一开始就使用它们。

于 2012-08-08T14:33:19.110 回答