2013-03-21 50 views
2
def foo(a=MyComplexObject(), b=Something(), *args): 
    print a, b, args 

指定默認值參數的方法是有沒有辦法來調用foo與指定*指定參數和在函數調用指定a或b - 因此利用有默認值?是否有訪問可變參數沒有在Python

喜歡的東西

foo(*args=(1,2,3)) 

這純粹是出於好奇。

+0

IIRC,在這個例子中'A'&'B'僅實例化一次,因此它是一樣'default_a = MyComplexObject()','DEF FOO(A = default_a) :'; args在python 2.7中也出現在kwargs之前。 – 2013-03-21 15:29:17

回答

3

你有你的關鍵字參數移至可變關鍵字捕獲太:

def foo(*args, **kw): 
    a = kw.get('a', MyComplexObject()) 
    b = kw.get('b', b=Something()) 
    print a, b, args 

Python將填補這兩個關鍵字參數第一否則,如在Python 2有沒有辦法來指定這些關鍵字不能用位置參數填充。

Python 3 changed the interpretation of the positional catchall parameter使這成爲可能而不會強迫您使用**關鍵字參數catch-all。

如果您無法自行更改函數的定義或升級到Python 3,那麼你唯一的辦法就是再次指定默認值,或(使用inspect.getargspec() convenience function)從功能檢索它們:

import inspect 

defaults = inspect.getargspec(foo).defaults 
foo(*(defaults + (1,2,3))) 

defaults這裏是關鍵字參數默認值的元組。

演示:

>>> import inspect 
>>> def foo(a='spam', b='foo', *args): 
...  print a, b, args 
... 
>>> defaults = inspect.getargspec(foo).defaults 
>>> foo(*(defaults + (1,2,3))) 
spam foo (1, 2, 3) 
+0

不回答我的問題。 我無法更改函數簽名或函數內部的內容。 – mkorpela 2013-03-21 15:17:47

+0

@mkorpela:這就是你將不得不這樣做的工作。 – 2013-03-21 15:18:31

+0

@mkorpela然後你必須做的:'foo(MyComplexObject(),Something(),*(1,2,3)) – 2013-03-21 15:20:04