2016-08-02 3 views
42

で型ヒントをデフォルトのパラメータ値を追加しますか?私は仮定の方法は、私の構文エラーを与える:は、Python

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

次は構文エラーをスローしませんが、それはこのケースを処理するための直感的な方法のように見えるしていません:

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

私ができますtyping documentationまたはGoogle検索で何かを見つけることはできません。

編集:私はデフォルトの引数がPythonでどのように機能していたのか分かりませんでしたが、この質問のために上記の例を示します。一般的には、以下を行う方がはるかに優れています。

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

最後の機能は正しい方法です。それは 'scala'言語と同じ方法です。 –

+4

あなたは変更可能なデフォルトのタイプを持っています - それは問題につながります。 –

+0

私の更新の回答をご覧ください、@josh –

答えて

52

2番目の方法は正しいです。

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

print(foo.__annotations__) 

これは

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

それはそれはそれはPEP 484に記載されていないのです本当だが、タイプヒントは、PEPに記載されていた機能注釈のアプリケーションですが、3107 The syntax sectionは、それが明確なキーワード引数の作品ということになり出力しますこのようにして関数アノテーションを使用します。

私は、可変キーワード引数の使用を強くお勧めします。詳細情報here

+1

http://legacy.python.org/dev/peps/pep-3107/#syntaxを参照してください。型ヒントは関数アノテーションのアプリケーションに過ぎません。 – chepner

+0

@chepner true。 PEP 3107がキーワードの引数について何かを持っていたことを知らなかった。 –

+1

うわー、私はPythonの可変引数のデフォルトについて知りませんでした...特にJavascript/Rubyから来ています。それについてSOの周りにすでに広告のnauseumと言われていることを再ハッシュするつもりはない、私はちょうどそれが私に噛み付く前にこれについて知ってうれしい。ありがとう! – josh