为什么命名数据类字段“date”会导致 RecursionError?
Why does naming a dataclass field `date` cause RecursionError?
from datetime import date
import dataclasses
@dataclasses.dataclass(frozen=True)
class A:
date: date = dataclasses.field()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 1002, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 979, in _process_class
str(inspect.signature(cls)).replace(' -> None', ''))
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 3040, in __str__
formatted = str(param)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 2558, in __str__
formatannotation(self._annotation))
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 1199, in formatannotation
return repr(annotation)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
[Previous line repeated 491 more times]
RecursionError: maximum recursion depth exceeded
但这行得通:
@dataclasses.dataclass(frozen=True)
class A:
date: date
这也是:
@dataclasses.dataclass(frozen=True)
class A:
date_: date = dataclasses.field()
这是错误还是设计使然?
这个:
date: date = dataclasses.field()
不会将 date
注释为 datetime.date
。它将 date
注释为 dataclasses.field()
,因为注释是在赋值之后求值的。 dataclasses
不希望字段将自身作为其注释,您也不希望这样。
使用类似
的东西
import datetime
import dataclasses
@dataclasses.dataclass(frozen=True)
class A:
date: datetime.date = dataclasses.field()
from datetime import date
import dataclasses
@dataclasses.dataclass(frozen=True)
class A:
date: date = dataclasses.field()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 1002, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 979, in _process_class
str(inspect.signature(cls)).replace(' -> None', ''))
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 3040, in __str__
formatted = str(param)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 2558, in __str__
formatannotation(self._annotation))
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 1199, in formatannotation
return repr(annotation)
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/dataclasses.py", line 249, in __repr__
return ('Field('
[Previous line repeated 491 more times]
RecursionError: maximum recursion depth exceeded
但这行得通:
@dataclasses.dataclass(frozen=True)
class A:
date: date
这也是:
@dataclasses.dataclass(frozen=True)
class A:
date_: date = dataclasses.field()
这是错误还是设计使然?
这个:
date: date = dataclasses.field()
不会将 date
注释为 datetime.date
。它将 date
注释为 dataclasses.field()
,因为注释是在赋值之后求值的。 dataclasses
不希望字段将自身作为其注释,您也不希望这样。
使用类似
的东西import datetime
import dataclasses
@dataclasses.dataclass(frozen=True)
class A:
date: datetime.date = dataclasses.field()