Передача именованных переменных в python

Скажем, у меня есть следующие методы:

def methodA(arg, **kwargs):
    pass

def methodB(arg, *args, **kwargs):
    pass

В методе A я хочу называть метод B, передавая kwargs. Однако кажется, что если я определяю methodA следующим образом, второй аргумент будет передаваться как позиционный, а не именованный аргумент переменной.

def methodA(arg, **kwargs):
    methodB("argvalue", kwargs)

Как я могу убедиться, что ** kwargs в методе A передается как ** kwargs в метод B?

Ответ 1

Поместите звездочки перед переменной kwargs. Это заставляет Python передавать переменную (которая считается словарем) в качестве аргументов ключевого слова.

methodB("argvalue", **kwargs)

Ответ 2

В стороне: при использовании функций вместо методов вы также можете использовать functools.partial:

import functools

def foo(arg, **kwargs):
    ...

bar = functools.partial(foo, "argvalue")

В последней строке будет определена функция "bar", которая при вызове вызовет foo с первым аргументом, установленным в "argvalue" и всеми остальными функциями, которые просто передаются:

bar(5, myarg="value")

вызовет

foo("argvalue", 5, myarg="value")

К сожалению, это не будет работать с методами.

Ответ 3

Некоторые эксперименты, и я понял это:

def methodA (arg, ** kwargs):   methodB ( "argvalue", ** kwargs)

Теперь кажется очевидным...