从ctypes.structure和Mapping

问题描述 投票:0回答:1

为以下python代码:

import ctypes
from collections.abc import Mapping

class StructureMeta(type(ctypes.Structure), type(Mapping)):
    pass

class Structure(ctypes.Structure, Mapping, metaclass=StructureMeta):
    pass

struct = Structure()
assert isinstance(struct, ctypes.Structure)
assert isinstance(struct, Mapping)

从CTYPES.ctypes.structure(MetAclass

_ctypes.PyCStructType
)和映射(Metaclass
abc.ABCMeta
)时,需要元素以避免元口冲突。

使用Python 3.11执行时,这可以正常工作。 las,Pylint 3.3.4报告了两个错误:

test.py:5:0: E0240: Inconsistent method resolution order for class 'StructureMeta' (inconsistent-mro) test.py:9:0: E1139: Invalid metaclass 'StructureMeta' used (invalid-metaclass)
我如何更改元类以修复孔报告报告的错误?这是一个问题吗?

python multiple-inheritance pylint metaclass
1个回答
0
投票
您可以证明,此代码中没有“错误”。

用元类加工很难 - 在这种情况下必须创建一个兼容的元素,显示了一些副作用。

问题是元组所做的大部分是在执行代码时生效的事情(即在运行时) - 而分析工具(例如Pylint,Pyright,Mypy)都试图看Python,就像是静态语言一样,并且他们进化,他们结合了模式,以了解语言的动力更多。 您只是达到了一步,即pylint(或任何工具)尚未达到的步骤 - 普通的解决方法只是忽略其假错误消息(通过在侵权行行中添加#NOQA或同等评论)。

执行不忽略鳞片错误

没有,真的,不要这样做!这是我20岁以上的专业专业人士和咨询人员和100k+ stackoverflow Python人:在这种情况下,闭嘴QA工具,如上所述。

但为了娱乐和完整,这是避免使用Linter-Error的途径(涉及更多的实验代码实践,并且具有惊喜的副作用,而不仅仅是沉默QA工具):

方法可能没有使用映射基类,因为它具有相互冲突装饰器) - 这样一来,
    Mapping.register
  • 仍然是真实的。 当然,在重新实现所有善良时,这意味着要加强所有映射逻辑,以便只需实施一些方法。
  • 确定,我们可能只是通过将其所有方法复制到另一个平原,班级的“非抽象”版本的映射版本 - 并将其用于与
isinstance(struct, Mapping)

collections.abc.Mapping

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.