【问题标题】:Why does using the walrus operator on a member variable raise a SyntaxError?为什么在成员变量上使用海象运算符会引发 SyntaxError?
【发布时间】:2021-04-26 02:38:32
【问题描述】:

为什么我不能使用海象运算符:= 来分配属性?它在分配给局部变量时起作用:

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% 这是一种合法的语法。

【问题讨论】:

    标签: python python-3.9 walrus-operator


    【解决方案1】:

    语法是非法的,如PEP 572 中所述,其中定义了海象运算符(又名“赋值表达式”):

    最重要的是,由于 := 是一个表达式,它可以用于语句非法的上下文中,包括 lambda 函数和推导式。

    相反,赋值表达式不支持赋值语句中的高级功能:

    不支持单个 NAME 以外的单个分配目标:

    # No equivalent
    a[i] = x
    self.rest = []
    

    有点罗嗦,但这意味着海象运算符不支持属性赋值。

    你得到的错误也非常具体,验证这一点(“不能使用带有属性的赋值表达式”意味着“不能使用海象运算符设置属性”)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多