ホリバーがありましょう!args / kwargsを使用するか、使用しないかは、プロフェッショナリズムまたは基本的な知識の指標であり、それなしでは恥ずべきことですか?多くの場合、さまざまなプロジェクトのgithubをめくって、関数にこれらの引数が存在することに遭遇します。そして、この記事は私にこのトピックについて話すように促しました。一般的に、私は実際には制御されていない議論を使用しないようにしていますが、このプログラミング方法はどのくらい一般的ですか?コメントで共有します。そして、あなたの読書をお楽しみください。
, *args
**kwargs
Python. , , . , .
!
. , , , .
?
Python :
, .
, .
def foo(start, end):
print(start, end)
, foo ('Hi', end = 'Bye!')
"Hi"
"Bye!"
, end
foo
. ; , , . .
*args
. *
- . .
def foo(*args):
print(type(args))
for arg in args:
print(arg)
foo(1, 2, 'end')
# <class 'tuple'>
# 1
# 2
# end
, **kwargs
. , .
def foo2(**kwargs):
print(type(kwargs))
for keyword, value in kwargs.items():
print(f'{keyword}={value}')
foo2(a=1, b=2, z='end')
# <class 'dict'>
# a=1
# b=2
# z=end
*args
**kwargs
. , ?
, , , .
, . - Python
- ?
: , . , , . , , , , , ..
, *args
/ **kwargs
, , , .
, . , , .
, Python , , , .
次の例では
、ヘルスチェックとして実行されている関数の名前を出力するものを作成します。デコレータは、@trace
以下に示すように、関数の上を使用して関数に適用されます。このデコレータを任意の数の引数を持つ任意の関数に適用するため*args
、とを使用する必要があり**kwargs
ます。
def trace(func):
def print_in(*args, **kwargs):
print('Executing function', func.__name__)
return func(*args, **kwargs)
return print_in
@trace
def calc(a,b):
print(f'a+b is {a+b}, a-b is {a-b}.')
calc(1,2)
# Executing function calc
# a+b is 3, a-b is -1.
@trace
def add_all(*args):
print(reduce(lambda a,b:a+b, args))
a = add_all(1,2,3,4,5)
# Executing function add_all
# 15
結論
可能であればそれらを避けてください。
args
とkwargs
は単に合意によって呼ばれることに注意してください。あなたはそれらを好きなように呼ぶことができます。まさに力*
を**
与える機能を与えるのは星です。