首页 > 解决方案 > 为什么将数据类字段命名为“日期”会导致递归错误?

问题描述

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()

这是一个错误,还是设计使然?

标签: pythonpython-3.xpython-dataclasses

解决方案


这个:

date: date = dataclasses.field()

不注释datedatetime.date. 它注释datedataclasses.field(),因为注释是在赋值之后评估的。dataclasses不希望字段将自身作为其注释,您也不希望这样。

使用类似的东西

import datetime
import dataclasses

@dataclasses.dataclass(frozen=True)
class A:
  date: datetime.date = dataclasses.field()

推荐阅读