【问题标题】:Odd Syntax (Walrus operator in inheritance)奇数语法(继承中的海象运算符)
【发布时间】:2020-06-02 21:17:15
【问题描述】:

我正在查看 python 的语法,并且您可以在继承中使用海象运算符!不信,我试了一下:

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

b = bar()
b.x()

这不会引发 any 语法错误(python 3.8.2)!它有什么用,它是如何工作的?

【问题讨论】:

  • 不一定是有原因的。没有人需要根据用例的存在来明确决定是否允许一起使用两个东西。各种各样的东西都可以用无用的方式组合起来。

标签: python class oop inheritance walrus-operator


【解决方案1】:

它没有用 - 所以不要使用它;-) 那里允许任意表达。比如这个就更没用了:

from random import choice

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

玩得开心;-)

【讨论】:

  • 其实这是不正确的——如果你看一下语法,它是明确存在的——它不是以表达式的形式存在的。
  • @Xilpex:这是解析器限制的产物。解析器无法在那里处理namedexpr_test。正是这种限制导致他们不得不使用test ':=' test 而不是NAME ':=' test
【解决方案2】:

它有什么用,它是如何工作的?

海象运算符在继承中没有特定的用例。它之所以起作用,仅仅是因为该类是一个表达式,因此它允许表达式允许的所有内容,包括海象运算符。正如 cmets 中所指出的,您可以使用以下方法获得相同的结果:

foobar = foo
class bar(foobar):
    ...

表达式中允许的其他内容也可以使用,例如括号和函数调用:

class bar(((foo))):
    pass

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

【讨论】:

  • 其实这是不正确的——如果你看一下语法,它是明确存在的——它不是以表达式的形式存在的。
  • @Xilpex 关于语法你是对的。我不确定,但这似乎是解析器的某些限制所需的实现细节,以产生允许的任意表达式的效果。例如,列表推导也被明确列出。
【解决方案3】:

经过一些试验(和运气),我发现这是为了在继承类的同时重命名类:

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()

如果您删除海象运算符,它将不起作用(显然)。我不确定它到底有什么用。

【讨论】:

  • 这和在课堂上做class bar(foo):然后foobar = foo有区别吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2022-11-24
  • 2015-11-19
  • 2015-06-27
  • 2011-07-08
  • 2023-04-02
  • 2020-02-19
相关资源
最近更新 更多