在 Python 中的同一个外部 class 中命名一个嵌套的 typing.NamedTuple

Name a nested typing.NamedTuple in the same outer class in Python

我在 Python 中遇到问题我可以解决,但我真的很想了解为什么它不能按我认为的方式工作。

我有一个 class A,它嵌套了 typing.NamedTuples B 和 C。到目前为止一切顺利。当嵌套的命名元组 C 应该具有类型 A.B 的属性时,问题就会出现,即第一个命名元组的类型,如下所示:

import typing

class A:
  class B(typing.NamedTuple):
    foo: int

  class C(typing.NamedTuple):
    bar: B

因此使用 B 不适用于以下错误消息 NameError: name 'B' is not defined,尽管以下工作代码建议它应该:

import typing

class A:
  class B(typing.NamedTuple):
    foo: int

  foobar = B(3)

(此代码还使用 mypy 签出,顺便说一句)

所以我尝试了:

  class C(typing.NamedTuple):
    bar: A.B

在 mypy 中签出但在 运行 和 NameError: name 'A' is not defined

时失败

所以我的问题是我什至可以将 class C 的属性键入 A.B 吗?如果是这样,我该怎么做?

谢谢!

PS:这些东西当然可以使用 classes/collections.NamedTuple 等

没有类型提示

相关:

这里有一个细微的变体,其中 C.bar 的类型是 C 的父级的嵌套 class,但它仍然以相同的方式结束:Python 得到迷路了。

您可以将 double-quotes 添加到您的 type-hint (bar: "B"),这样就不会导致 NameError。 mypy 必须是 bar: "A.B" 才能通过。
或者您可以在文件的最顶部添加 from __future__ import annotations.