如何覆盖具有字面类型论点的方法?
当我尝试覆盖具有文字
作为其类型提示的参数的方法时,我会从Overrides
模块中获得recursionError(请参见下面的stack Trace)。我不确定为什么会发生这种情况,或者是否有可能覆盖此类方法。
编辑:覆盖
我正在谈论的模块是第三方模块: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
Decorator是一个解决方法,因为它不会改变我的代码行为,但是如果可能的话,我希望将其保留。我的计划是将ARG类型更改为枚举,这可能是一个更好的设计决定。但是我很好奇为什么@Overrides
和字面
的组合不起作用。
这是堆栈跟踪:
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
When I try to override a method that has an argument with Literal
as its type hint, I get a RecursionError from the overrides
module (see stack trace below). I'm not sure why this is happening, or if it is possible to override such methods.
edit: The overrides
module I'm talking about is this third party module: github.com/mkorpela/overrides
Here is a toy example that reproduces my error:
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
Removing the @overrides
decorator is a workaround since it doesn't change my code's behavior, but I would prefer to keep it if possible. My plan is to change the arg type to an Enum which is probably a better design decision anyway. But I'm curious why this combination of @overrides
and Literal
doesn't work.
Here is the stack trace:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如其他人在评论中指出的那样,此行为是第三方
覆盖
模块中的一个错误,我正在使用 https://github.com/mkorpela/overrides )。这是一个已知的错误: https://github.com/mkorpela/overrides/overrides/sissues/94 < /a>As others have noted in the comments, this behavior is a bug in the third party
overrides
module I'm using https://github.com/mkorpela/overrides). It is a known bug: https://github.com/mkorpela/overrides/issues/94程序包中的错误现在已修复。
Bug in the package is now fixed.