gpt4 book ai didi

Python3 : Does the built-in function "map" have a bug?

转载 作者:行者123 更新时间:2023-12-04 02:37:44 24 4
gpt4 key购买 nike

以下是我使用 Python 3.8.1(在 macOS Mojave,10.14.6 上,作为
以及其他一些平台上的 Python 3.7(或更旧的))。我是新来的
计算,不知道如何要求改进
语言,但我想我发现了内置的一个奇怪的行为
功能map .

如代码 next(iter(()))引发 StopIteration ,我预计
获取 StopIteration从以下代码:
tuple(map(next, [iter(())]))
令我惊讶的是,这默默地返回了元组 () !

所以看起来 map 对象的解包停止了StopIteration来自 next命中“空”迭代器
返回者 iter(()) .但是,我不认为异常(exception)是
正确处理,如 StopIteration在“空”之前没有被提出
迭代器是从列表中挑选出来的(被 next 命中)。

  • 我是否正确理解了这种行为?
  • 这种行为是否有意为之?
  • 这会在不久的将来改变吗?或者我怎样才能得到它?

  • 编辑:如果我以不同的方式解压 map 对象,行为是相似的,例如通过 list , for 循环, 在列表中解包, 为函数参数解包, by set , dict .所以我相信它不是 tuple但是 map那是错误的。

    编辑:实际上,在 Python 2 (2.7.10) 中,“相同”代码引发 StopIteration .我认为这是理想的结果(除了在这种情况下 map 不返回迭代器)。

    最佳答案

    这不是 map漏洞。 Python 决定依赖异常来控制流是一个丑陋的后果:实际的错误看起来像正常的控制流。

    map电话nextiter(()) , next引发 StopIteration .此 StopIterationmap.__next__ 传播出去并进入 tuple称呼。此 StopIteration看起来像 StopIteration那个map.__next__通常会升高以表示 map 结束,因此 tuple认为 map 只是没有元素。

    这会导致比您看到的更奇怪的后果。例如,map当映射函数引发异常时,迭代器不会将自身标记为已耗尽,因此您甚至可以在之后继续迭代它:

    m = map(next, [iter([]), iter([1])])

    print(tuple(m))
    print(tuple(m))

    输出:
    ()
    (1,)

    (CPython map 实现实际上没有办法将自己标记为已用尽——它依赖于底层迭代器。)

    这种StopIteration问题已经够烦人了,他们居然 changed生成器停止迭代处理以减轻它。 StopIteration 过去通常从生成器中传播,但是现在,如果 StopIteration 会从生成器中传播出来,它会被 RuntimeError 替换,因此看起来生成器不会正常结束。不过,这只影响生成器,而不影响其他迭代器,如 map .

    关于Python3 : Does the built-in function "map" have a bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60878604/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com