2012-08-08 100 views
1

這可能是非常基本和簡單的事情,我可能只是用錯誤的術語搜索,但希望這裏有人能幫助我。 (我仍然是編程的初學者,這可能很明顯,從這個問題。)Python:從字符串訪問變量

我正在尋找一種方法來訪問字符串的變量。

像這樣:

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

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

for blurb in mylist: 
    blurb1.foo() 

現在,我用在這種情況下,如果/ elif的-結構:

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()猶豫不決,因爲它被認爲是危險的。)

我希望現在終於清楚了。 任何幫助仍然感激!

Lastalda

+0

你在尋找switch語句嗎? – victorsavu3 2012-08-08 12:54:31

+0

不,他正在尋找一種方式來通過字符串轉換(或其他類型的轉換)運行函數/或訪問變量(如上面的他的字典) – 2012-08-08 13:04:53

+0

類似的東西,是的。我會怎麼做? – Lastalda 2012-08-09 13:00:17

回答

9

我想你想要像

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

當有人想這樣做與switch語句某事,這通常是建議(從C/JAVA的/ etc。)注意查找。得到(而不僅僅是查找[導語]處理這樣的情形Blurb的是其他東西比你定義它......你也可以/包裹在一個try塊之外的一個值的情況。


根據您的修訂問題更新了答案,該答案基於Joachim Pileborg在另一個答案中所說的內容。

有可能有更好/更乾淨的方法來做到這一點,但如果你真的想通過字符串來設置/獲取操作全局對象,你可以做到這一點。一種方法是: 要創建一個名爲「MYVARIABLE」(或設置「MYVARIABLE」到一個新的值)

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

爲了獲取對象的新對象「MYVARIABLE」被分配到:

globals().get(joe,None) 

(或在另一個答覆中提到,您可以使用嘗試/除非直接哈希,而不是使用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 
+0

這很混亂,增加了很多額外的檢查和一個額外的字典....不是很有效的數據,或不同類型的所需功能...更好地使用'eval()'。 – 2012-08-08 13:11:47

+0

eval是邪惡的!(大部分時間) – Matthias 2012-08-08 13:14:28

+2

「一整個額外字典「哦,不,一本完整的字典!哈哈! – kindall 2012-08-08 13:16:59

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) 
5

你可以得到的模塊對象,並使用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 : {} 

但是,它與您在您的問題中引用的「通配符」無關,但不顯示任何對「通配符」的搜索。

+0

我不知道如何調用它。我想「從字符串訪問變量」會更好? – Lastalda 2012-08-09 09:24:53

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(更好地請求原諒比許可),所以,如果你正在學習,我建議使用他們從一開始走。