Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调试生成器和迭代器_Python_Debugging_Pycharm - Fatal编程技术网

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]