def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
指定默認值參數的方法是有沒有辦法來調用foo
與指定*指定參數和不在函數調用指定a或b - 因此利用有默認值?是否有訪問可變參數沒有在Python
喜歡的東西
foo(*args=(1,2,3))
這純粹是出於好奇。
def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
指定默認值參數的方法是有沒有辦法來調用foo
與指定*指定參數和不在函數調用指定a或b - 因此利用有默認值?是否有訪問可變參數沒有在Python
喜歡的東西
foo(*args=(1,2,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)
不回答我的問題。 我無法更改函數簽名或函數內部的內容。 – mkorpela 2013-03-21 15:17:47
@mkorpela:這就是你將不得不這樣做的工作。 – 2013-03-21 15:18:31
@mkorpela然後你必須做的:'foo(MyComplexObject(),Something(),*(1,2,3)) – 2013-03-21 15:20:04
IIRC,在這個例子中'A'&'B'僅實例化一次,因此它是一樣'default_a = MyComplexObject()','DEF FOO(A = default_a) :'; args在python 2.7中也出現在kwargs之前。 – 2013-03-21 15:29:17