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 为类中不存在的成员发送警告的主要内容,如果未能解决你的问题,请参考以下文章