PyCharm 为类中不存在的成员发送警告

Posted

技术标签:

【中文标题】PyCharm 为类中不存在的成员发送警告【英文标题】:PyCharm send warning for no member existing in class 【发布时间】:2021-06-19 16:44:39 【问题描述】:

PyCharm Python Lint 不会对不正确的类成员发出警告。它继续运行我的代码,我下面有productName 成员,而不是productNameTest

PyCharm Settings > Misspelling Warnings 在桌面上启用,但是如果成员“拼写正确”但在课堂上不存在,则不会发出警告。

我们如何设置 PyCharm 以发送没有成员的警告?

产品型号:

@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 give warning

【问题讨论】:

Product Service: 是语法错误。 请注意,您没有将不存在的名称分配给 DataClass 的实例,而是将其分配给 DataClass 本身 - 没有实际的方法检测为错误,因为没有声明类应该具有哪些属性的机制。相反,该类充当其实例具有哪些属性的声明。 嗨@jasonharper 那么解决方案是什么?我应该重写代码吗,随意放置答案,我可以发送积分 我使用的是实例方法? @mattsmith5 超出这个就开始复杂了,你可以use these techniques 最合适的要看你想做什么的具体情况了。 【参考方案1】:

如果成员“拼写正确”但在类中不存在,则不会发出警告。

这不是 Python 类实例的工作方式。您正在做的是一个属性分配,它有效地将属性productNameTest 添加到ProductModel 的实例中ProductService 的实例中。 Python 允许这样的属性 - 如下所述 - 因为它是动态的,并且数据类定义不禁止在实例上动态设置属性。

3. Data model

类实例

属性分配和删除会更新实例的字典,而不是类的字典。 (...)

特殊属性:__dict__是属性字典; __class__ 是实例的类。

如果你在赋值前后检查__dict__,你可以看到属性被添加并且是有效的Python。

>>> the_instance = ProductService(ProductModel(1, "two"))
>>> the_instance.productModel.__dict__

'productId': 1, 'productName': 'two'

>>> the_instance.get_product_model("curve_data_str")
>>> the_instance.productModel.__dict__

 'productId': 1, 'productName': 'two', 'productNameTest': 'ABCD'

我们如何设置 PyCharm 以发送没有成员的警告?

PyCharm linter 没有任何警告你的地方,如果你尝试使用 3rd 方 linter 也不会发出警告,这是程序员的工作了解这一点。如果您继续阅读上面的文档摘录,解决方案就会变得很明显:您可以做的是实现运行时异常(这不是 linter 警告):

如果类有__setattr__()__delattr__() 方法,则调用此方法而不是直接更新实例字典。

注意。我将@dataclass(init=False) 更改为@dataclass(init=True) 只是为了方便将__init__ 放在一行中,它不会改变与此问题有关的属性分配的任何内容。

【讨论】:

有趣,顺便说一句,我设置了@dataclass(init=False),这样我就可以创建一个实例,而不必设置所有的实例成员一次,我在整个程序中逐渐计算它们对于复杂性和收集数据,您是否建议不要这样做?或有其他选择 另外,我知道你提到的很多关于 Python 的项目,那么如何在触发拼写错误的同时安全地更新值?有什么可能的方法吗? setattr 也没有触发警告 对于这种情况,您无法获得 IDE linter 警告(答案说明了为什么不这样做)。我在问题下链接的线程中显示了实现__setattr__

以上是关于PyCharm 为类中不存在的成员发送警告的主要内容,如果未能解决你的问题,请参考以下文章

字典中不存在给定的键 - 错误和警告

如果父类中不存在,则调用子类函数

类继承和重写的区别

Web.xml警告“对Web内容中不存在的主文件名引用”

向量中不存在 C++ 字符串成员变量

Java---继承