5

我正在尝试遍历 python 脚本中设置的变量。我遇到了以下情况:

枚举或列出 [您最喜欢的语言] 程序中的所有变量

在第一个例子中:

#!/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

它列出了存储在内存中的所有变量。我想隔离我在脚本中创建的变量,而不是列出默认创建的系统变量。有没有办法做到这一点?

4

5 回答 5

9

如果你没有在你的变量前面加上任何下划线,你可以这样做:

#!/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
于 2012-04-24T16:41:22.383 回答
9

您可以通过检查它们是否在内置__builtins__模块中来去除默认包含在模块中的变量,如下所示:

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

唯一没有剥离的是__builtins__它本身,这很容易成为特殊情况。

另请注意,如果您重新定义了任何内置名称,这将不起作用。你不应该在实践中这样做,但是很多人这样做,很多是偶然的。

于 2012-04-24T16:45:02.030 回答
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
于 2012-04-24T18:29:51.020 回答
1

问题标题让我看到了这一点。但这不是我想要的。

自我回答如下

[s for s in dir() if not '__' in s]
于 2020-11-23T00:13:03.813 回答
0

我想要更多类似于 matlab 'whos' 的东西,所以我把它烘焙了:gist 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())

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

于 2014-10-22T16:28:38.527 回答