【问题标题】:Showing class attributes in the PyCharm debugger when subclassing str子类化 str 时在 PyCharm 调试器中显示类属性
【发布时间】:2019-06-18 00:09:03
【问题描述】:

我想在调试器中查看str 子类的类属性。

参考图片 - 我想在a 旁边有下拉箭头(这是一个POSString 对象)。换句话说,在 Pycharm 调试器中,我希望可以选择双击 a 并查看属性 bar 的值 "HELLO",就像 foo 对象一样。

这在 PyCharm 中是否可行,如果可以,如何实现?

两个类:

class Foo:
    bar = "HELLO"


class POSString(str):
    bar = "HELLO"

    def __init__(self, pos="", *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pos = pos

    def __hash__(self):
        return hash((str(self), self.pos))

    def __eq__(self, other):
        return super().__eq__(other) and self.pos == other.pos

以及我如何创建我的两个对象:

foo = Foo()
a = POSString("banana")

我正在使用 Python 3.7.1。

PyCharm:

PyCharm 2018.2.5 (Professional Edition)
Build #PY-182.5107.22, built on November 13, 2018
JRE: 1.8.0_152-release-1248-b22 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.15.0-43-generic

【问题讨论】:

    标签: python debugging pycharm


    【解决方案1】:

    PyCharm 目前没有配置在调试工具窗口的Variables Tab 中显示该详细信息的设置。 IDE 根据对象的类型自动做出大多数显示决定。当前唯一可用的选项是使用 File > Settings > Build, Execution, Deployment > Debugger > Data Views @98765433@ (更详细的解释见this post)。

    这对于调试而言可能不方便,问题中的示例class 与字符串完全一样显示,因为该类继承自字符串。这是 IDE 的决定,目前无法更改(除了通过 JetBrains 发布功能请求)。

    替代方法是在变量选项卡中设置“观察”或使用控制台。另一个更不方便的选择是将类本身更改为不继承自字符串(在这种情况下,它将像常规类一样显示)但是这可能会破坏代码中的任何数量的功能,因此获得的调试便利性可能会被造成的不便。

    【讨论】:

      【解决方案2】:

      只需使用 POSString 对象__dict__ 属性分配一个变量:

      a = POSString('HELLO')
      _a = a.__dict__
      

      然后就可以通过_a访问a的所有属性了。

      其他方法是不继承str,将str 添加到属性并覆​​盖__getattribute__ 方法以将调用转发到str 对象。

      class POSString():
          bar = "HELLO"
      
          def __init__(self, pos="", *args, **kwargs):
              #super().__init__(*args, **kwargs)
              self.str = str(*args, **kwargs)
              self.pos = pos
      
          def __hash__(self):
              #return hash((str(self), self.pos))
              return hash((self.str, self.pos)) 
      
          def __eq__(self, other):
              #return super().__eq__(other) and self.pos == other.pos
              return self.str.__eq__(other) and self.pos == other.pos  
      
          def __getattr__(self, attr):
              return getattr(self.str, attr)
      

      毕竟,我认为从str继承并不是一个好习惯

      【讨论】:

      • 抱歉,搞错了,我已经修复了
      • 这不起作用的原因是因为它会破坏字符串类型的依赖关系,您的代码使用问题中的原始POSString。所以这不是一个解决方案,除非新对象定义为strthe full interface,它是由原始对象继承的。例如 isinstance(POSString, str)True 用于原始但 False 用于您的实现。我在答案的链接帖子中提到了这一点。因此,在 IDE 中为您需要的内容设置变量 watch 仍然比更改代码更简单。
      • 唯一理想的解决方案是 JetBrains 在 PyCharm 的 Variables Tab 中为此案例实现新的显示。
      猜你喜欢
      • 2018-10-29
      • 2013-12-24
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多