Python: присвоить значение, если отсутствует
Я программист RoR, новичок в Python. Я пытаюсь найти синтаксис, который позволит мне установить переменную на определенное значение, только если она не была назначена ранее. В основном я хочу:
# only if var1 has not been previously assigned
var1 = 4
Ответы
Ответ 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
.