这可能是一些非常基本和简单的东西,我可能只是在谷歌上搜索错误的术语,但希望这里有人能帮助我。(我仍然是一个编程初学者,这可能从这个问题中很明显。)
我正在寻找一种从字符串访问变量的方法。
像这样:
A1 = {}
B1 = {}
C1 = {}
mylist = ["A","B","C"]
for blurb in mylist:
blurb1.foo()
现在我在这种情况下使用if/elif构造:
if blurb == "A":
A1.foo()
elif blurb == "B":
B1.foo()
elif blurb == "C":
C1.foo()
这是可行的,但肯定有更优雅的方式吗?
谢谢你的帮助!拉斯塔达
编辑2:再次尝试澄清(很抱歉,我之前没有说得很清楚,我很难理解):
我想从字符串创建和访问对象。
因此,如果我有一个返回字符串的函数,我想用这个字符串作为列表名创建一个列表,然后用这个列表做一些事情。
x = foo() # foo returns a string, e.g. "A"
# create list named whatever the value of x is
# in this case:
A = []
没有什么比为x的所有可能结果准备列表和使用长elif结构或字典更优雅的了吗?在这种情况下,我必须使用ava()吗?我不太愿意使用ava(),因为它被认为是危险的。)
我希望现在终于清楚了。感谢您的帮助!
我想你想要像这样的东西
lookup = {"A": A1, "B": B1, "C": C1}
obj = lookup.get(blurb,None)
if obj:
obj.foo()
这通常是建议当有人想做某事与一个开关语句(从c/java/等)。请注意,lookup.get(而不仅仅是查找[模糊]处理模糊不是您定义的值的情况...您也可以将其包装在try/除块中。
根据你修改后的问题更新的答案,这是建立在约阿希姆·皮勒伯格在另一个答案中所说的基础上的。
可能有更好/更干净的方法可以做到这一点,但如果您真的想通过字符串设置/获取以操纵全局对象,您可以这样做。一种方法是:创建一个名为“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
您可以获取模块对象,并使用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))
上述程序将打印:
A : {} B : {} C : {}
但是,它与您在问题中引用的“通配符”无关,但您不会显示任何对“通配符”的搜索。
使用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)