これらのアプローチの間に違い、落とし穴、または欠点はありますか?
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
対
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
これらのアプローチの間に違い、落とし穴、または欠点はありますか?
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
対
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
KeyError
キーがディクショナリに存在しない場合に がスローされるため、2 番目の形式は絶対に使用しないでください。キーが設定されているため、2 番目のフォームからは許容できる動作しか得られません。
foo
コードの最初の部分は、に関連付けられたから値を取得しようとします。キーがないkey
場合、デフォルトで。になります。したがって、ここには2つのケースがあります。foo
key
foobar
foo
キーkey
を持っているので、bar
に設定されていますfoo[key]
foo
キーがないkey
ため、bar
に設定されます"foobar"
key
2つ目は、のキーに関連付けられたfoo
値を調べ、その値が偽の場合(つまり、の場合bool(foo[key])==False
)、デフォルトで。になりfoobar
ます。foo
キーがない場合はkey
、を発生させKeyError
ます。したがって、ここには3つのケースがあります。
foo
キー、、を持っているkey
ので、bool(foo[key])==True
にbar
設定されますTrue
foo
キー、、を持っているkey
ので、bool(foo[key])==False
にbar
設定されます"foobar"
foo
キーを持っていないkey
ので、コードはKeyError
2 番目の例は、存在しない場合に発生しますKeyError
。foo['key']
bar
デフォルト値をif foo['key']
does not exist または contains falsey 値に割り当てたい場合は、これが Pythonic の方法になります。
bar = foo.get('key') or 'foobar'
これは使用上の問題ですbool()
one = {"my_key": None}
print "Get:", one.get("my_key")
print "Bool:", bool(one.get("my_key"))
print "Get with falback:", one.get("my_key", "other")
Get: None
Bool: False
Get with falback: None
そこには値がありますが、None
boolはfalseと評価されることに注意してください。あなたは使うべきですget("key", "default")
、それは仕事をするように設計されています。
foo = dict(key=u"")
デフォルト値が空の文字列である辞書を生成すると思うなら、あなたは間違っています。そのためには、次のものが必要ですdefaultdict
。
In [6]: bool(foo['key']) or 'foobar'
Out[6]: 'foobar'
In [7]: foo = dict(key='')
In [9]: bool(foo['nokey']) or 'foobar'
KeyError: 'nokey'
defaultdict
、 またはdict.get
、または のいずれかを使用しますdict.setdefault
。
ずっとうまくいきます:
In [10]: try:
....: v = foo['nokey']
....: except KeyError:
....: v = 'foobar'
....:
In [11]: v
Out[11]: 'foobar'
はい:
foo.get('key', 'foobar')
常に何かを返します (「key」という名前のキーがある場合はその値を返し、そのようなキーがない場合は「foobar」を返します。
ただし、 「key」という名前のキーが存在しない場合はbool(foo['key']) or 'foobar'
a を発生させることができます。KeyError
さらに、or
ここでの使用は示唆的なものではないため、このget
方法を使用することをお勧めします。