web-dev-qa-db-ja.com

Python:存在しない場合に値を割り当てる

私はPythonに初めてRoRプログラマーです。以前に割り当てられていない場合にのみ、変数を特定の値に設定できる構文を見つけようとしています。基本的に私が欲しい:

# only if var1 has not been previously assigned

var1 = 4
42
Spencer

これは非常に異なるスタイルのプログラミングですが、私は常に次のようなものを書き直そうとします

bar = None
if foo():
    bar = "Baz"

if bar is None:
    bar = "Quux"

ちょうどに:

if foo():
    bar = "Baz"
else:
    bar = "Quux"

つまり、変数を定義するコードパスとそうでないコードパスがある状況を避けるように努めています。私のコードでは、定義された変数のセットのあいまいさを引き起こすパスはありません(実際、通常はさらに一歩進んで、コードパスに関係なくtypesが同じであることを確認します)。個人的な好みの問題かもしれませんが、このパターンは、私が書いているときは少しわかりにくいですが、後で読むときに理解しやすくなります。

変数をNoneに初期化してから確認する必要があります。

var1 = None
if var1 is None:
    var1 = 4

次のように1行で記述できます。

var1 = 4 if var1 is None else var1

またはショートカットを使用します(ただし、なしを確認することをお勧めします)

var1 = var1 or 4

あるいは、変数名が存在しない変数に何も割り当てられない場合、後でそれを使用するとNameErrorが発生し、その知識を使用してこのようなこともできます

try:
    var1
except NameError:
    var1 = 4

しかし、私はそれに対して助言します。

79
Anurag Uniyal
var1 = var1 or 4

これが持つかもしれない唯一の問題は、var1がFalseまたは0または[]のようなfalsey値である場合、代わりに4を選択することです。それが問題になるかもしれません。

24
ubadub

私もRubyから来ているので、構文foo ||= 7

これは私が見つけることができる最も近いものです。

foo = foo if 'foo' in vars() else 7

私は人々が辞書のためにこれを行うのを見ました:

try:
    foo['bar']
except KeyError:
    foo['bar'] = 7

padate:しかし、最近この宝石を見つけました:

foo['bar'] = foo.get('bar', 7)

それが好きなら、通常の変数に対して次のようなことができます:

vars()['foo'] = vars().get('foo', 7)
14
l__flex__l

IfLoopの答え(およびMatToufoutuのコメント)はスタンドアロン変数に対してはうまく機能しますが、リスト、タプル、または辞書の個々のエントリに対して同様のことをしようとする人には答えを提供したかったのです。

辞書

existing_dict = {"spam": 1, "eggs": 2}
existing_dict["foo"] = existing_dict["foo"] if "foo" in existing_dict else 3

{"spam": 1, "eggs": 2, "foo": 3}を返します

リスト

existing_list = ["spam","eggs"]
existing_list = existing_list if len(existing_list)==3 else 
                existing_list + ["foo"]

["spam", "eggs", "foo"]を返します

タプル

existing_Tuple = ("spam","eggs")
existing_Tuple = existing_Tuple if len(existing_Tuple)==3 else 
                 existing_Tuple + ("foo",)

("spam", "eggs", "foo")を返します

("foo",)のコンマを忘れずに「単一」のタプルを定義してください。)

リストとタプルのソリューションは、単に長さをチェックして最後に追加するだけではなく、もっと複雑なものになります。それにもかかわらず、これはあなたができることの風味を与えます。

4
Alex P. Miller

モジュールレベルで変数を意味する場合は、「グローバル」を使用できます。

if "var1" not in globals():
    var1 = 4

しかし、一般的なPythonイディオムは、それを初期化してNone(受け入れ可能な値ではないと仮定する)とif var1 is not Noneでテストすることです。

1
6502