Почему оператор моржа для переменной-члена вызывает SyntaxError?
Почему я не могу воспользоваться оператором моржа
:=
присвоить атрибуту? Работает при присвоении локальной переменной:
my_eyes = ["left", "right"]
if saved_eye := my_eyes.index("left"):
print(saved_eye)
# outputs >>> 0
Но это синтаксическая ошибка, если я попытаюсь назначить атрибут объекта:
class MyEyes:
def __init__(self):
self.eyes = ["left", "right"]
self.saved_eye = None
def ohyes(self):
if self.saved_eye := self.eyes.index("left"):
print(self.saved_eye)
x = MyEyes()
x.ohyes()
# raises
# >>> if self.saved_eye := self.eyes.index("left"):
# >>> SyntaxError: cannot use assignment expressions with attribute
Я имею в виду, что могу обойти ошибку, используя временную локальную переменную, но почему это могло произойти? Я считаю, что на 100% это законный синтаксис.
1 ответ
Синтаксис недопустим, как указано в PEP 572
, где определен оператор моржа (он же «выражение присваивания»):
Что наиболее важно, поскольку:= является выражением, его можно использовать в контекстах, где операторы недопустимы, включая лямбда-функции и понимания.
И наоборот, выражения присваивания не поддерживают расширенные функции, имеющиеся в операторах присваивания:
Отдельные цели назначения, отличные от одного NAME, не поддерживаются:
# No equivalent a[i] = x self.rest = []
Это немного многословно, но это означает, что оператор моржа не поддерживает присвоение атрибутов.
Ошибка, которую вы получаете, также довольно специфична для ситуации, проверка ее («нельзя использовать выражения присваивания с атрибутом» означает «нельзя использовать оператор моржа, устанавливающий атрибут»).