2010-08-25 73 views
4

使用Python 2.4,我試圖識別,在運行時,哪一個任意函數的參數具有默認值。不幸的是,雖然我可以找到默認值,但似乎無法得到它們對應的參數的句柄。例如:如何在運行時確定給定函數參數的默認值?

def foo(a, b, c=5): 
    return a + b + c 

import inspect 
inspect.getargspec(foo) # output is: (['a', 'b', 'c'], None, None, (5,)) 

getargspec輸出是在Python 2.6,它返回一個名爲元組更加清晰:

ArgSpec(args=['a', 'b', 'c'], varargs=None, keywords=None, defaults=(5,))

的Python顯然有足夠的信息,在執行過程中來完成任務。我怎樣才能得到它?

+1

這個元組有什麼問題? – 2010-08-25 17:59:32

+0

元組沒有錯,它只是沒有用元數據來裝飾,這使得它更容易解釋。它們實際上都是元組,但在2.6中,它是一個命名的元組。 – vezult 2010-08-25 18:33:08

回答

6

具有默認值的參數必須跟在沒有默認值的參數之後。 所以如果有任何默認值,它們必須對應於args尾部的參數。

在你的情況下,args=['a','b','c']defaults=(5,)。所以默認值必須對應c

import inspect 

def foo(a, b, c=5): 
    return a + b + c 
def show_defaults(f): 
    args, varargs, varkw, defaults = inspect.getargspec(f) 
    if defaults: 
     for arg, default in zip(args[-len(defaults):], defaults): 
      print('{a} = {d}'.format(a=arg,d=default)) 

show_defaults(foo) 
# c = 5 
+0

這很有幫助,謝謝。 – vezult 2010-08-25 18:22:22

3

documentation,它討論了值defaults

如果這個多元組有n個元素,它們 對應於最後n個元素 在args列出。

在你的情況defaults包含一個值,對應於args的最後一個要件,這是c

+0

什麼?你建議我閱讀文檔?這是瘋狂的談話! ; o)是的,所以我不知道我是怎麼做到的......但是你發現我是紅的。感謝您的回答,以及溫和的提醒。 – vezult 2010-08-25 18:25:57

相關問題