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

Python PyCharm为类中不存在成员发送警告,python,python-3.x,pycharm,jetbrains-ide,python-dataclasses,Python,Python 3.x,Pycharm,Jetbrains Ide,Python Dataclasses,PyCharm Python Lint不会对不正确的类成员发出警告。它继续运行我的代码,我有下面的productName成员,而不是productNameTest PyCharm设置拼写错误警告已在桌面上启用,但如果成员“拼写正确”,但在类中不存在,则不会发出警告 我们如何设置PyCharm以向任何成员发送警告 产品型号: @dataclass(init=False) class ProductModel: productId: int productName: str

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

PyCharm
设置
拼写错误警告
已在桌面上启用,但如果成员“拼写正确”,但在类中不存在,则不会发出警告

我们如何设置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
若成员“拼写正确”,但在类中不存在,则不会发出警告

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

类实例

属性赋值和删除更新实例的字典,而不是类的字典。(……)

特殊属性:
\uuuu dict\uuu
是属性字典<代码>\uuuu类\uuuu
是实例的类

如果在赋值之前和之后选中
\uuuuu dict\uuuu
,则可以看到该属性已添加,并且是有效的Python

>>_实例=ProductService(ProductModel(1,“2”))
>>>\u instance.productModel.\u dict__
{'productId':1,'productName':'two'}
>>>获取产品模型(“曲线数据”)
>>>\u instance.productModel.\u dict__
{'productId':1,'productName':'two','productNameTest':'ABCD'}
我们如何设置PyCharm以向任何成员发送警告

这里没有PyCharm linter要警告您的内容,如果您尝试使用第三方linter,也不会有任何警告,了解这一点是程序员的工作。如果您继续阅读上面的文档节选,解决方案就会变得显而易见:您可以做的是实现运行时异常(这不是linter警告):

如果类有一个
\uuuuSetAttr\uuuuuuuuuuuuuuuuuuu()
\uuuuuuuuuDelAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


注意。我将
@dataclass(init=False)
更改为
@dataclass(init=True)
,只是为了方便
\uuuuu init\uuuu
在一行中可用,这个问题涉及的属性分配没有任何变化。

产品服务:
是一个语法错误。请注意,您没有将不存在的名称分配给数据类的实例,而是将其分配给数据类本身-没有实际方法将其检测为错误,因为没有声明类应该具有哪些属性的机制。相反,该类充当其实例具有哪些属性的声明。hi@jasonharper那么解决方案是什么呢?我是否应该重写代码,随意填写答案,然后发送点我正在使用实例方法?@mattsmith5除此之外,它开始变得更复杂,你可以根据你想要做什么的具体情况选择最合适的方法。有趣的是,我设置了@dataclass(init=False),这样我就可以创建一个实例,不必一次设置所有实例成员,由于复杂性和收集数据的原因,我在整个程序中逐步计算它们,您建议不要这样做吗?另外,我知道你们提到的很多关于Python的内容,所以如何在触发错误销售的同时安全地更新值呢?有什么可能的办法吗?setattr没有触发警告,但在这种情况下,您无法获得IDE linter警告(答案说明了原因)。实现
\uuuu setattr\uuuu
显示在我在问题下链接的线程中。