技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

pythonのargsとkwargsの使い方色々

※実行環境 python3.6

########### 基本的なargs
def argsfunc(*args):
    return args[0] + args[1]
print(argsfunc(1,2))
# print(argsfunc(dog=1, cat=2)) 引数名を与えるとargsとして認識してくれない

########### 基本的なkwargs
def kwargsfunc(**kwargs):
    return kwargs["a"] + kwargs["b"]
print(kwargsfunc(a=1,b=2))

def multifunc(*args, **kwargs):
    return args[0] + args[1] + kwargs["a"]
print(multifunc(1,2,a=3,b=4))

########### デフォルト引数と併用するケース
def multifunc2(first, second=0, *args, **kwargs):
    return first + second + args[0] + kwargs["a"]
print(multifunc2(1,2,3,a=4)) #>10
# print(multifunc2(1, second=2, 3, a=3)) #ダメ。変数指定して渡すのは全て後に書かないといけない

def multifunc2_2(first, *args, second=0, **kwargs):
    print("second: {}".format(second), end="| ")
    return first + second + args[0] + kwargs["a"]
print(multifunc2_2(1, 3, second=2, a=3)) 
print(multifunc2_2(1, 3, 2, a=3)) #>7 #3番目の引数はsecond=2のつもりなのにargs[1]として認識されてしまう


def multifunc3(first, second=0, **kwargs):
    return first + second + kwargs["a"]
print(multifunc3(1,2,a=3))
print(multifunc3(1,second=2,a=3))


############ キーワードが重複するケース # 定義だけではエラーにならない。呼び出そうとするとTypeError
def duplicate_kwargs(first, second=0, **kwargs):
    return first + second + kwargs["first"]
# print(duplicate_kwargs(1,2,first=3)) 
# >TypeError: duplicate_kwargs() got multiple values for argument 'first'

############ 可変長引数の重複はSyntaxError
# def kwargs_duplicate(**kw1, **kw2):
#    return kw1["a"] + kw1["b"] + kw2["a2"]

############ 可変長引数が引数の前に来るのはSyntaxError
# def kwargs_head(**kw1, second=0):
#    return first + second + kw1["a"]

############ argsを先に使うと、後ろの変数は全て変数指定して渡さないといけなくなる
def args_head(*args, first, second=0):
    return first + args[0] + second
# print(args_head(3,1,2)) #変数名を指定しない場合全部argsとして認識されるのでfirstが無いと怒られる
print(args_head(3,first=1,second=2)) #OK