Python 奇数语法(继承中的Walrus运算符)

Python 奇数语法(继承中的Walrus运算符),python,class,oop,inheritance,walrus-operator,Python,Class,Oop,Inheritance,Walrus Operator,我在研究python的语法,发现您可以在继承中使用walrus操作符!不相信,我试了一下: class foo: pass class bar(foobar := foo): def x(self): print("it works!") b = bar() b.x() 这不会引起任何语法错误(python 3.8.2)!它的用途是什么?它是如何工作的?经过一点实验(运气好),我发现它适用于在继承类的同时重命名类: class foo: def __init

我在研究python的语法,发现您可以在继承中使用walrus操作符!不相信,我试了一下:

class foo: pass
class bar(foobar := foo): 
    def x(self):
        print("it works!")

b = bar()
b.x()

这不会引起任何语法错误(python 3.8.2)!它的用途是什么?它是如何工作的?

经过一点实验(运气好),我发现它适用于在继承类的同时重命名类:

class foo:
    def __init__(self, x):
        pass

class bar(foobar := foo):
    def __init__(self):
        foobar.__init__(self, 2)

    def x(self):
        print("it works!")

b = bar()
b.x()

如果删除walrus操作符,它将不起作用(显然)。我不确定它到底有什么用。

经过一点实验(运气好),我发现它适用于在继承类的同时重命名类:

class foo:
    def __init__(self, x):
        pass

class bar(foobar := foo):
    def __init__(self):
        foobar.__init__(self, 2)

    def x(self):
        print("it works!")

b = bar()
b.x()

如果删除walrus操作符,它将不起作用(显然)。我不知道它到底有什么用。

它没有用,所以不要用它;-)这里允许任意表达式。例如,这更无用:

from random import choice

class C(choice([int, list])):
    pass

玩得开心;-)

它没用-所以不要用它;-)这里允许任意表达式。例如,这更无用:

from random import choice

class C(choice([int, list])):
    pass
玩得开心;-)

它的用途是什么?它是如何工作的

在继承中没有针对walrus操作符的特定用例。它之所以有效,是因为类是一个表达式,所以它允许表达式允许的一切,包括walrus操作符。正如评论中所指出的,您可以通过以下方式获得相同的结果:

foobar = foo
class bar(foobar):
    ...
表达式中允许的其他内容也同样适用,例如括号和函数调用:

class bar(((foo))):
    pass

class bar((lambda x: x)(foo)):
    pass
它的用途是什么?它是如何工作的

在继承中没有针对walrus操作符的特定用例。它之所以有效,是因为类是一个表达式,所以它允许表达式允许的一切,包括walrus操作符。正如评论中所指出的,您可以通过以下方式获得相同的结果:

foobar = foo
class bar(foobar):
    ...
表达式中允许的其他内容也同样适用,例如括号和函数调用:

class bar(((foo))):
    pass

class bar((lambda x: x)(foo)):
    pass

这与在类的顶层做
class bar(foo):
然后
foobar=foo
不同吗?这与在类的顶层做
class bar(foo):
然后
foobar=foo
不同吗?不必有原因。没有人需要根据用例的存在明确决定允许同时使用两个东西。各种各样的东西都可以以无用的方式组合在一起,不必有理由。没有人需要根据用例的存在明确决定允许同时使用两个东西。各种各样的东西都可以以无用的方式组合在一起。实际上,这是不正确的——如果你看一下语法,它是显式存在的——它不是以表达式的形式存在的。@Xilpex关于语法你是对的。我不确定,但它似乎是解析器的某些限制所要求的实现细节,以产生允许使用任意表达式的效果。例如,列表理解也是显式列出的。实际上,这是不正确的——如果你看一下语法,它是显式存在的——它不是以表达式的形式存在的。@Xilpex关于语法你是对的。我不确定,但它似乎是解析器的某些限制所要求的实现细节,以产生允许使用任意表达式的效果。例如,列表理解也是显式列出的。实际上,这是不正确的——如果你看一下语法,它显式地在那里——它不是以表达式的形式出现的。@Xilpex:这是解析器限制的产物。解析器将无法在那里处理
namedexpr\u测试。正是这种限制导致他们不得不使用
test':='test
而不是
NAME':='test
。实际上,这是不正确的——如果你看一下语法,它是明确存在的——它不是以表达式的形式存在的。@Xilpex:这是解析器限制的产物。解析器将无法在那里处理
namedexpr\u测试。正是这种限制导致他们不得不使用
test':='test
而不是
NAME':='test