当处理 Python 数据类时,我遇到了这个很容易重现的奇怪错误。
from __future__ import annotations
import dataclasses as dc
import typing
@dc.dataclass
class Test:
foo: dc.InitVar[int]
print(typing.get_type_hints(Test))
Run Code Online (Sandbox Code Playgroud)
运行它会得到以下结果:
Traceback (most recent call last):
File "test.py", line 11, in <module>
print(typing.get_type_hints(Test))
File "C:\Program Files\Python310\lib\typing.py", line 1804, in get_type_hints
value = _eval_type(value, base_globals, base_locals)
File "C:\Program Files\Python310\lib\typing.py", line 324, in _eval_type
return t._evaluate(globalns, localns, recursive_guard)
File "C:\Program Files\Python310\lib\typing.py", line 687, in _evaluate
type_ =_type_check(
File "C:\Program Files\Python310\lib\typing.py", line 173, in _type_check
raise TypeError(f"{msg} Got {arg!r:.100}.")
TypeError: Forward references must evaluate …Run Code Online (Sandbox Code Playgroud) python python-3.x python-dataclasses python-typing python-3.10
我对这种行为感到困惑:我有一个冻结的数据类,其中只需要 10 个,所以我想将它们放入枚举中,并且成功了。后来,我意识到我希望能够为它们命名,突然间,枚举无法实例化数据类。
import enum
import dataclasses as dc
class Stats(int, enum.Enum):
HP = 0
STA = 1
SPD = 2
ATK = 3
DEF = 4
SPATK = 5
SPDEF = 6
@dc.dataclass(frozen=True)
class Strand:
keeps: tuple[Stats, ...]
costs: int
class Strands(Strand, enum.Enum):
VIT = ((Stats.HP,), 1000)
END = ((Stats.STA,), 1000)
LTH = ((Stats.SPD,), 1000)
AGG = ((Stats.ATK,), 1000)
HRD = ((Stats.DEF,), 1000)
GFT = ((Stats.SPATK,), 1000)
DOM = ((Stats.SPDEF,), 1000)
VIGOR = ((Stats.HP, Stats.STA), 5000)
MIGHT = ((Stats.ATK, …Run Code Online (Sandbox Code Playgroud)