2012-04-24 4 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-cpecific -python-module) –

ответ

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

+0

@interjay дает некоторые другие вещи, хотя, как '' __doc__'' и '' __name__'', что я думаю, что OP хочет удалить из него – jterrace

+0

Но это не имеет ничего общего с '__builtins__', это просто имена, которые определены в каждом модуль (и, следовательно, также находится в '__builtins__'). Вызов их «встроенных переменных» вводит в заблуждение. – interjay

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 «Whos», так что я испекла это вверх: сутью 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.

Смежные вопросы