在 Python 中的同一个外部 class 中命名一个嵌套的 typing.NamedTuple
Name a nested typing.NamedTuple in the same outer class in Python
我在 Python 中遇到问题我可以解决,但我真的很想了解为什么它不能按我认为的方式工作。
我有一个 class A
,它嵌套了 typing.NamedTuple
s 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
.
我在 Python 中遇到问题我可以解决,但我真的很想了解为什么它不能按我认为的方式工作。
我有一个 class A
,它嵌套了 typing.NamedTuple
s 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
.