2016-10-28 5 views
1
で、オプションのリスト引数を扱うの

従来の方法は以下の通りです:オプションのリスト引数「リスト=リストまたは[]」のpython

def func(list_of_vals = None): 
    if list_of_vals is None: 
     list_of_vals = [] 
    ... 

以下の(短い)バージョンは、任意の落とし穴を持っている場合、私はwounder?なぜ誰もそれをしない?もっと不明瞭だと思われますか?このためif文と組み合わせるNoneを使用して

list_of_vals = list_of_vals or [] 
+3

私はそれをすごくいいと思います。まともなpythonプログラマはそれを理解するでしょう。しかし、変数名として 'l'を使うと、それは悪いことです。 –

+0

@AlexHall、確かに、アイデアを説明するための単なるサンプルコードです –

+0

これは非常に一般的です。それはJSの標準でもあります。実際、Typescriptのデフォルト引数は上記のコードにコンパイルされますが、JSではコンパイルされます。言語に習熟している人でも、自分が行っていることを正確に知ることができます。 – Carcigenicate

答えて

3

は、Pythonの開発者に精通していると何の奇妙なエッジケースを持っていない、普通です。 私のお薦めは、ただの規約にとどまります。

ここor操作を使用してのご提案は、論理的にbool(list_of_vals) == Falseが、list_of_vals is not Noneエッジケースのために、従来の溶液から外れるので、私はそれを使用してに対してをお勧めします。

別の可能なオプションは、空のタプルを使用することです:

def a(vals=()): 
    ... 

タプルは不変であるので、これは変更可能なデフォルトリストの落とし穴を全く持っていません。入力コンテナの反復とインデックス付けが必要なユースケースが数多くあり、valsはタプルとして幸せに残ることができます。

実際に機能の本体内にリストが必要な場合、たとえばアイテムを追加またはポップする必要がある場合は、関数の最初の行にvals = list(vals)を追加します。あなたは、リストパラメータの交代を阻止したい場合は、あなたがすべき

some_list = [] 
a(some_list) 
print(some_list) 

+1

function( 'list')に渡される典型的な値の型がデフォルト値の型(' tuple')と違うと感じます。それはもっと誤解を招くかもしれません。 –

+0

これは素晴らしい考えです。渡されたリストが関数によって変更されることが予想される場合(オプションの引数には不思議になります)は動作しませんが、それ以外の場合は不変性がプラスであることも示唆されます。 – zvone

+0

@BenUsman良いPython関数は、とにかく引数の型を可能な限り小さくする必要があります。 – zvone

1

2例がありますが、あなたはリストは関数の外で変化させることができることをしたい、そして第二の変形はしてaを呼び出す防止します中にコピーするa

def a(l=()): 
    l = list(l) 
関連する問題