【发布时间】:2022-08-05 12:39:11
【问题描述】:
当我尝试覆盖一个以Literal 作为其类型提示的参数的方法时,我从overrides 模块中得到一个RecursionError(参见下面的堆栈跟踪)。我不确定为什么会发生这种情况,或者是否可以覆盖这些方法。
编辑:我正在谈论的overrides 模块是这个第三方模块:github.com/mkorpela/overrides
这是一个重现我的错误的玩具示例:
from typing import Literal
from overrides import overrides
class Base:
def foo(self, mode: Literal[\"train\"]) -> None:
raise NotImplementedError()
class Child(Base):
@overrides
def foo(self, mode: Literal[\"train\"]) -> None:
pass
删除 @overrides 装饰器是一种解决方法,因为它不会改变我的代码的行为,但如果可能的话,我更愿意保留它。我的计划是将 arg 类型更改为 Enum,这可能是一个更好的设计决策。但我很好奇为什么@overrides 和Literal 的这种组合不起作用。
这是堆栈跟踪:
Traceback (most recent call last):
File \"model-autotraining/temp.py\", line 12, in <module>
class ChildModel(BaseClass):
File \"model-autotraining/temp.py\", line 14, in ChildModel
def foo(self, mode: Literal[\"train\"]) -> None:
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/overrides.py\", line 88, in overrides
return _overrides(method, check_signature, check_at_runtime)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/overrides.py\", line 114, in _overrides
_validate_method(method, super_class, check_signature)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/overrides.py\", line 135, in _validate_method
ensure_signature_is_compatible(super_method, method, is_static)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/signature.py\", line 94, in ensure_signature_is_compatible
ensure_all_kwargs_defined_in_sub(
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/signature.py\", line 153, in ensure_all_kwargs_defined_in_sub
and not _issubtype(super_type_hints[name], sub_type_hints[name])
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/overrides/signature.py\", line 42, in _issubtype
return issubtype(left, right)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 428, in issubtype
return _is_normal_subtype(normalize(left), normalize(right), forward_refs)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 251, in normalize
args = _normalize_args(args)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in _normalize_args
return tuple(_normalize_args(type_) for type_ in tps)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in <genexpr>
return tuple(_normalize_args(type_) for type_ in tps)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in _normalize_args
return tuple(_normalize_args(type_) for type_ in tps)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in <genexpr>
... repeated many times ...
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in _normalize_args
return tuple(_normalize_args(type_) for type_ in tps)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 232, in <genexpr>
return tuple(_normalize_args(type_) for type_ in tps)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/site-packages/typing_utils/__init__.py\", line 231, in _normalize_args
if isinstance(tps, collections.abc.Sequence):
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/abc.py\", line 98, in __instancecheck__
return _abc_instancecheck(cls, instance)
File \"/opt/homebrew/Caskroom/miniforge/base/envs/worker/lib/python3.8/abc.py\", line 102, in __subclasscheck__
return _abc_subclasscheck(cls, subclass)
RecursionError: maximum recursion depth exceeded in comparison
-
\"来自覆盖模块。\" 这到底是从哪里来的?它does not appear to be a standard library module。这看起来像是该第三方功能中的一个错误,应该这样报告。
-
没错,它是第三方模块:github.com/mkorpela/overrides。我会将此作为错误报告给他们。我不确定这是否只是一个错误,或者是否有一些更根本的原因此代码不起作用。
-
那里的讨论说这实际上是
typing_utils中的一个错误。 github.com/bojiang/typing_utils/issues/10。有一个带有修复的 PR,但尚未合并。
标签: python types overriding literals