Почему для выполнения внутристрочного IF требуется другое выражение?

x = 'foo' if x == 'bar' else x

теперь это будет равно:

x = 'foo' if x == 'bar'

но это возвращает ошибку "недопустимый синтаксис". Есть ли причина, почему это работает так, как будто это или что является причиной дизайнерского решения? Потому что это как многострочная функция if (работает как пример # 2):

if x == 'foo':
 x = 'bar'

и он отлично работает.

3 ответа

Это потому, что это не утверждение, а выражение. Он должен что-то оценить, поэтому вы не можете исключить условие else. Кроме того, поскольку это выражение, вы не можете (действительно, не должны) делать что-либо, что бы мутировать состояние.

Подробнее здесь: https://docs.python.org/2/reference/expressions.html#conditional-expressions

Конечно, что-то вроде этого вполне возможно:

class C(object):
 def foo(self):
 self.y = 1
 return 'foo'

c = C()

c.foo() if True else 'bar'

print c.y

# Prints '1'

... так что мутирующий статус в тройном выражении фактически не запрещен; это просто не рекомендуется.


Для интерпретатора Python эта строка кода...

x = 'foo' if x == 'bar' else x

не интерпретируется так...

(x = 'foo') if x == 'bar' else (x = x)

а интерпретируется следующим образом:

x = ('foo' if x == 'bar' else x)

Это связано с тем, что trernary x if cond else y operator в Python является выражением, а не выражением - он может использоваться везде, где вы указываете значение.

Таким образом, вы также можете использовать его, например, в случаях, когда вы не выполняете назначение:

print("hi" if x == 'bar' else "bye")

Поскольку это выражение, оно всегда должно иметь возможность разрешить какое-то значение, чтобы значение могло использоваться в любом контексте, в котором используется выражение.


Мантра говорит, что должен быть только один способ сделать что-то. Мы уже имеем:

if x == 'foo': x = 'bar'

Почему мы хотим:

x = 'bar' if x == 'foo'

licensed under cc by-sa 3.0 with attribution.