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

Оператор условного присваивания 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'
4b9b3361

Ответ 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 лет.