Почему оператор моржа для переменной-члена вызывает 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 = []

Это немного многословно, но это означает, что оператор моржа не поддерживает присвоение атрибутов.

Ошибка, которую вы получаете, также довольно специфична для ситуации, проверка ее («нельзя использовать выражения присваивания с атрибутом» означает «нельзя использовать оператор моржа, устанавливающий атрибут»).

Другие вопросы по тегам