2012-08-31 144 views
2

目前的範圍有任何引用指向當前的範圍,我擡頭一看很多文章,並不能找到答案,比如我想打印每一個變種的內容在當前範圍如何讓蟒蛇

for x in list(locals()): 
    print(x) 

但只給我這個,該變種的名稱

__builtins__ 
__file__ 
__package__ 
__cached__ 
__name__ 
__doc__ 

我不想這樣的代碼

print(__builtins__) 
print(__file__) 
print(__package__) 
print(__cached__) 
print(__name__) 
print(__doc__) 
.... 
+0

下劃線變量是您當前範圍的一部分。如果你不想要它們,就跳過它們。 – gecco

+0

@gecco他想打印變量的值,而不是跳過它們。在他的文章for循環打印變量的名稱,不存在vote – miracle173

回答

5

大規模的矯枉過正...將過濾和本地名稱空間打印到一個函數中。

我不推薦這個。我張貼它主要是爲了表明它可以完成並獲得評論。

import inspect 

def print_local_namespace(): 
    ns = inspect.stack()[1][0].f_locals 
    for k, v in ns.iteritems(): 
     if not k.startswith('__'): 
      print '{0} : {1}'.format(k, v) 


def test(a, b): 
    c = 'Freely' 
    print_local_namespace() 
    return a + b + c 


test('I', 'P') 
1

只打印locals()這些變量名不與'__'開始:

for local_var in list(locals()): 
    if not local_var.startswith('__'): print local_var 
+1

獲取Python2「f-字符串」,「我希望我有f-字符串」.format(** locals())的巨大黑客if –

3

也得到了值,你可以使用:

for symbol, value in locals().items(): 
    print symbol, value 

當地人()給你的字典。迭代字典給你的鑰匙。要獲取(鍵,值)對列表,請使用items方法。

+0

if你運行你的代碼,將向你展示這些,RuntimeError:迭代期間字典已更改大小 – Max

+0

你使用的是哪個版本的Python?我已經將代碼改爲使用2.7的代碼 – Simon

2

你是什麼意思的「當前範圍」?如果你的意思只是局部變量,那麼locals()是正確的答案。 如果你的意思是你可以使用的所有標識符[locals + globals + nonlocals]比事情變得更加混亂。可能更簡單的解決方案是this之一。

如果你不想要__.*__變量,只是將它們過濾掉。