372

関数の引数の裸のアスタリスクは何をしますか?

ピクルスモジュールを見ると、次のように見えます。

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

引数の前にある単一および二重のアスタリスク(可変数の引数の場合)については知っていますが、これは何の前にもありません。そして、これはピクルスとは何の関係もないと私は確信しています。それはおそらくこれが起こっている一例にすぎません。私はこれを通訳に送ったときにだけその名前を知りました:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

重要な場合は、Python3.3.0を使用しています。

4

6 に答える 6

334

Bare*は、呼び出し元に名前付き引数の使用を強制するために使用されます。したがって*、後続のキーワード引数がない場合、引数として関数を定義することはできません。

詳細については、この回答またはPython3のドキュメントを参照してください。

于 2013-01-13T08:50:58.730 に答える
98

元の回答は質問に完全に答えますが、関連情報を少し追加するだけです。単一のアスタリスクの動作は、から派生しPEP-3102ます。関連セクションの引用:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

    def compare(a, b, *, key=None):
        ...

簡単な英語では、キーの値を渡すには、明示的にとして渡す必要があることを意味しますkey="value"

于 2016-09-02T04:16:24.207 に答える
49
def func(*, a, b):
    print(a)
    print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

**kwargsを使用した上記の例

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
于 2018-10-22T19:20:12.010 に答える
32

意味的には、それに続く引数はキーワードのみであることを意味するため、名前を指定せずに引数を指定しようとするとエラーが発生します。例えば:

>>> def f(a, *, b):
...     return a + b
...
>>> f(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 2 were given
>>> f(1, b=2)
3

実用的には、キーワード引数を使用して関数を呼び出す必要があることを意味します。これは通常、引数の名前で示されるヒントがないと、引数の目的を理解するのが難しい場合に行われます。

sorted(nums, reverse=True)たとえば、あなたが書いた場合と比較してくださいsorted(nums, True)。後者は読みにくくなるため、Python開発者は前者の方法で作成することを選択しました。

于 2019-11-25T04:12:31.110 に答える
23

あなたが機能を持っているとしましょう:

def sum(a,key=5):
    return a + key 

この関数は、次の2つの方法で呼び出すことができます。

sum(1,2)またsum(1,key=2)

sumキーワード引数のみを使用して関数を呼び出すとします。

関数パラメーターリストに追加*して、位置引数の終わりをマークします。

したがって、関数は次のように定義されます。

def sum(a,*,key=5):
    return a + key 

を使用してのみ呼び出すことができますsum(1,key=2)

于 2019-11-01T13:14:20.333 に答える
-2

私は次のリンクが説明するのに非常に役立つことを発見しました**argsそして**kwargs

https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

基本的に、上記の回答に加えて、上記のサイト(クレジット:https ://pythontips.com/author/yasoob008/ )から次のことを学びました。

以下で最初に定義されたデモンストレーション関数では、2つの例があります*args**kwargs

def test_args_kwargs(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

したがって*args、フィードされた順序で取得される引数のリストを動的に作成できますが**kwargs、NAMED引数の受け渡しを有効にし、それに応じて(フィードされた順序に関係なく)NAMEで処理できます。 。

サイトは継続し、引数の正しい順序は次のようになっている必要があることに注意してください。

some_func(fargs,*args,**kwargs)
于 2019-05-05T10:07:59.900 に答える