【问题标题】:Debugging trick when working with lists使用列表时的调试技巧
【发布时间】:2011-12-09 05:21:02
【问题描述】:

我遇到了这个sn-p:

li = ['a', 'b', 'c']
print "\n".join(li)

作者说:

当您使用列表时,这也是一个有用的调试技巧。

这里有什么诀窍?

source

【问题讨论】:

  • 他为什么不直接使用 pprint 库?

标签: python debugging list


【解决方案1】:

“诀窍”就是在单独的行中打印列表的每个元素,仅此而已。

【讨论】:

  • 这可以用for item in li: print item来完成这是同样的伎俩?
  • 这是一个风格问题,两个sn-ps的代码本质上都是一样的。可能有人认为使用join 比使用显式循环更有效
【解决方案2】:

打印这样的列表对于调试无用

(1) 如果任何列表项不是字符串,则会出现异常。

(2) 您的标准输出可能无法显示字符串,从而导致异常或乱码。

(3) 您不会看到(例如)制表符 (\t) 和多个空格之间的区别。

好多了:

Python 2.x:print repr(li)

Python 3.x:print(ascii(li))

更新下面是print(li') 在 Python 3.x 上可能发生的情况(上面的问题 2):

>>> li = ['\u0404']
>>> print(li)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\python32\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0404' in position
2: character maps to <undefined>

请注意,print li 在 Python 2.x 上“有效”只是因为 repr() 被隐式调用。一般来说,应该只做print repr(thing)。另请注意,print(li) 在 Python 3.x 上可能会失败,因为它隐式调用 repr(),而不是 ascii()

更新2如果你想在一个列表中找到所有非字符串,明确地去做,不要依赖“技巧”:

>>> def check_list(li):
...     for x, v in enumerate(li):
...         if not isinstance(v, (str, unicode)):
...             print "Type %s (%r) at offset %d" % (type(v), v, x)
...
>>> check_list(['\xff', 2, u'\u0303', 4.0])
Type <type 'int'> (2) at offset 1
Type <type 'float'> (4.0) at offset 3

【讨论】:

    【解决方案3】:

    “诀窍”是"\n".join(li) 在显示屏上写入 li 的所有元素所需的时间比以下代码要少:

    for x in li:
        print li
    

    如果 li 的元素很少,则不会真正感受到差异。
    但是用一长串测试一下区别,就很明显了

    不过,“诡计”这个词有点过分了。

    【讨论】:

    • 那么,和调试代码和找bug没有关系?
    • 我同意你的观点,我看不出这与调试有什么关系。 _ 顺便说一句,我不是会写这个“技巧”信息吗?
    • 我不明白你的问题。你说你是作者?你的回答很有用。我只是好奇是否有一些调试技巧。
    • 你的问题让我想起了我曾经写过一篇文章说"\n".join(...) 非常有用,我想知道我是否不是引用的作者,虽然后者指的是调试(但想法可能随时间变化)。我搜索了这个帖子:(stackoverflow.com/a/5694834/551449) 现在我可以看到我不是暗示调试的引文的作者。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2019-01-09
    相关资源
    最近更新 更多