Оберните функцию python, но пусть внешняя функция имеет ключевое слово arg

Я хотел бы иметь возможность обернуть функцию, но при этом разрешить необязательные (ключевые слова) аргументы во внешней функции. Я могу сделать это:

def outer(p1, p2, *a, **k):
     inner(*a, **k)

но что, если я хочу, чтобы p2 был «необязательным аргументом»? Очевидно:

def outer(p1, p2=None, *a, **k):
     inner(*a, **k)

не сработает, и я знаю, почему это не сработает. Мне интересно, есть ли хороший, чистый способ добиться этого. Есть ли какой-то известный шаблон или соглашение?


person Captain Midday    schedule 23.12.2013    source источник
comment
Используйте декоратор функций   -  person volcano    schedule 23.12.2013
comment
Что именно вы подразумеваете под это не сработает?   -  person alko    schedule 23.12.2013
comment
Под необязательным вы подразумеваете, что хотите использовать p2 в качестве аргумента только для ключевого слова? Если это так, попробуйте: Python 2.x - аргументы по умолчанию с *args и **kwargs   -  person Ashwini Chaudhary    schedule 23.12.2013
comment
просто интересно, почему ты не можешь привести все аргументы *a или **k   -  person Anuj    schedule 23.12.2013


Ответы (2)


Используйте модуль functools:

outer2 = functools.partial(outer, p2=None)
person mguijarr    schedule 23.12.2013

Если вы просто хотите убедиться, что p2 присутствует, когда аргументы передаются от внешнего к внутреннему:

 def outer(p1, *a, **k):
     if 'p2' not in k: k.update(p2 = None)
     inner(*a, **k)

для более общего способа вы можете сохранить значения по умолчанию и применять их при необходимости:

def outer (p1, *args, **kwargs):
    defaults = {'a': 1, 'b':2}
    for k, v in defaults.items():
        if k not in kwargs: kwargs[k] = v
    inner(*a, **k)

Если это так, вы можете отредактировать заголовок своего сообщения на что-то вроде «как включить значения по умолчанию в ** аргументы kwargs», поскольку упаковка на самом деле не является частью синтаксиса.

person theodox    schedule 23.12.2013