Подтвердить что ты не робот

Python: присвоить значение, если отсутствует

Я программист RoR, новичок в Python. Я пытаюсь найти синтаксис, который позволит мне установить переменную на определенное значение, только если она не была назначена ранее. В основном я хочу:

# only if var1 has not been previously assigned

var1 = 4
4b9b3361

Ответ 1

Это совсем другой стиль программирования, но я всегда стараюсь переписать вещи, которые выглядели как

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

if bar is None:
    bar = "Quux"

просто:

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

То есть я стараюсь избегать ситуации, когда некоторые пути кода определяют переменные, а другие нет. В моем коде никогда не существует пути, который вызывает неоднозначность набора определенных переменных (на самом деле, я обычно делаю шаг дальше и слежу за тем, чтобы типы были одинаковыми независимо от пути к коду). Это может быть только вопрос личного вкуса, но я нахожу этот образец, хотя и немного менее очевидным, когда я его пишу, гораздо легче понять, когда я его позже прочитаю.

Ответ 2

Вы должны инициализировать переменные None, а затем проверить:

var1 = None
if var1 is None:
    var1 = 4

Что можно записать в одну строку:

var1 = 4 if var1 is None else var1

или с помощью ярлыка (но рекомендуется проверка на None)

var1 = var1 or 4

альтернативно, если у вас не будет ничего привязанного к переменной, имя переменной не существует и, следовательно, использование этого позже поднимет NameError, и вы также можете использовать это знание для выполнения чего-то вроде этого

try:
    var1
except NameError:
    var1 = 4

но я бы посоветовал это сделать.

Ответ 3

var1 = var1 or 4

Единственная проблема, которая может возникнуть в том, что если var1 является значением false, например False или 0 или [], вместо этого он выберет 4. Это может быть проблемой.

Ответ 4

Я тоже из Ruby, поэтому мне нравится синтаксис foo ||= 7.

Это самая близкая вещь, которую я могу найти.

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

Я видел, как люди это делали для диктата:

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

Upadate: Тем не менее, я недавно нашел этот камень:

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

Если вам это нравится, то для обычной переменной вы можете сделать что-то вроде этого:

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

Ответ 5

Ответ 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",) определить "один" кортеж.)

Решение для списков и кортежей будет более сложным, если вы хотите сделать больше, чем просто проверить длину и добавить к концу. Тем не менее, это дает ощущение того, что вы можете сделать.

Ответ 6

Если вы имеете в виду переменную на уровне модуля, то вы можете использовать "globals":

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

но общая идиома Python должна инициализировать его, чтобы сказать None (предполагая, что это не приемлемое значение), а затем тестирование с помощью if var1 is not None.