「キーワード引数」は通常の引数とどう違うのですか。すべての引数を位置構文ではなくname=value
として渡すことはできませんか?
2つの関連概念があり、両方とも「キーワード引数」と呼ばれます。
他のコメント投稿者が述べていることである呼び出し側では、名前でいくつかの関数引数を指定することができます。名前なしのすべての引数(位置引数)の後にそれらを記述する必要があります。また、まったく言及されていないパラメーターにはデフォルト値がなければなりません。
もう1つの概念は関数定義側です。名前でパラメータを受け取る関数を定義することができます - そしてそれらの名前が何であるかを指定する必要すらありません。これらは純粋なキーワード引数であり、位置的に渡すことはできません。構文は次のとおりです。
def my_function(arg1, arg2, **kwargs)
この関数に渡すキーワード引数はすべて、kwargsという名前の辞書に入れられます。実行時にこの辞書のキーを調べることができます。
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
区別が重要な最後の言語機能が1つあります。次の関数を考えてください。
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
*positional
引数は、foo()
に渡されるすべての位置引数を格納します。ただし、指定できる数に制限はありません。
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
**keywords
引数はすべてのキーワード引数を格納します。
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
もちろん、両方を同時に使用することもできます。
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
これらの機能はめったに使用されませんが、時折それらは非常に便利です、そしてどの引数が位置的またはキーワードであるかを知ることは重要です。
キーワード引数を使用することは、順序が重要でないことを除けば、通常の引数と同じです。たとえば、以下の2つの関数呼び出しは同じです。
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
それらの前にキーワードはありません。順番は重要です!
func(1,2,3, "foo")
彼らは前部にキーワードを持っています。それらは任意の順序でありえます!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
また、デフォルトの引数を使用してキーワードの挿入を怠ると、順番が重要になることを知っておく必要があります。
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
引数値を関数パラメータに割り当てる方法は2つあります。どちらも使用されます。
位置によって。位置引数にはキーワードがなく、最初に割り当てられます。
キーワードで。キーワード引数はキーワードを持ち、位置引数の後に2番目に割り当てられます。
あなたには位置引数を使用するオプションがあります。
yo位置引数を使用しない場合、 - はい - すべてyo wroteはキーワード引数となります。
あなた関数を呼び出すときには、位置またはキーワード、あるいはその両方を使用することを決定します。必要に応じてすべてのキーワードを選択することができます。私たちの何人かはこの選択をせずに位置引数を使います。
私は誰もがそのように正式なパラメータを満たす、キー付き引数パラメータの辞書を渡すことができると指摘していないように思われることに驚いています。
>>> def func(a='a', b='b', c='c', **kwargs):
... print 'a:%s, b:%s, c:%s' % (a, b, c)
...
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>>
Python 3を使うと、必須キーワードと不要キーワードの両方を持つことができます 引数 :
オプション:(デフォルト値 'b'に定義)
def func1(a, *, b=42):
...
func1(value_for_a) # b is optional and will default to 42
必須( 'b'にデフォルト値は定義されていません):
def func2(a, *, b):
...
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`
これは、特に同じ型の場合に、互いに類似した引数が多数ある場合に役立ちます。その場合は、名前付き引数を使用するか、引数が一緒に属する場合はカスタムクラスを作成します。
*args
と**kwargs
( このサイトから )を使ってこのような卑劣なことをするために位置引数とキーワード引数を混在させることができるという事実に誰も言及していません。
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
これにより、事前に定義したくないキーを持つ可能性のある任意のキーワード引数を使用できます。
型注釈を使用してデフォルトのkwargsを持つ例を探していました。
def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
return ' '.join([a, b, c, str(kwargs)])
例:
>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}