如何覆盖具有字面类型论点的方法?

发布于 2025-02-06 06:03:37 字数 4297 浏览 2 评论 0原文

当我尝试覆盖具有文字作为其类型提示的参数的方法时,我会从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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你好,陌生人 2025-02-13 06:03:37

正如其他人在评论中指出的那样,此行为是第三方覆盖模块中的一个错误,我正在使用 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

为你鎻心 2025-02-13 06:03:37

程序包中的错误现在已修复。

Bug in the package is now fixed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文