web-dev-qa-db-ja.com

Python:kwargsと共に名前でパラメーターを渡す

pythonでこれを行うことができます:

def myFun1(one = '1', two = '2'):
    ...

次に、関数を呼び出して、名前で引数を渡します。

myFun1(two = 'two', one = 'one')

また、これを行うことができます:

def myFun2(**kwargs):
    print kwargs.get('one', 'nothing here')

myFun2(one='one')

だから私は次のように両方の方法を組み合わせることが可能かどうか疑問に思っていました:

def myFun3(name, lname, **other_info):
    ...

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')

一般的に、どのような組み合わせができますか?

私のばかげた質問に感謝し、申し訳ありません。

30
CodeArtist

一般的な考え方は次のとおりです。

_def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs):
    ...
_

必要な数だけ使用できます。 _*_および_**_は、他の方法では考慮されない残りの値をすべて吸収します。

位置引数(デフォルトなしで提供)をキーワードで指定することはできません。デフォルト以外の引数は、デフォルト引数の後に続けることはできません。

注Python 3は、キーワードのみの引数を_*_の後に置くことで、キーワードのみの引数を指定する機能も追加します。

_def func(arg1, arg2, *args, kwonlyarg=default):
    ...
_

_*_を単独で使用することもできます(def func(a1, a2, *, kw=d):)。つまり、引数はキャプチャされませんが、その後はキーワードのみになります。

したがって、3.xを使用している場合は、次のようにして必要な動作を生成できます。

_def myFun3(*, name, lname, **other_info):
    ...
_

これにより、nameおよびlnameをキーワードのみとして呼び出すことができます。

これは珍しいインターフェースであり、ユーザーに迷惑をかける可能性があることに注意してください-私は非常に特定のユースケースでのみ使用します。

2.xでは、_**kwargs_を解析して手動で作成する必要があります。

27
Gareth Latty

呼び出し関数でキーが使用可能な場合は、名前付き引数をkwargsとともに追加できます。名前付き引数が使用されます。それ以外の場合は、kwargs辞書が使用します

def add(a=1, b=2,**c): res = a+b for items in c: res = res + c[items] print(res)

add(2,3)

5

add(b=4, a =3)

7

add(a =1,b=2,c=3,d=4)

10

ブロッククォート

0

少なくともPython 2.7の場合は可能です。キーワード引数は名前で位置パラメータに割り当てられるので、

In [34]: def func(name, lname, **kwargs):
    print 'name='+name, 'lname='+lname
    print kwargs
   ....:     

In [35]: func(lname='lname_val', name='name_val', city='cityName', otherInfo='blah')
name=name_val lname=lname_val
{'city': 'cityName', 'otherInfo': 'blah'}

「キーワード引数が存在する場合、次のように、最初に位置引数に変換されます。最初に、仮パラメーター用の埋められていないスロットのリストが作成されます。N個の位置引数がある場合、それらは最初のNスロット。次に、各キーワード引数について、識別子を使用して対応するスロットを決定します(識別子が最初の仮パラメーター名と同じ場合は、最初のスロットが使用される、など)。スロットがすでに入力されている場合はTypeError例外が発生します。それ以外の場合は、引数の値がスロットに配置され、入力されます(式がNoneの場合でも、スロットが入力されます)。 https://docs.python.org/2/reference/expressions.html#calls

0
user2745509