当前位置: 首页 > 知识库问答 >
问题:

类内的类型暗示[重复]

张权
2023-03-14
class Node:
    def append_child(self, node: Node):
       if node != None:
        self.first_child = node
    self.child_nodes += [node]

如何执行node:node?因为当我运行它时,它说,没有定义名称“Node”

我是否应该删除:节点,并在函数中对其进行实例检查?但是,我如何访问节点的属性(我希望它是节点类的实例)?

顺便说一句,我不知道如何在Python中实现类型转换。


共有3个答案

齐财
2023-03-14

用Python

在这个特定的示例中,节点引用自身,如果您运行它,您将得到

NameError: name 'Node' is not defined

要克服此错误,您必须包括:

from __future__ import annotations

它必须是模块中的第一行。在Python 4.0及更高版本中,您不必包含注释

from __future__ import annotations
from dataclasses import dataclass

@dataclass
class Node:
    value: int
    left: Node
    right: Node

    @property
    def is_leaf(self) -> bool:
        """Check if node is a leaf"""
        return not self.left and not self.right

例子:

node5 = Node(5, None, None)
node25 = Node(25, None, None)
node40 = Node(40, None, None)
node10 = Node(10, None, None)

# balanced tree
node30 = Node(30, node25, node40)
root = Node(20, node10, node30)

# unbalanced tree
node30 = Node(30, node5, node40)
root = Node(20, node10, node30)
刁钧
2023-03-14

PEP 563引入了延迟评估,以字符串形式存储在\uuuuuu注释中。用户可以通过\uuuu future\uuuu指令启用此功能:

from __future__ import annotations

这样就可以编写:

class C:
    a: C
    def foo(self, b: C):
        ...

从Python3.10(计划发布2021-10-04)开始,这种行为将是默认的。

编辑2020-11-15:最初它被宣布从Python 4.0开始是强制性的,但是现在它似乎已经在Python 3.10中默认了,预计2021-10-04。这让我感到惊讶,因为它似乎违反了__future__中的promise,即这种向后兼容性直到Python 4.0才会被打破。也许开发人员认为3.10是4.0,或者他们已经改变了主意。另请参见为什么注释的__future__MandatoryRelease3.7和3.8之间发生了变化?。

谭煜
2023-03-14
匿名用户

类型检查中的“自”引用通常使用字符串完成:

class Node:
    def append_child(self, node: 'Node'):
       if node != None:
        self.first_child = node
    self.child_nodes += [node]

PEP-0484的“正向参考”部分对此进行了说明。

请注意,这不做任何类型检查或铸造。这是python(通常)完全忽略的类型提示。但是,第三方工具(例如mypy)使用类型提示对代码进行静态分析,并可能在运行前生成错误。

此外,从python3.7开始,您可以通过使用来自__future__导入注释的隐式地将所有类型提示转换为模块中的字符串(在python4.0中,这将是默认的)。

1这些提示是可以内省的——因此如果您真的愿意,可以使用它们来使用decorator之类的工具构建某种运行时检查器,但python默认情况下不会这样做

 类似资料:
  • 我有一个ABC方法,子类应该返回它们自己的类型,我正在尝试找出最好的方式来类型提示这个方法。例如: 我能想到的最好的是这个,有点重: 我有更好/更干净的方法吗?

  • 有没有办法在类中定义参数的类型,以便该类型引用自身? 例如,以下内容不会运行: 错误:

  • 以下代码: 运行时失败: 为什么不允许像其他语言一样传递null?

  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,

  • JLS 8.1.3就是这样定义词汇封闭类型概念的: 类或接口O是其自身的第0个词汇封闭类型声明。 类O是类C的第n个词汇封闭类型声明,如果它是C的第n-1个词汇封闭类型声明的直接封闭类型声明。 因此,从这个定义中不清楚是否考虑了任何内部类,或者仅仅是类或接口O的内部类。这些是不同的概念,因为最后一个定义如下: 如果O是C的直接封闭类型声明,并且C的声明不在静态上下文中出现,则内部类C是类或接口O的

  • 问题内容: 我想允许使用Python 3进行类型提示,以接受某个类的子类。例如: 现在,当输入以下代码时: 我得到一个PyCharm IDE提示“期望的类型A,取而代之的是Type [B]。” 如何更改此处的类型提示以接受A的任何子类型? 据此(https://www.python.org/dev/peps/pep-0484/#type-definition- syntax ,“该类型的参数也接受