gpt4 book ai didi

Python Astroid (Pylint) 当类通过工厂时如何模拟继承?

转载 作者:行者123 更新时间:2023-12-01 09:02:38 26 4
gpt4 key购买 nike

在我工作的地方,我们广泛使用 SQLAlchemy。经过一段时间的努力,我们为我们的模型开发了一个适合我们需求的基类。但是,当需要检查我们的代码时,我们总是会被我们知道可以忽略的警告所淹没。但到目前为止,我们只能使用generate-members指令在全局范围内做到这一点,这往往会隐藏问题。所以我开始想:“我怎样才能教 pylint 呢?”

情况如下:

from sqlalchemy.ext.declarative import declarative_base

class CustomBaseModel(object):
def feature(self):
pass

Model = declarative_base(cls=CustomBaseModel)

class Thing(Model):
id = Column(Integer, primary_key=True)
label = Column(String(64))

t = Thing()
t.feature() # Pylint says Thing has not `feature()` method.

所以我想做的是告诉 pylint Model 实际上或多或少是 CustomBaseModel。

因此看起来我应该使用 inference_tip调用 declarative_base() 的返回值。但我不太确定如何继续。看起来 API 随着时间的推移而改变,我不会去任何地方。

我研究的另一个策略是将 CustomBaseModel 上找到的属性复制到模型。但这不起作用。事实上,对于 Pylint Model 来说,它似乎只是一个名称……它忘记了它是什么,也不知道它是一个类。

任何提示将不胜感激......

最佳答案

如果你替换这个:

Model = declarative_base(cls=CustomBaseModel)

像这样:

def base_decorator(cls):
return declarative_base(cls = cls)

@base_decorator
class Model(CustomBaseModel):
pass

这将导致类似于以下执行顺序的结果:

class Model(CustomBaseModel):
pass
Model = declarative_base(cls = Model)

这在功能上与示例代码中的直接调用相同,但它给出 pylint一条线索Model源自CustomBaseModel .

关于Python Astroid (Pylint) 当类通过工厂时如何模拟继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52354591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com