2016-07-05 5 views
2

У меня есть функция, которая выглядит следующим образом:Попутных ключевых слов рекурсивны

def bootstrap(instrument, parallel_process=True, **kw): 
    prices = instrument.prices(**kw) 

Я хочу, чтобы иметь возможность пройти через именованные аргументы, так что внутренние биты знают, что делать.

Я буду называть все это что-то вроде:

bootstrap(my_instrument, parallel_process=True, key1=True, key2=45) 

Я хотел бы последние части, чтобы пройти к ценам. Он пройдет через несколько слоев в моем коде.

Я делаю это правильно? Кажется, тогда невозможно установить аргументы ключевого слова по умолчанию.

Так что:

def prices(ccy_index=True, **kw): 
    print(ccy_index) 

не будет работать, когда ccy_index=False передается в **kw - он все еще думает, что ccy_index=True

Эта стратегия является беспорядок, и я обеспокоен тем, что это хрупкое. То, что я хотел, - это набор глобальных опций, в которых все разные биты кода могут вывести из строя соответствующие биты или иным образом по умолчанию установить что-то в этой функции. Другими словами, как и аргументы ключевого слова, но определенные рекурсивно.

+0

Я не думаю, что я после вашего «будет работать не» сценарий - не могли бы вы предоставить надлежащую SSCCE? –

ответ

1

Я считаю, что это делает то, что вы хотите:

def prices(**kw_in): 
    kw = dict(ccy_index=True) # Defaults 
    kw.update(kw_in) 
    print(kw["ccy_index"]) 

Таким образом, вы можете передать аргументы вокруг рекурсивно через **kw, а также присвоены значения по умолчанию на каждом этапе.

Используя приведенный выше код:

>>> prices() 
True 
>>> prices(ccy_index=True) 
True 
>>> prices(ccy_index=False) 
False 
+1

Это действительно довольно элегантно, мне это нравится! Спасибо! :) – cjm2671

Смежные вопросы