web-dev-qa-db-ja.com

Python条件付き代入演算子

Python Ruby ||=演算子(「変数が設定されていない場合は変数を設定」)が存在しますか?

Rubyの例:

 variable_not_set ||= 'bla bla'
 variable_not_set == 'bla bla'

 variable_set = 'pi pi'
 variable_set ||= 'bla bla'
 variable_set == 'pi pi'
44
Hartator

いいえ、代替品は次のとおりです。

try:
   v
except NameError:
   v = 'bla bla'

ただし、この構造を使用したいということは、コードフローが非常に複雑であることを示しています。通常、次のことを行います。

try:
   v = complicated()
except ComplicatedError: # complicated failed
   v = 'fallback value'

vが設定されているかどうかわからないことはありません。設定できるオプションまたは設定できないオプションのいずれかである場合は、辞書とそのデフォルト値を許可する get メソッドを使用します。

18
phihag

私は誰もこの答えを提供しなかったことに驚いています。 Rubyの_||=_ほど「ビルトイン」ではありませんが、基本的には同等であり、1ライナーのままです。

_foo = foo if 'foo' in locals() else 'default'
_

もちろん、 locals() は単なる辞書なので、次のことができます。

_foo = locals().get('foo', 'default')
_
135
Keith Devens

私は使うだろう

x = 'default' if not x else x

ここで提案されているすべての選択肢よりもはるかに短く、ポイントまでまっすぐです。 「xが設定されていない場合はxを「デフォルト」に設定します。それ以外の場合はxのままにします。」 Noneが必要な場合、0False、または""ただし、有効な値にするには、たとえば、この動作を変更する必要があります。

valid_vals = ("", 0, False) # We want None to be the only un-set value

x = 'default' if not x and x not in valid_vals else x

また、この種のことは、どこでも簡単に使用できる機能に変えてほしいと願っています。

setval_if = lambda val: 'default' if not val and val not in valid_vals else val

その時点で、次のように使用できます。

>>> x = None # To set it to something not valid
>>> x = setval_if(x) # Using our special function is short and sweet now!
>>> print x # Let's check to make sure our None valued variable actually got set
'default'

最後に、本当にRuby挿入記法が欠けている場合は、||=|(または似たような)この男のハックに従う: http://code.activestate.com/recipes/384122-infix-operators/

14
emish

いいえ、定義されている変数がわからないことはバグであり、Pythonの機能ではありません。

代わりに辞書を使用してください:

d = {}
d.setdefault('key', 1)
d['key'] == 1

d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2
4
Jochen Ritzel

(コメントできないか、私はそれをするだけです)私は上記の地元の人をチェックする提案は全く正しくないと思います。そのはず:

foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'

すべてのコンテキストで正しいこと。

しかし、その賛成にもかかわらず、それでもRuby演算子に似ているとは思いません。Ruby演算子は単なる左側の名前:

foo[12] ||= something
foo.bar ||= something

例外メソッドは、おそらく最も近いアナログです。

2
Jas

私は通常、次の方法でこれを行います。

def set_if_not_exists(obj,attr,value):
 if not hasattr(obj,attr): setattr(obj,attr,value)
1

Python 2.5以降では条件付きの割り当てがあります-構文はあまり明確ではないため、見逃しやすいです。以下にその方法を示します。

x = true_value if condition else false_value

詳細については、 Python 2.5 docs をご覧ください。

1
mainas

辞書で何かを探しているなら、あなたが探しているのはsetdefaultメソッドだと思います:

(Pdb) we=dict()
(Pdb) we.setdefault('e',14)
14
(Pdb) we['e']
14
(Pdb) we['r']="p"
(Pdb) we.setdefault('r','jeff')
'p'
(Pdb) we['r']
'p'
(Pdb) we[e]
*** NameError: name 'e' is not defined
(Pdb) we['e']
14
(Pdb) we['q2']

*** KeyError: 'q2'(Pdb)

私の例で重要なことは、setdefaultメソッドが参照するキーが存在しない場合にのみ、setdefaultメソッドが辞書を変更することです。

0
user1928764