2017-05-12 8 views
-2

Ich habe ein Programm, das eine Funktion mit vielen Schlüsselwortargumenten verwendet, die alle standardmäßig None sind, und hoffte, dass es einen besseren Weg gab, als nur jeden zuzuweisen. Dies ist die Funktionsdeklaration:Kann ich mehrere Schlüsselwortargumente einem Wert zuweisen?

def __init__(self, includes=None, main=None, 
        functions=None, classes=None, 
        lambdas=None, variables=None, 
        values=None): 

Wie Sie sagen, dies ist ziemlich lang und ich hatte gehofft, es ist die so etwas wie

def __init__(self, includes=main=functions=classes=lambdas=variables=values=None): 

ist viel kürzer und einfacher zu schreiben.

Kann jemand das beantworten? Es wäre wirklich hilfreich.

+0

Ich glaube nicht, dass du das kannst, zumindest habe ich es nie gesehen – TallChuck

+3

Dies ist eine Zeit, wo es wahrscheinlich besser ist, '** kwargs **' zu verwenden. –

+0

Sie können syntaktisch nicht. Funktionsschlüsselwortargumente bestehen aus einer Reihe von Schlüsselwortelementen, die die Form "Name = Wert" haben. –

Antwort

2

Ich erwähnte in einem Kommentar, dass dies ist, wenn Sie wirklich bevorzugen sollten **kwargs. Es ist ein Wörterbuch, das alle genannten Argumente abfängt, die Sie an die Funktion übergeben. Hier ist, wie Sie verwenden würde:

def __init__(self, **kwargs): 
    if includes in kwargs: 
     do_something() 
    if main in kwargs: 
     do_something_else() 
    ... 

Handle jedes Argument die gleiche Art und Weise Sie in der Regel diese verwenden würde:

if includes is not None: 
    do_something() 
if main is not None: 
    do_something_else() 
... 

Was Sie gefragt haben syntaktisch nicht möglich ist (und nichts ähnlich existiert), aber dies erreicht das gleiche semantische Ergebnis.

3

Sie können einfach nicht, es ist ein Syntaxfehler.

Verwenden Sie stattdessen **kwargs, wie @aryamccarthy vorschlägt.

können Sie überprüfen, ob Sie nur Namen akzeptieren Sie wollen:

def foo(**kwargs): 
    known_args = set(['pizza', 'burger', 'sausage']) 
    extra_args = set(kwargs) - known_args 
    if extra_args: 
    raise ValueError('Unknown argument names: %r' % extra_args) 
    # proceed as normal 
0

Sie eine neue Variable, dass die Verwendung einstellen könnte, um gleich None, und dann:

a = None 
def __init__(self, includes=a, main=a, functions=a, classes=a, lambdas=a, variables=a, values=a): 

Was es erheblich verkürzen würde, Ansonsten ist es nicht möglich.

Verwandte Themen