6

デフォルトの引数は、関数が定義されたときにバインドされ、呼び出されないため、Python では通常、フォームのデフォルトの引数を使用しx={}ても意図した目的を達成できません。

規則は、変更可能なオブジェクトをデフォルトの引数として設定し、関数が呼び出されたときに適切なデフォルトを割り当てることx=Noneを確認するようです。x is None

したがって、xデフォルトで空の辞書にキャストしたい場合は、次のようなものを使用します。

def f(x=None):
    x = dict(x) if x is not None else {}

ただし、dict任意のイテラブルを使用できるため、次のより簡潔なバージョンを書くこともできます。

def f(x=()):
    x = dict(x)

これらのうち、「正しい」アプローチはどれですか?

4

3 に答える 3

7

慣用的なスタイルは、にキャストしないdictことです。そうすれば、誰かが正しいマッピング メソッドを実装する任意のオブジェクトを使用できます。

したがって、最もpythonicな方法は次を使用することです:

def f(x=None):
    if x is None:
        x = {}

次に、マッピング方法を使用します。

したがって、通常、引数を dict にキャストしないでください。代わりにAPIがマッピング オブジェクトを受け入れると述べ、呼び出し元がキャストを行うことを期待します。

a と iterable の両方を受け入れる唯一の理由は、 functiondictのように重複キーが許可されている順序付けられたキーと値のペアをサポートする場合です。そのような場合、 aはその情報を保持できず、そのメソッドは iterable を dict にキャストせず、dict を iterable として使用します。urllib.urlencodedict

于 2012-12-10T07:06:37.620 に答える
1

ここには正しい答えも間違った答えもありませんが、最初の答えはもっと慣用的だと思います(2番目の答えが間違ったり、悪くなったり、悪くなったりすることはありません)。

于 2012-12-10T06:54:07.987 に答える