5

これらのアプローチの間に違い、落とし穴、または欠点はありますか?

foo = dict(key=u"")
bar = foo.get('key', 'foobar')

foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
4

6 に答える 6

10

KeyErrorキーがディクショナリに存在しない場合に がスローされるため、2 番目の形式は絶対に使用しないでください。キーが設定されているため、2 番目のフォームからは許容できる動作しか得られません。

于 2012-08-15T15:02:03.800 に答える
6

fooコードの最初の部分は、に関連付けられたから値を取得しようとします。キーがないkey場合、デフォルトで。になります。したがって、ここには2つのケースがあります。fookeyfoobar

  1. fooキーkeyを持っているので、barに設定されていますfoo[key]
  2. fooキーがないkeyため、barに設定されます"foobar"

key2つ目は、のキーに関連付けられたfoo値を調べ、その値が偽の場合(つまり、の場合bool(foo[key])==False)、デフォルトで。になりfoobarます。fooキーがない場合はkey、を発生させKeyErrorます。したがって、ここには3つのケースがあります。

  1. fooキー、、を持っているkeyので、bool(foo[key])==Truebar設定されますTrue
  2. fooキー、、を持っているkeyので、bool(foo[key])==Falsebar設定されます"foobar"
  3. fooキーを持っていないkeyので、コードはKeyError
于 2012-08-15T15:03:14.740 に答える
4

2 番目の例は、存在しない場合に発生しますKeyErrorfoo['key']

barデフォルト値をif foo['key']does not exist または contains falsey 値に割り当てたい場合は、これが Pythonic の方法になります。

bar = foo.get('key') or 'foobar'
于 2012-08-15T15:01:34.640 に答える
1

これは使用上の問題です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

そこには値がありますが、Noneboolはfalseと評価されることに注意してください。あなたは使うべきですget("key", "default")、それは仕事をするように設計されています。

于 2012-08-15T15:03:26.823 に答える
1

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'
于 2012-08-15T15:05:49.753 に答える
1

はい:

foo.get('key', 'foobar')常に何かを返します (「key」という名前のキーがある場合はその値を返し、そのようなキーがない場合は「foobar」を返します。

ただし、 「key」という名前のキーが存在しない場合はbool(foo['key']) or 'foobar'a を発生させることができます。KeyError

さらに、orここでの使用は示唆的なものではないため、このget方法を使用することをお勧めします。

于 2012-08-15T15:08:47.657 に答える