2016-08-02 20 views
42

Wenn ich eine Funktion wie diese:Hinzufügen von Standardparameterwert mit Typ-Hinweis in Python

def foo(name, opts={}): 
    pass 

Und ich mag Typen Hinweise auf die Parameter hinzuzufügen, wie kann ich es tun? Die Art, wie ich angenommen gibt mir einen Syntaxfehler:

def foo(name: str, opts={}: dict) -> str: 
    pass 

Den folgenden keine Syntaxfehler werfen, aber es scheint nicht, wie die intuitive Art und Weise, diesen Fall zu behandeln:

def foo(name: str, opts: dict={}) -> str: 
    pass 

ich kann Finde nichts in der typing documentation oder in einer Google-Suche.

Edit: Ich wusste nicht, wie Standardargumente in Python funktionierte, aber um dieser Frage willen werde ich die obigen Beispiele behalten. Im Allgemeinen ist es viel besser, Folgendes zu tun:

def foo(name: str, opts: dict=None) -> str: 
    if not opts: 
    opts={} 
    pass 
+1

Die letzte Funktion ist der richtige Weg. Es ist die selbe Art, wie es die "skalare" Sprache auch macht. –

+4

Sie haben einen veränderlichen Standard-Typ - das wird zu Problemen führen –

+0

siehe meine Update-Antwort, @josh –

Antwort

52

Ihr zweiter Weg ist richtig.

def foo(opts: dict = {}): 
    pass 

print(foo.__annotations__) 

diese Ausgänge

{'opts': <class 'dict'>} 

Es stimmt, dass es ist nicht in PEP 484 aufgeführt ist, aber Type Hints sind eine Anwendung der Funktion Annotationen, die in PEP dokumentiert 3107. The syntax section es, dass Keyword-Argumente Werke deutlich macht, mit Funktion Anmerkungen auf diese Weise.

Ich rate dringend davon ab, veränderbare Schlüsselwortargumente zu verwenden. Weitere Informationen here.

+1

Siehe http://legacy.python.org/dev/peps/pep-3107/#syntax. Typhinweis ist nur eine Anwendung von Funktionsanmerkungen. – chepner

+0

@echepner wahr. wusste nicht, dass PEP 3107 etwas über Schlüsselwortargumente hatte. –

+1

Wow, ich wusste nichts über die veränderbaren Standardargumente in Python ... besonders aus Javascript/Ruby, wo Standardargumente anders funktionieren. Ich werde nicht wieder aufrüsten, was schon gesagt wurde, um SO herum, aber ich bin nur froh, dass ich davon erfahren habe, bevor es mich gebissen hat. Vielen Dank! – josh