「キーワード引数」は通常の引数とどう違うのですか?name=value
位置構文を使用する代わりにすべての引数を渡すことはできませんか?
「キーワード引数」は通常の引数とどう違うのですか?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'}
kwargs
必要がありますか、それともsthに名前を変更できます。options
(def my_fuction(arg1, arg2, **options)
)のように?
kwargs
区別が重要な最後の言語機能が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'}
これらの機能はめったに使用されませんが、場合によっては非常に役立つため、どの引数が位置またはキーワードであるかを知ることが重要です。
*positional
、**keywords
その前に必要な位置引数を渡すことができることに注意してくださいdef foo(arg1, *positional, **keywords):
。これarg1
は定位置で必須です。答えの位置は、オプションの可変数の位置引数を意味することに注意してください。
foo(bar=True)
値を使用して値を取得できます。デフォルト値には、bar = keywords.pop('bar')
bar = keywords.pop('bar', None)
bar = keywords.pop('bar', False)
彼らの前にはキーワードがありません。順序は重要です!
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)
func("bar", 5)
?そして、それhello
がデフォルト値のを取得するとします3
。
関数パラメーターに引数値を割り当てる方法は2つあり、どちらも使用されます。
ポジション別。定位置引数にはキーワードがなく、最初に割り当てられます。
キーワード別。キーワード引数にはキーワードがあり、位置引数の後に2番目に割り当てられます。
位置引数を使用するオプションがあることに注意してください。
場合あなたは、位置引数を使用していない、そして-はい-すべてはあなたはキーワード引数であることをターンを書きました。
関数を呼び出すときは、位置、キーワード、またはそれらの組み合わせを使用することを決定します。必要に応じて、すべてのキーワードを選択できます。一部の人はこの選択をせず、位置引数を使用します。
キー付き引数パラメーターのディクショナリーを渡すことができ、そのような仮パラメーターを満足させることができることを誰も指摘していないように私は驚いています。
>>> 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
>>>
, **kwargs
。これは、パラメーターの数が固定されている単純なfunc defでも、辞書を提供できることを示しています。つまり、定義に特別なことは何も必要ありません。次に、2番目の例として、定義にWITH ** kwargsを追加し、それを介してディクショナリ内の追加のアイテムがどのように利用できるかを示します。
print 'a:%s, b:%s, c:%s' % (a, b, c)
は構文エラーを出しますが、print('a:%s, b:%s, c:%s' % (a, b, c))
うまくいきます。Pythonバージョンで何か?この洞察のためとにかくおかげで、今まで、私はより多くの不格好使用していたprint('a:{}, b:{}, c:{}'.format(a, b, c))
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'`
これは、特に同じタイプの引数が多数ある場合に役立ちます。その場合、名前付き引数を使用するか、引数が一緒に属する場合はカスタムクラスを作成します。
andを使用して*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])
これにより、事前に定義したくないキーを持つ可能性のある任意のキーワード引数を使用できます。
タイプアノテーションを使用してデフォルトのクワーグを持つ例を探していました:
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 {}
関数を呼び出すときにキーワードに割り当てられていない引数のデフォルト値を定義する方法を補足/追加するだけです:
def func(**keywargs):
if 'my_word' not in keywargs:
word = 'default_msg'
else:
word = keywargs['my_word']
return word
これを呼び出す:
print(func())
print(func(my_word='love'))
あなたが得るでしょう:
default_msg
love
詳細*args
と**kwargs
pythonを読む:https : //www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3