2017-12-08 3 views
1

Beim Schreiben von Funktionen, die andere Unterfunktionen aufrufen, möchte ich dem Aufrufer oft erlauben, beliebige Schlüsselwortargumente für diese Unterfunktionen zu übergeben. Die derzeitige Art und Weise, wie ich dies umsetze, ist jedoch unordentlich und ich suche nach einer klareren, präziseren und wartbaren Art und Weise.Wie übergeben Sie Keyword Args sauber?

Unten ist ein Beispiel dafür, wie ich dies derzeit implementieren:

def foo(a, print_line="Hello World!"): 
    print a, print_line 

def bar(a, number=2, multiple=4): 
    print a, number * multiple 

def baz(a, **kwargs): 
    if "print_line" in kwargs: 
     foo(a, print_line=kwargs["print_line"]) 
    else: 
     foo(a) 

    bar_kwargs = dict() 
    if "number" in kwargs: 
     bar_kwargs["number"] = kwargs["number"] 
    if "multiple" in kwargs: 
     bar_kwargs["multiple"] = kwargs["multiple"] 
    bar(a, **bar_kwargs) 

Dieses Verfahren ist fehleranfällig und ich brauche jede kwarg zu implementieren, die ich zum Ausdruck bringen will. Ich kann manchmal mit foo(a, print_line=kwargs.get("print_line", False) durchkommen, aber ich möchte das Standardargument des Kwargs behalten.

Antwort

0

Einfach. Pass nur die kwargs sich in die Unterfunktion und fügen Sie konkret eine kwargs Variable zu den Unterfunktionen

def foo(a, print_line="Hello World!", **kwargs): 
    print a, print_line 

def bar(a, number=2, multiple=4, **kwargs): 
    print a, number * multiple 

def baz(a, **kwargs): 
    foo(a, **kwargs) 
    bar(a, **kwargs) 

Dies funktioniert, weil jetzt die Unterfunktionen, eine beliebige Anzahl von Keyword-Argumente erhalten können, während die Argumente definieren, sie sind verpflichtet, . Ein Kwarg-Diktat, das wie {'print_line':'test_line', 'number':1,'multiple':2} aussieht, wird daher für beide Funktionen perfekt funktionieren.

Wie Kommentar angefordert:

class SomeoneElsesClass: 
    def someone_elses_function(self, a, foo="bar"): 
    print(foo) 

class MyClass(SomeoneElsesClass): 
    def someone_elses_function(self, a, foo="bar2", **kwargs): 
    super(MyClass, self).someone_elses_function(a, foo) 
+0

Vielen Dank für Ihre Antwort! Gibt es eine Möglichkeit, etwas Ähnliches für Funktionen zu tun, die ich nicht kontrolliere (d. H. Von einer externen Bibliothek)? –

+0

können Sie sie überschreiben. Ich füge ein Beispiel zu meiner Antwort hinzu. – MCBama

0

Statt für jede Unterfunktion in der Hauptfunktion das Schlüsselwort Argumente zu verarbeiten, lassen Sie die Teilfunktionen, die Logik selbst behandeln. Dadurch können Sie in Ihrem Programm eindeutig separate each concern.

def foo(a, **kwargs): 
    print a, kwargs.get('print_line', 'Hello World') 

def bar(a, number=2, multiple=4): 
    print a, kwargs.get('number', 2) * kwargs.get('multiple', 4) 

def baz(a, **kwargs): 
    foo(a, **kwargs) 
    bar(a, **kwargs) 

würden Sie dann baz wie so nennen, nur in bestimmten Keyword Argumentwerte passieren zu müssen, wenn Sie das Schlüsselwort Argument wollen anderen Wert als den Standard haben:

baz('a', print_line='Hello World', number=2, multiple=4) 
# or... 
baz('a', number=2, multiple=4) 
# or... 
baz('a', print_line='Hello World') 
# or... 
baz('a')