関数への引数の渡し方として、位置引数とキーワード引数がある。
位置引数
引数を記載する順序で引数を指定
キーワード引数
キーワードで引数を指定
Example
def def_sample(animal,food):
print(animal)
print(food)
位置引数で関数に引数を渡す場合
def_sample('gorilla','banana')
引数の位置関係(1つめが animal 2つめが food)で引数を指定している。
キーワード引数で関数に引数を渡す場合
def_sample(animal='gorilla',food='banana')
関数側での引数の渡し方の制御
強制された引数の渡し方でないとエラーとなる。
位置引数渡しを強制する場合は、関数の宣言時に/
を引数の末尾に含める
def positional_arg(animal,food, /):
print(animal)
print(food)
キーワード引数渡しを強制する場合は、関数の宣言時に*
を引数の先頭に含める
def keyword_arg(*,animal,food):
print(animal)
print(food)
複合型
def combined_arg(animal1,animal2,/,*,food1,food2):
print(animal1,animail2)
print(food1,food2)
animal1,animal2 → 位置引数を強制
food1,food2 → キーワード引数を強制
キーワードの衝突
def foo(gorilla,**kwds):
return 'gorilla' in kwds
この場合、辞書**kwds
のKey
に'gorilla'
を使うことはできない。
引数のキーワード:gorilla
と、辞書**kwds
のKey
の'gorilla'
が衝突し、エラーとなる。
>>>foo(1,**{'gorilla':1})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'gorilla'
位置関数を強制すると、1つめの引数をgorilla
と認識し、辞書**kwds
の'gorilla'
をキーワードとして認識される。
def foo(gorilla, /, **kwds):
return 'gorilla' in kwds
>>> foo(1,**{'gorilla':2})
True
いつ使うか
位置引数:引数の名前に意味が無く、順序が重要となる場合。
キーワード引数:引数の名前に意味が有り、それにより関数の定義が明らかになる場合。
任意引数リスト
def concat(*args, sep='/'):
return sep.join(args)
可変引数*args
は、関数に渡される引数すべてを回収するので、可変引数の後におかれる引数は、キーワード引数を強制される。
>>> concat('a','b','c')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: concat() missing 1 required keyword-only argument: 'sep'
>>> concat('a','b','c',sep='.')
'a.b.c'
参考:Guido van Rossum.Python チュートリアル.O'REILLY,第4章