2009-05-31 65 views
26

有沒有辦法在運行時知道變量的名稱(來自代碼)? 或在編譯過程中忘記var名稱(字節碼或不)?在運行時在python中檢索一個變量的名字?

例如

 
>>> vari = 15 
>>> print vari.~~name~~() 
'vari' 

注意:我說的是純數據型變量(INT,STR,列表...)

+6

難道你必須輸入變量名得到它的名字嗎? – 2009-05-31 20:57:35

+2

是的,那是3年前的事了,我不記得爲什麼這個問題是有道理的。但是啊!它非常受歡迎,所以它有一些東西。 – 2013-01-21 16:28:44

+0

下面是一個用法示例:變量foo,bar,baz在那裏,我想完全按照{'foo':foo,'bar':bar,'baz':baz}來獲取字典。當然,我可以按照我剛剛做的那樣打字,但不是非常簡潔。在我看來,「本地人()」傳遞的信息太多,並不完美。我期望的是一個像`magic_func([foo,bar,baz])`這樣的函數,它返回我想要的字典 – ZZY 2014-06-05 12:39:29

回答

2

這裏一個基本的(也許怪異)功能,顯示其參數的名稱... 的想法是分析代碼並搜索調用的函數(在初始化方法添加它可以幫助找到實例名,雖然與更復雜的代碼分析)

def display(var): 
    import inspect, re 
    callingframe = inspect.currentframe().f_back 
    cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines 
    m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE) 
    print m.group(1), type(var), var 

請注意: 從調用代碼越來越多行幫助情況下,呼叫被分裂爲下面的例子:

display(
     my_var 
     ) 

但會產生這個意想不到的結果:

display(first_var) 
display(second_var) 

如果你沒有對你的項目的格式控制你仍然可以提高代碼來檢測和管理不同的情況......

總的來說,我想一個靜態代碼分析,可以產生更可靠的結果,但我懶得檢查現在

10

變量名堅持在編譯的代碼(這是怎麼例如dir內置CAN工作),但是那裏的映射是從名稱到價值的,而不是相反。因此,如果有幾個變量都值得,例如23,則無法僅通過值23來告訴它們。

29

變量名不會被遺忘,你可以通過自省訪問變量(並查看你有哪些變量),例如,

>>> i = 1 
>>> locals()["i"] 
1 

然而,因爲在Python中沒有指針,沒有辦法引用變量,而無需實際編寫它的名字。所以如果你想打印一個變量名和它的值,你可以通過locals()或類似的函數。 ([i]成爲[1],有沒有辦法恢復了1實際上是從i傳來的信息。)

+0

這解決了我的情況。然後我對它們的值進行反向查找,並找到它們的名字。謝謝。 – 2009-05-31 21:11:32

+5

關於這一點的難點在於,如果你只有'我',那麼它不可能在`locals()`中找到它的名字。考慮'我= 1; J = 1;」。在這之後'locals()[「i」]是locals()[「j」]'。如果你擁有的只是「我」,那麼循環遍歷locals()將導致找到「i」或「j」作爲名稱。 – 2009-06-01 02:10:42

+1

D.可能打算說「如果你擁有的只是`1` [」]「 – akaihola 2009-08-19 05:00:08

3

這將簡單數據類型(STR,整型,浮點,列表等)

def my_print(var_str) : 
    print var_str+':', globals()[var_str] 
4

在這裏工作是我用它來打印變量的值的函數,它適用於本地和全局:

import sys 
def print_var(var_name): 
    calling_frame = sys._getframe().f_back 
    var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None)) 
    print (var_name+':', str(var_val)) 

所以下面的代碼:

global_var = 123 
def some_func(): 
    local_var = 456 
    print_var("global_var") 
    print_var("local_var") 
    print_var("some_func") 

some_func() 

生產:

global_var: 123 
local_var: 456 
some_func: <function some_func at 0x10065b488> 
2

你可以做到這一點,它只是不漂亮。

import inspect, sys 


def addVarToDict(d, variable): 
    lineNumber = inspect.currentframe().f_back.f_lineno 
    with open(sys.argv[0]) as f: 
     lines = f.read().split("\n") 

    line = lines[lineNumber-1] 

    varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip() 
    d[varName] = variable 


d = {} 

a=1 

print d # {} 
addVarToDict(d,a) 
print d # {'a': 1} 
相關問題