【问题标题】:Unresolved attribute reference 'cfg' for class 'Runattr'类“Runattr”的未解析属性引用“cfg”
【发布时间】:2021-04-06 08:18:18
【问题描述】:

我已经声明了一个类如下:

class Runattr:
    pass

run = Runattr()
run.cfg = 'some str'

当我尝试在我的代码中进一步访问 run.cfg 时,PyCharm 给我以下警告,我无法自动完成 run.cfg:

类“Runattr”的未解析属性引用“cfg”检查信息:此检查检测到应该解析但没有解析的名称。由于动态调度和鸭子类型,这在有限但有用的情况下是可能的。顶级项和类级项的支持比实例项更好。

我是使用类的新手。有人能告诉我为什么我会看到这个警告吗?可以修改它以消除警告吗?

【问题讨论】:

    标签: python python-3.x pycharm python-class


    【解决方案1】:

    这只是一个 PyCharm 警告(不是错误!),因为它无法确定该类是否真的应该具有 cfg 属性。

    假设您使用的是现代 Python 版本,请为此类字段添加注释:

    class Runattr:
        cfg: str  # denotes there would/could be a string `cfg`
    
    run = Runattr()
    run.cfg = 'some str'
    

    类和实例仍然可以有任何属性(见鬼,你甚至可以使用setattr(run, "oh this is fun", True) 来获得一个不是有效 Python 标识符的属性),只是 IDE 不能对这里的动态特性无限智能。

    【讨论】:

      【解决方案2】:

      您必须在名为 cfg 的字段上声明

      class Runattr:
          cfg = ''
      
      run = Runattr()
      run.cfg = 'some str'
      

      【讨论】:

      • 这将声明一个名为 cfg 的类级变量,除非另有重新分配,否则它将在每个 Runattr 实例上为空字符串。
      • 谢谢@Yehonatan。我是否必须为使用 run 对象创建的所有属性执行此操作?没有在类主体中定义它们的情况下动态创建类属性的方法吗?
      • 你可以使用 var_name(作为字符串)中的字典来赋值,并且只在这个字典上声明
      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 2021-05-16
      • 2021-08-13
      • 2021-09-30
      • 2017-10-07
      • 2022-08-03
      • 2019-05-04
      • 2015-02-03
      相关资源
      最近更新 更多