这可能是非常基本和简单的事情,我可能只是在谷歌搜索错误的条款,但希望这里有人可以帮助我。 (我仍然是编程的初学者,从这个问题可能很明显。)
我正在寻找一种从字符串中访问变量的方法。
像这样:
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()
这有效,但肯定有更优雅的方式吗?
感谢您的帮助! Lastalda
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()犹豫不决,因为它被认为是危险的。)
我希望现在终于清楚了。 任何帮助仍然赞赏!
答案 0 :(得分:9)
我想你想要像
这样的东西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
答案 1 :(得分: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))
上述程序将打印:
A : {} B : {} C : {}
但是,它与您在问题中引用的“通配符”无关,但您没有显示任何搜索“通配符”。
答案 2 :(得分:2)
使用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)
答案 3 :(得分: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中非常重要(最好是请求宽恕而不是许可),所以如果你正在学习我建议从开始使用它们。