Передача аргументов именованных переменных в python - PullRequest
12 голосов
/ 09 сентября 2008

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

def methodA(arg, **kwargs):
    pass

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

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

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

Как мне убедиться, что ** kwargs в methodA передается как ** kwargs в methodB?

Ответы [ 3 ]

33 голосов
/ 09 сентября 2008

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

methodB("argvalue", **kwargs)
2 голосов
/ 15 сентября 2008

В качестве отступления: при использовании функций вместо методов вы также можете использовать 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")

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

1 голос
/ 09 сентября 2008

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

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

Кажется очевидным сейчас ...

...