Python 参数注释未解析的引用



为什么说找不到我的类?为什么我应该创建另一个同名的类才能让它不抱怨?

from typing import Dict

class WeekDay:
def __init__(self, day_number, day_name):
self.day_name = day_name
self.day_number = day_number
@staticmethod
def get_week_days() -> Dict[str, WeekDay]:  # WeekDay unresolved reference error
weekdays = {
"monday": WeekDay(1, "Monday"),
"tuesday": WeekDay(2, "Tuesday"),
"wednesday": WeekDay(3, "Wednesday"),
"thursday": WeekDay(4, "Thursday"),
"friday": WeekDay(5, "Friday"),
"saturday": WeekDay(6, "Saturday"),
"sunday": WeekDay(7, "Sunday")
}
return weekdays

来自文档(部分转发参考)

当类型提示包含尚未定义的名称时,该定义可以表示为字符串文本,以便稍后解析。

通常发生这种情况的情况是 容器类,其中定义的类出现在签名中 的一些方法。

因此,为了解决这个问题,只需用引号包装类型,如下所示:

from typing import Dict

class WeekDay:
def __init__(self, day_number, day_name):
self.day_name = day_name
self.day_number = day_number
@staticmethod
def get_week_days() -> Dict[str, 'WeekDay']:  # quote WeekDay 
weekdays = {
"monday": WeekDay(1, "Monday"),
"tuesday": WeekDay(2, "Tuesday"),
"wednesday": WeekDay(3, "Wednesday"),
"thursday": WeekDay(4, "Thursday"),
"friday": WeekDay(5, "Friday"),
"saturday": WeekDay(6, "Saturday"),
"sunday": WeekDay(7, "Sunday")
}
return weekdays

从 Python3.7 开始,您可以使用:from __future__ import annotations

您不能从类自己的定义中引用该类

class A:
def foo(self):
pass
bar = A.foo

这将引发以下错误:

Traceback (most recent call last):
class A:
File "/home/shmulik/so/ans.py", line 28, in A
bar = A.foo
NameError: name 'A' is not defined

作为解决此问题的解决方法,PEP484 - 类型提示(感谢@ashwini-chaudhary的评论)允许将类定义编写为字符串。

当类型提示包含尚未定义的名称时,该 定义可以表示为字符串文本,稍后要解决。

因此,我们可以例如编写:

class A:
def foo(self, x: 'A'):
pass

并且这个类将被 Python 愉快地解释。

旁注

所以嘿,你在第一个示例中提到我们不能从它的定义中引用类,那么为什么这段代码有效呢?

class A:
def foo(self):
A.bar()
@staticmethod
def bar():
print(42)

A().foo()

这段代码的工作原理是 Python 解释器在类A的定义过程中跳过foo()的方法定义的主体,只有在最后一行,当调用foo()时(并且定义了类 A),Python 解释器才会执行foo()的主体并调用A.bar()

最新更新