def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
関数呼び出しでaまたはbを指定せずfoo
に、* argsを指定して呼び出す方法はありますか?したがって、デフォルト値を使用しますか?
何かのようなもの
foo(*args=(1,2,3))
これは純粋に好奇心からです。
def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
関数呼び出しでaまたはbを指定せずfoo
に、* argsを指定して呼び出す方法はありますか?したがって、デフォルト値を使用しますか?
何かのようなもの
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 2では、これらのキーワードを位置引数で埋めることができないことを指定する方法がないため、Pythonは最初に2つのキーワード引数を埋めます。
Python 3は、位置的なcatchallパラメーターの解釈を変更して**
、キーワードパラメーターcatch-allを使用せずにこれを可能にしました。
関数定義を自分で変更したり、Python 3にアップグレードしたりできない場合、唯一の手段は、デフォルトを再度指定するか、関数からデフォルトを取得することです(inspect.getargspec()
便利な関数を使用)。
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)