2012-04-24 39 views
4

我想遍歷python腳本中設置的變量。我碰到以下情況:列出用戶定義的變量,python

Enumerate or list all variables in a program of [your favorite language here]

,並在第一個例子:

#!/us/bin/python                      

foo1 = "Hello world" 
foo2 = "bar" 
foo3 = {"1":"a", "2":"b"} 
foo4 = "1+1" 

for name in dir(): 
    myvalue = eval(name) 
    print name, "is", type(name), "and is equal to ", myvalue 

它列出了存儲在內存中的所有變量。我想隔離我在腳本中創建的變量,而不是列出默認創建的系統變量。有沒有辦法做到這一點?

+0

[如何獲取特定Python模塊中的變量列表?](http://stackoverflow.com/questions/9759820/how-to-get-a-list-of-variables-in-specific -python-module) – 2012-04-24 16:43:26

回答

5

如果你不把任何下劃線在變量的前面,你可以這樣做:

#!/us/bin/python                      

foo1 = "Hello world" 
foo2 = "bar" 
foo3 = {"1":"a", "2":"b"} 
foo4 = "1+1" 

for name in dir(): 
    if not name.startswith('__'): 
     myvalue = eval(name) 
     print name, "is", type(myvalue), "and is equal to ", myvalue 
7

您可以通過檢查剔除所包含的模塊默認變量,如果他們是在內置__builtins__模塊,像這樣:

>>> x = 3 
>>> set(dir()) - set(dir(__builtins__)) 
set(['__builtins__', 'x']) 

這不剝離出的唯一的事情是__builtins__本身,這是很容易特例。

另請注意,如果您重新定義了任何內建名稱,則這將不起作用。你不應該在實踐中這樣做,但很多人會這樣做,很多是偶然的。

+0

'dir()'不會給我'__builtins__'中的名字(Python 2.7)。我得到的只有'['__builtins__','__doc__','__name__','__package __']'。 – interjay 2012-04-24 16:47:39

+0

@interjay它給了一些其他的東西,像''__doc__''和'__name__'',我認爲OP想要剝離 – jterrace 2012-04-24 16:48:51

+0

但是這與'__builtins__'無關,它們只是每個模塊(因此也恰好在'__builtins__'中)。稱他們爲「內建變量」是誤導性的。 – interjay 2012-04-24 16:53:09

2

這裏是解決方案。

#!/us/bin/python  

not_my_data = set(dir()) 

foo1 = "Hello world" 
foo2 = "bar" 
foo3 = {"1":"a", "2":"b"} 
foo4 = "1+1" 

my_data = set(dir()) - not_my_data 

for name in my_data : 
    myvalue = eval(name) 
    print name, "is", type(name), "and is equal to ", myvalue 

但這是不好的做法。

你應該使用類似

#!/us/bin/python  
my_data = dict()                     
my_data['foo1'] = "Hello world" 
my_data['foo2'] = "bar" 
my_data['foo1'] = {"1":"a", "2":"b"} 
my_data['foo1'] = "1+1" 

for name in my_data : 
    myvalue = eval(my_data[name]) 
    print name, "is", type(name), "and is equal to ", myvalue 
0

我想要的東西沿着MATLAB「衛生組織」的線路比較多,所以我烤這件事: 要點here

import __main__ 
def whos(lss): 
fil = __main__.__file__ 
thisthinghere = open(fil).read().split("\n") 
vs = [] 
for l in thisthinghere: 
    if l.find("=") > -1: 
     vs.append(l.split("=")[0].strip()) 
keys = lss.keys() 
out = {} 
for v in vs: 
    try: 
     out[v] = lss[v] 
    except: 
     "not in list" 
keys = out.keys() 
keys.sort() 
for k in keys: 
    val = str(out[k]) 
    if len (val) > 10: 
     if val[-1] == ")":val = val[0:10]+"..."+val[-10:] 
     elif val[-1] == "]" :val = val[0:10]+"..."+val[-10:] 
     else: val = val[0:10] 
    print k,":",val 

return out 

#import into your script and call with whos(locals()) 

它似乎工作。它將打印變量空間,並將其作爲字典返回以便於酸洗/打結。