2011-05-12 88 views
1

由於蟒蛇功能:解析方法變量名在Python中?

def MyPythonMethod(value1, value2): 
    # defining some variables 
    a = 4 
    myValue = 15.65 
    listValues = [4, 67, 83, -23] 

    # doing some operation on the list 
    listValues[0] = listValues[1]  

    # looping through the values 
    for i in listValues: 
     print i 

我怎樣才能提取names和方法MyPythonMethod所有的變量types

理想情況下,我想讓所有的變量名和它們的類型給定一個方法名。例如,輸出爲方法MyPythonMethod看起來就像這樣:

varNames = ["a", "myValue", "listValues", "i"]

varTypes = ["int", "float", "list", "float"]

任何想法?

+2

你爲什麼要這麼做? – delnan 2011-05-12 18:16:53

+1

開始挖掘。 http://docs.python.org/library/language.html – 2011-05-12 18:16:57

+0

我的感覺是,儘管這可能不是不可能的,但除非你的目標是創建一個可笑的rube-goldbergesque裝置,否則幾乎肯定是不必要的。多說一些爲什麼你想要這個,我們可以告訴你一個更好的方式來做你想做的事。 – senderle 2011-05-12 18:23:34

回答

7

1變量在python中沒有類型。對象有一個類型,而變量指向對象。

[2]您可以使用inspect module獲取有關函數內部的信息。 閱讀文檔 - 他們會告訴你什麼是可供檢查。例如,MyPythonMethod.func_code.co_varnames將爲您提供本地變量名稱。 (請注意,MyPythonMethod,定義,實際上是一個功能,而不是一個方法。)

[3]但是,即使你的局部變量的名稱,則不一定要同時除外的任何對象 該功能正在執行。值4被綁定到函數中的局部var'a' - 函數被調用之前和之後,沒有'a'並且它不被綁定到任何東西。

[4]如果在調試器中運行該函數,則可以在任何時候暫停執行,並檢查函數中創建的變量和對象。

[5]如果該函數引發異常,則可以捕獲該異常並在異常時訪問該函數的某些狀態。

+0

+1,用於查找'co_varnames',良好的捕獲。 – delnan 2011-05-12 18:39:44

+0

謝謝。它看起來像'MyPythonMethod.func_code.co_varnames'還返回函數參數作爲列表的一部分。有沒有辦法只得到該方法的局部變量? – user3262424 2011-05-12 20:41:33

+0

m.func_code.co_varnames [m.func_code.co_argcount:]可以工作,但它並不計算可選的「rest」arg。我不知道是否有任何其他情況argcount不會工作。依賴於arg命令可能是實現特定的,並且可能不能保證在將來工作。 – 2011-05-12 21:38:47

4

你不能這樣做「從外面」。

  • 直到方法運行,局部變量纔會存在。儘管所有變量的範圍都是靜態的,也就是在編譯時間,但我認爲如果不自己爬行AST或字節碼,您就無法輕鬆獲取這些信息。 (編輯:史蒂文證明我錯了這個...代碼對象有一個元組包含所有本地變量名稱)
  • 給定的代碼塊不能訪問任何範圍,但它自己的和sourrounding「詞法」範圍(內置的,模塊級的全局變量,封閉函數的局部範圍)。
  • 不存在變量的類型(使用Python) - 任何變量都可以在其生命週期中引用任何數量的完全不同類型的對象。如果添加a = "foo",輸出應該是多少?如果你再添加a = SomeClass()

裏面的方法本身,你可以使用locals()獲取本地變量,但當前參考對象的字典,你可以繼續調用上的值(對象)type。當然,這隻能得到你所指的對象的類型,目前。正如評論中暗示的那樣,我懷疑這是否有用。你真的想做什麼,即你想解決什麼問題?

+0

你太努力了! – user225312 2011-05-12 18:24:23

0

如果使用pdb你不能將最後一行設置爲斷點,然後讓調試器查看頂層棧幀併爲你列出變量嗎?或者您可以查看pdb代碼並複製它的技巧以瞭解如何引入斷點,然後檢查您註冊的斷點函數下面的堆棧幀。