2
def foo(a=MyComplexObject(), b=Something(), *args):
    print a, b, args

関数呼び出しでaまたはbを指定せずfooに、* argsを指定して呼び出す方法はありますか?したがって、デフォルト値を使用しますか?

何かのようなもの

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

これは純粋に好奇心からです。

4

1 に答える 1

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)
于 2013-03-21T15:16:36.410 に答える