为以下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
)和映射(Metaclassabc.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)
我如何更改元类以修复孔报告报告的错误?这是一个问题吗?
用元类加工很难 - 在这种情况下必须创建一个兼容的元素,显示了一些副作用。
问题是元组所做的大部分是在执行代码时生效的事情(即在运行时) - 而分析工具(例如Pylint,Pyright,Mypy)都试图看Python,就像是静态语言一样,并且他们进化,他们结合了模式,以了解语言的动力更多。 您只是达到了一步,即pylint(或任何工具)尚未达到的步骤 - 普通的解决方法只是忽略其假错误消息(通过在侵权行行中添加#NOQA或同等评论)。执行不忽略鳞片错误
没有,真的,不要这样做!这是我20岁以上的专业专业人士和咨询人员和100k+ stackoverflow Python人:在这种情况下,闭嘴QA工具,如上所述。
但为了娱乐和完整,这是避免使用Linter-Error的途径(涉及更多的实验代码实践,并且具有惊喜的副作用,而不仅仅是沉默QA工具):
Mapping.register
isinstance(struct, Mapping)
collections.abc.Mapping