Cod*_*ice 5 python debugging pycharm
如何调试使用生成器和迭代器的代码?我发现添加for带有print语句的循环会消耗生成器/迭代器,因此会破坏其余的代码。是否可以在不消耗元素的情况下检查生成器/迭代器的“内容”?
更具体地说,我有这样的事情:
result = map(func, x)
现在我想看看result是什么。我还想查看通过将函数应用于 中的每个元素而返回的值result。result在我的实际代码中,我得到了给出该函数最小值的元素:
best = min(result, key=my_key)
现在min()非常方便,但我的行为不正确,需要找出原因。我可以使用哪些工具来调试此类内容?
ps 我正在使用 PyCharm。我对交互式调试器非常满意,但仍然不知道如何查看这里发生的一切。
如果要打印函数参数的值以及返回的值,可以使用包装器来包装原始函数并打印传递到 或 的值func及其my_key返回值。就像是
def debug_func(func):
    @functools.wraps(func)
    def wrapper(*a, **kw):
        print('Arguments', a, kw)
        rv = func(*a, **kw)
        print('Return value', repr(rv))
        return rv
    return wrapper
使用示例:
>>> list(map(debug_func(len), ['foo', 'bar', 'foobar']))
Arguments ('foo',) {}
Return value 3
Arguments ('bar',) {}
Return value 3
Arguments ('foobar',) {}
Return value 6
[3, 3, 6]
或者
>>> min(['foo', 'bar', 'foobar'], keydebug_func(len))
Arguments ('foo',) {}
Return value 3
Arguments ('bar',) {}
Return value 3
Arguments ('foobar',) {}
Return value 6
'foo'
类似的方法也可用于迭代器:
def debug_iter(iterator):
    while True:
         value = next(iterator)
         print('Iterator yielded', repr(value))
         yield value
用法:
>>> [i for i in debug_iter(i ** 2 for i in range(5)) if i % 2]
Iterator yielded 0
Iterator yielded 1
Iterator yielded 4
Iterator yielded 9
Iterator yielded 16
[1, 9]
| 归档时间: | 
 | 
| 查看次数: | 4279 次 | 
| 最近记录: |