Оператор условного присваивания 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'
Ответы
Ответ 1
Нет, замена:
try:
v
except NameError:
v = 'bla bla'
Однако, желание использовать эту конструкцию является признаком чрезмерно сложного потока кода. Обычно вы делаете следующее:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
и никогда не сомневайтесь, установлен ли параметр v
или нет. Если это один из многих параметров, которые могут быть установлены или нет, используйте словарь и его метод get
, который позволяет использовать значение по умолчанию.
Ответ 2
Я удивлен, что никто не предложил этот ответ. Это не как "встроенный", а Ruby ||=
, но он в основном эквивалентен и еще однострочный:
foo = foo if 'foo' in locals() else 'default'
Конечно, locals() - это просто словарь, поэтому вы можете сделать:
foo = locals().get('foo', 'default')
Ответ 3
Я бы использовал
x = 'default' if not x else x
Намного короче, чем все ваши альтернативы, предлагаемые здесь, и прямо к делу. Прочитайте: "установите x в значение" по умолчанию ", если x не установлен, иначе сохраните его как x". Если вам нужны None
, 0
, False
или ""
для правильных значений, вам нужно будет изменить это поведение, например:
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 check to make sure our None valued variable actually got set
'default'
Наконец, если вам действительно не хватает нотации в Ruby infix, вы можете перегрузить ||=|
(или что-то подобное), следуя за этим парнем: http://code.activestate.com/recipes/384122-infix-operators/
Ответ 4
Нет, не зная, какие переменные определены, является ошибкой, а не функцией в Python.
Вместо этого используйте dicts:
d = {}
d.setdefault('key', 1)
d['key'] == 1
d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2
Ответ 5
(не могу комментировать, или я просто сделаю это). Я считаю, что предложение проверить локальные жители выше не совсем верно. Это должно быть:
foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
чтобы быть правильным во всех контекстах.
Однако, несмотря на свои приоритеты, я не думаю, что это хороший аналог оператора Ruby. Поскольку оператор Ruby допускает больше, чем простое имя слева:
foo[12] ||= something
foo.bar ||= something
Метод исключений, вероятно, является ближайшим аналогом.
Ответ 6
Я обычно делаю это следующим образом:
def set_if_not_exists(obj,attr,value):
if not hasattr(obj,attr): setattr(obj,attr,value)
Ответ 7
Существует условное назначение в Python 2.5 и более поздних версиях - синтаксис не очень очевиден, поэтому его легко пропустить. Вот как вы это делаете:
x = true_value if condition else false_value
Для получения дополнительной информации ознакомьтесь с документами Python 2.5.
Ответ 8
Я думаю, что вы ищете, если вы ищете что-то в словаре, это метод 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
, отсутствует.
Ответ 9
Я не уверен, что я правильно понимаю этот вопрос здесь... Попытка "прочитать" значение имени переменной "undefined" вызовет NameError
. (см. здесь, что у Python есть "имена" , а не переменные...).
== EDIT ==
Как указано в комментариях delnan, приведенный ниже код не является надежным и будет разбит во многих ситуациях...
Тем не менее, если ваша переменная "существует", но имеет какое-то фиктивное значение, например None
, будет работать следующее:
>>> my_possibly_None_value = None
>>> myval = my_possibly_None_value or 5
>>> myval
5
>>> my_possibly_None_value = 12
>>> myval = my_possibly_None_value or 5
>>> myval
12
>>>
(см. этот абзац о значениях правды)
Ответ 10
Нет, нет такой глупости.
Что-то, чего мы не пропустили в Python в течение 20 лет.