【问题标题】:python IDLE debugger self variablepython IDLE调试器自变量
【发布时间】:2017-12-09 15:40:18
【问题描述】:

有没有办法在调试时监视 self.{name} 而没有下面的额外行,并且有人知道(好的做法)如何省略 self。部分代码(在其他方法主体的第 4 行之后),它会使其更具可读性?

class QuickFindUf(object):

    def __init__(self, n):
        self._id = []

        for i in xrange(n):
            self._id.append(i)

    def connected(self, p, q):
        return self._id[p] == self._id[q]

    def union(self, p, q):
        pid = self._id[p]
        qid = self._id[q]

        l = self._id # debug only

        for i in xrange(len(self._id)):
            if self._id[i] == pid: 
                self._id[i] = qid

【问题讨论】:

  • 对象没有名字,只有引用。此外,Python 需要指定 self。
  • 谢谢,self 部分很明显,问题是第 4 行之后的某种解决方法。无论如何,好点,我已经在 qn 中添加了说明。

标签: python debugging python-idle


【解决方案1】:

由于以后需要n,所以保存它。据我所知,__init__ 将 self._id 设置为 range(n) (3.x 中的 list(range(10) ),所以其余的可以压缩。

def __init__(self, n):
    self.n = n
    self._id = range(n)  # list(range(n)) in 3.x.

在任何情况下,在方法中只查找一次 self 的属性,如在l = self._id 中并使用直接的尊重,此后,这里 l 是标准做法,而不是解决方法或仅用于调试的事情。我会这样写联合:

def union(self, p, q):
    l = self._id
    pid = l[p]
    qid = l[q]
    for i in xrange(n):
        if l[i] == pid: 
            l[i] = qid

如果 p 或 q 超出范围,您可能会考虑该怎么做。您还有其他问题吗?

【讨论】:

  • 谢谢,特里。 self._id 的本地名称很好。关于范围,你的意思是我不需要 xrange 因为我只创建一次列表?我在某处读到 xrange 是 Python 3.x 中的默认实现
  • P.S.我明白了,你的意思是 3.x 中的等价物只是 rage 并使用列表构造函数。对于加权版本的所有索引,我需要另一个值为 1 的列表,因此我可能会坚持使用 for 循环。
  • 对于1的列表,3 * [1] == [1, 1, 1]
  • 哈哈,很好 :) 谢谢,我可能会更改我的代码 n * [1],看起来很干净
猜你喜欢
  • 2011-09-13
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2013-05-12
  • 2020-01-18
相关资源
最近更新 更多