VSCode PyLint 未检测到我的 Python DTO 类成员

Posted

技术标签:

【中文标题】VSCode PyLint 未检测到我的 Python DTO 类成员【英文标题】:VSCode PyLint Not detecting my Python DTO Class Members 【发布时间】:2021-06-18 03:33:03 【问题描述】:

Python Lint 不会检测到不正确的类成员。它继续运行我的代码,我在下面有 productName 成员,而不是 productNameTest。它应该发送一个错误。如何解决?目前正在使用 VS Code。

产品型号:

@dataclass(init=False)
class ProductModel:
    
    productId: int
    productName: str

产品服务:

class ProductService:

    def __init__(self, productModel: ProductModel):
        self.productModel= productModel

    def getProductModel(self, curveData):
        self.productModel.productNameTest = "ABCD"  # productNameTest is not a member and should be giving error

【问题讨论】:

"# productNameTest 不是成员,应该给出错误" 你为什么相信?默认情况下,用户定义的 Python 对象可以添加任意属性。 @juanpa.arrivillaga 是否将其限制为一组已定义的成员? 你可以使用__slots__ 好的。您发布的代码毫无意义。 Python 不是 Java。不要假设语言的工作方式相同。例如,为什么您希望productModel 可以在任何地方定义? 它不是。请阅读有关 Python 类定义的教程,而不是随意提问:官方 tutorial 将是一个很好的起点。 我知道任何属性都是允许的,我猜我的 pylint 没有显示错误,可能是 cc @juanpa.arrivillaga,我应该改写问题,谢谢 【参考方案1】:

第一个问题很好:)

这看起来像是 pylint 中的假阴性(对数据类的理解不好?),您可以在 pylint's github 中打开错误或拉取请求来修复问题。

顺便说一句,与评论中所说的相反,您的代码是有意义的。唯一的事情是你不必在 python 中做显式的 getter/setter。你可以有公共属性:

class ProductService:

    def __init__(self, product_model: ProductModel):
        self.product_model= product_model

或私有属性...

class ProductService:

    def __init__(self, productModel: ProductModel):
        self.__product_model= product_model

    @property
    def product_model(self):
        return self.__product_model


    @product_model.setter
    def product_model(self, value):
        self.__product_model = value

在这两种情况下,调用代码都是obj.product_modelobj.product_model = new_value

【讨论】:

以上是关于VSCode PyLint 未检测到我的 Python DTO 类成员的主要内容,如果未能解决你的问题,请参考以下文章

vscode中PyLint报错Unable to import解决方案

vscode pylint报错的问题

vscode安装pylint报错如何解决

在 vscode 中启用 pylint_django 插件,pylint 停止工作

[vscode] pylint在虚拟环境下错误告警问题

解决忽略VScode中Python插件pylint报错的问题