通常の引数とキーワード引数


289

「キーワード引数」は通常の引数とどう違うのですか?name=value位置構文を使用する代わりにすべての引数を渡すことはできませんか?


6
また、PEP 3102を読みたいと思うかもしれません-彼らはPython 3でこのようなものを片付けています。参照:python.org/dev/peps/pep-3102
Ben Hoyt

そして、デフォルト値があるかどうかはそれとは関係ありません(値を渡す必要があるかどうかを除いて)、そうですか?
mk12


@Ben Hoytは、Python 3に必要なキーワード引数をカバーする以下の回答を追加しました
Christophe Roussy

回答:


346

キーワード引数」と呼ばれる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'}

5
+1して承認:両方のタイプの位置+キーワードの引数について話し合ったのはあなただけです。他の誰もが、私が最初または2番目のことを話していると思っていました(ただし、それでも良い投稿でした)。ありがとう!
mk12

34
言い回しは不明確です。通常、呼び出し側の引数について話しますが、呼び出し側のパラメータについて話します。
glglgl 2012年

3
パラメータ名はであるkwargs必要がありますか、それともsthに名前を変更できます。optionsdef my_fuction(arg1, arg2, **options))のように?
Bruce Sun

1
名前は何でもkwargs
Matt Zimmerman

ここで説明する2番目の概念は、技術的には任意キーワード引数と呼ばれていると思います。
Anshul Dahiya

188

区別が重要な最後の言語機能が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'}

これらの機能はめったに使用されませんが、場合によっては非常に役立つため、どの引数が位置またはキーワードであるかを知ることが重要です。


3
正解です。のように関数定義を変更する場合は*positional**keywordsその前に必要な位置引数を渡すことができることに注意してくださいdef foo(arg1, *positional, **keywords):。これarg1は定位置で必須です。答えの位置は、オプションの可変数の位置引数を意味することに注意してください。
shaffooo

2
はいいい答え。別のメモ:関数を呼び出すと、と同じfoo(bar=True)値を使用して値を取得できます。デフォルト値には、bar = keywords.pop('bar')bar = keywords.pop('bar', None)bar = keywords.pop('bar', False)
olibre

111

キーワード引数の使用は、順序が問題ではないことを除いて、通常の引数と同じです。たとえば、以下の2つの関数呼び出しは同じです。

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

3
これをありがとう。それは私ができることを非常に便利です、両方の位置引数としてキーワード引数を指定する、Aのキーワード引数として位置引数。
ルークデイビス

47

位置引数

彼らの前にはキーワードがありません。順序は重要です!

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)

8
私見、3番目の例(デフォルトの引数)は明確ではありません。1つ以上のパラメーターがデフォルト値を宣言し、呼び出しが位置表記を使用しているが、宣言されたパラメーターの数よりも少ない場合に何が起こるかについて話していると思います。ただし、例では3つが宣言され、3つが呼び出しに含まれているため、デフォルト値はまったく影響しません。3番目の引数を省略するつもりでしたか?例えばfunc("bar", 5)?そして、それhelloがデフォルト値のを取得するとします3
ToolmakerSteve

25

関数パラメーターに引数値を割り当てる方法は2つあり、どちらも使用されます。

  1. ポジション別。定位置引数にはキーワードがなく、最初に割り当てられます。

  2. キーワード別。キーワード引数にはキーワードがあり、位置引数の後に2番目に割り当てられます。

位置引数を使用するオプションがあることに注意してください

場合あなたは、位置引数を使用していない、そして-はい-すべてはあなたはキーワード引数であることをターンを書きました。

関数呼び出すときは、位置、キーワード、またはそれらの組み合わせを使用することを決定します。必要に応じて、すべてのキーワードを選択できます。一部の人はこの選択をせず、位置引数を使用します。


1
おお、私はパラメータのことを考えていました。それが実際には引数(私が渡すもの)であるときです。ありがとう!
mk12 09/09/14

24

キー付き引数パラメーターのディクショナリーを渡すことができ、そのような仮パラメーターを満足させることができることを誰も指摘していないように私は驚いています。

>>> 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
>>> 

11
+1は便利なテクニックです。なしであなたのポイントはより明確になります, **kwargs。これは、パラメーターの数が固定されている単純なfunc defでも、辞書を提供できることを示しています。つまり、定義に特別なことは何も必要ありません。次に、2番目の例として、定義にWITH ** kwargsを追加し、それを介してディクショナリ内の追加のアイテムがどのように利用できるかを示します。
ToolmakerSteve、

1
これがさまざまなライブラリのソースコードで発生するのを見て、混乱しました。片付けてくれてありがとう!
Craig Labenz

3
上記の4番目の仮パラメーター-「a」、「b」、「c」以外のキーを含むディクショナリーでfuncを呼び出す場合は、** kwargsが必要です。
Eduardo

私にとって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))
アクセルBregnsbo

17

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'`

これは、特に同じタイプの引数が多数ある場合に役立ちます。その場合、名前付き引数を使用するか、引数が一緒に属する場合はカスタムクラスを作成します。


3
必要な変形は非常に便利です。デフォルトを提供せずに名前で引数を与えることを強く勧めますが、これは意味がありません。
TNT

デフォルト値は見栄えがよく、開始時に時間を節約できますが、長期的にはデフォルト値がPITAになることがあります。
クリストフ・ルシー

11

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])

これにより、事前に定義したくないキーを持つ可能性のある任意のキーワード引数を使用できます。


0

タイプアノテーションを使用してデフォルトのクワーグを持つ例を探していました:

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 {}

0

関数を呼び出すときにキーワードに割り当てられていない引数デフォルト値を定義する方法を補足/追加するだけです

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**kwargspythonを読む:https : //www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.