2016-07-05 8 views
2

Ich habe eine Funktion habe, die wie folgt aussieht:Passing Schlüsselwörter rekursiv

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

ich Keyword-Argumente möchte in der Lage zu durchlaufen, so dass die inneren Bits wissen, was zu tun ist.

Ich werde wie das alles mit etwas nennen:

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

ich die letzteren Teile möchten durch, um die Preise zu gehen. Es wird mehrere Ebenen in meinem Code durchlaufen.

Mache ich das richtig? Es scheint dann unmöglich zu sein, Standard-Schlüsselwortarg zu setzen.

So folgt aus:

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

funktioniert nicht, wenn ccy_index=False in **kw geben wird - es denkt noch ccy_index=True

Diese Strategie ist ein Chaos, und ich bin besorgt es spröde ist. Was ich wollte, war eine Reihe von globalen Optionen, bei denen alle verschiedenen Bits des Codes ihre relevanten Bits herausheben oder sonst wie in der Funktion konfiguriert werden konnten. Mit anderen Worten, wie Schlüsselwortargumente, aber rekursiv definiert.

+0

Ich glaube nicht, ich bin nach Ihrem „wird nicht funktionieren“ Szenario - könnten Sie eine richtige SSCCE zur Verfügung stellen? –

Antwort

1

Ich glaube, das tut, was Sie wollen:

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

Auf diese Weise Sie Argumente um rekursiv über **kw passieren kann und auch Ausfälle in jeder Phase zugeordnet.

Mit dem obigen Code:

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

Das ist wirklich sehr elegant, ich liebe es! Vielen Dank! :) – cjm2671