关于未解析的属性引用的Pycharm可视警告

Fer*_*dox 13 python pycharm

我有两个类看起来像这样:

class BaseClass(object):

    def the_dct(self):
        return self.THE_DCT


class Kid(BaseClass):

    THE_DCT = {'vars': 'values'}


# Code i ll be running
inst = Kid()
print(inst.the_dct)
Run Code Online (Sandbox Code Playgroud)

继承必须这样; 第二类包含THE_DCT和第一类包含def the_dct.

它工作得很好,但我的问题是,我得到了Pycharm(未解析属性引用)的警告,大约THE_DCTBaseClass.

  • 它有什么理由警告我(为什么我应该避免它)?
  • 有什么我应该做的不同?

dur*_*rsk 13

BaseClass你的引用中self.THE_DCT,当PyCharm查看这个类时,它看到它THE_DCT不存在.

假设您将此视为抽象类,PyCharm不知道这是您的意图.它看到的只是一个访问属性的类,它不存在,因此它显示警告.

虽然你的代码运行得很好(只要你永远不会实例化BaseClass),你应该把它改为:

class BaseClass(object):
    THE_DCT = {}

    def the_dct(self):
        return self.THE_DCT
Run Code Online (Sandbox Code Playgroud)

  • 这与性能无关.不要因为"性能"而编写错误的代码. (6认同)
  • _你真的应该将其更改为_如果我不更改它,我可能会遇到什么问题?另外,在“BaseClass”中定义“THE_DCT”是否会不必要地降低性能(可能是微小的降低)? (2认同)
  • 是。不要编写依赖于继承的代码来查找未定义的变量。这是非常不好的做法。将变量定义为占位符,并注释继承将如何替换此类定义。@费米帕拉多克斯 (2认同)

And*_*rew 10

除了现有答案之外,或者作为替代方案,您可以使用Type Hints. 这满足了 PyCharm 的警告,并且还将属性区分为继承的(或至少不是类的本机属性)。THE_DCT: dict就像在班级的最顶部添加一样简单(在其他任何事情之前)。

class BaseClass(object):
    THE_DCT: dict  # Add a type-hint at the top of the class, before anything else

    def the_dct(self):
        return self.THE_DCT


class Kid(BaseClass):
    THE_DCT = {'vars': 'values'}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法,因为它不需要添加不必要的占位符属性 ( self.THE_DCT = {}),而且因为它在视觉上与声明属性不同,所以它还不需要在占位符属性旁边添加注释来解释它是继承的。