2012-04-24 43 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()) 

它似乎工作。它将打印变量空间,并将其作为字典返回以便于酸洗/打结。