【问题标题】:PyCharm send warning for no member existing in classPyCharm 为类中不存在的成员发送警告
【发布时间】: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 最合适的要看你想做什么的具体情况了。

标签: python python-3.x pycharm jetbrains-ide python-dataclasses


【解决方案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__
猜你喜欢
  • 2020-05-22
  • 2017-12-08
  • 1970-01-01
  • 2017-11-08
  • 2021-12-07
  • 1970-01-01
  • 2021-12-22
  • 2019-05-27
  • 2010-10-10
相关资源
最近更新 更多