6

私は次のコードを持っています:

def foo(func, *args, named_arg = None):
    return func(*args)

を返すSyntaxError

  File "tester3.py", line 3
    def foo(func, *args, named_arg = None):
                                 ^

何故ですか?そして、そのように関数を定義することは可能ですか?それは1つの引数()を取り、次に名前付き引数の前funcに変数引数のリストを取りますか?argsそうでない場合、私の可能性は何ですか?

4

4 に答える 4

9

catch-all*argsパラメーターは、明示的な引数の後に指定する必要があります。

def foo(func, named_arg=None, *args):

**kwキャッチオールキーワードパラメータも定義に追加する場合は、パラメータの後に追加する必要があり*argsます。

def foo(func, named_arg=None, *args, **kw):

明示的なキーワード引数とキャッチオール*args引数を混在させると、予期しない動作が発生します。任意の位置引数を使用すると同時に、リストしたキーワード引数に明示的に名前を付けることはできません。

それを超える余分な位置funcは最初に使用さnamed_argれ、位置引数としても機能します。

>>> def foo(func, named_arg = None, *args):
...     print func, named_arg, args
... 
>>> foo(1, 2)
1 2 ()
>>> foo(1, named_arg=2)
1 2 ()
>>> foo(1, 3, named_arg=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for keyword argument 'named_arg'
>>> foo(1, 2, 3)
1 2 (3,)

これは、への2番目の位置引数foo()常にに使用されるためnamed_argです。

Python 3では、*argsパラメータをキーワード引数の前に配置できますが、これには新しい意味があります。通常、キーワードパラメータは、呼び出しシグネチャで位置引数として指定できます(たとえば、に割り当てられてfoo(somefunc, 'argument')いるように関数を呼び出します)。位置引数と名前付き引数の間にまたはプレーンを配置することにより、名前付き引数が位置として使用されないようにします。代わりに呼び出すと例外が発生します。'argument'named_arg*args*foo(somefunc, 'argument')

于 2012-12-11T14:28:07.937 に答える
2

いいえ、Python2ではこの構文は許可されていません。

オプションは次のとおりです。

1)名前付き引数を移動して前に表示します*args

def foo(func, named_arg = None, *args):
   ...

2)使用**kwargs

def foo(func, *args, **kwagrs):
   # extract named_arg from kwargs
   ...

3)Python3にアップグレードします。

于 2012-12-11T14:32:47.747 に答える
1

引数の順序を次のように変更します。

def foo(func, named_arg = None, *args):
    return func(*args)
于 2012-12-11T14:29:21.503 に答える
1

ドキュメントによると、いいえ:

チュートリアルセクション4.7.2は次のように述べています。

関数呼び出しでは、キーワード引数は位置引数の後に続く必要があります。

...そして4.7.3は「任意の引数リスト」について述べています:

可変数の引数の前に、0個以上の通常の引数が発生する可能性があります。

...したがって、3つの引数タイプすべてを使用する場合は、それらが順番に並んでいる必要があります

  1. 位置引数
  2. 名前付き引数
  3. 可変/任意の引数
于 2012-12-11T14:30:24.507 に答える