Python 调试生成器和迭代器
如何调试使用生成器和迭代器的代码?我发现使用Python 调试生成器和迭代器,python,debugging,pycharm,Python,Debugging,Pycharm,如何调试使用生成器和迭代器的代码?我发现使用print语句添加for循环会消耗生成器/迭代器,因此会中断其余代码。是否可以在不使用元素的情况下检查生成器/迭代器的“内容” 更具体地说,我有这样的想法: result = map(func, x) 现在我想看看结果是什么。我还想查看对结果中的每个元素应用函数返回的值。在我的实际代码中,我在result中得到元素,该元素给出该函数的最小值: best = min(result, key=my_key) 现在min()非常方便,但我的行为不正确,需
print
语句添加for
循环会消耗生成器/迭代器,因此会中断其余代码。是否可以在不使用元素的情况下检查生成器/迭代器的“内容”
更具体地说,我有这样的想法:
result = map(func, x)
现在我想看看结果是什么。我还想查看对结果中的每个元素应用函数返回的值。在我的实际代码中,我在result
中得到元素,该元素给出该函数的最小值:
best = min(result, key=my_key)
现在min()
非常方便,但我的行为不正确,需要找出原因。我可以使用哪些工具来调试类似的东西
p、 我正在使用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]
或
迭代器也可以使用类似的方法:
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]
>>> [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]