2013-12-23 4 views
0

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

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

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

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

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

+0

Использование декоратора функций – volcano

+5

Что именно вы подразумеваете под * это не сработает *? – alko

+1

По ** необязательно ** вы имеете в виду, что хотите использовать 'p2' в качестве аргумента только для ключевого слова? Если это так, попробуйте: [Python 2.x - аргументы по умолчанию с * args и ** kwargs] (http://stackoverflow.com/q/15301999/846892) –

ответ

1

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

outer2 = functools.partial(outer, p2=None) 
1

Если вы просто хотите, чтобы убедиться, что 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) 

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