【问题标题】:__xor__ in functools.reduce() causing errorfunctools.reduce() 中的 __xor__ 导致错误
【发布时间】:2018-06-29 03:25:31
【问题描述】:

我目前正在使用 Discord API 在 python 3 中工作,我想使用一个用 python 2 编写的模块。我正在编辑一些代码以使其与 python 3 一起使用。我不能弄清楚是这样的:

odd_xor = reduce(__xor__, bh) >> 16

这在 python 2 中有效,但在 python 3 中无效。我认为可行的简单修复是:

odd_xor = functools.reduce(__xor__, bh) >> 16

但这给了我错误:

reduce() of empty sequence with no initial value

bh 在这里初始化:

# bh stands for binary hand, map to that representation
card_to_binary = HandEvaluator.Six.card_to_binary_lookup
bh = map(card_to_binary, hand)

我真的不明白代码段试图做什么,这就是为什么我很难找到解决这个问题的方法。有什么想法吗?提前致谢!

附:如果有更简单的方法在 python 3 项目中使用 python 2 模块,请赐教。

【问题讨论】:

  • 你能告诉我们之前的代码吗?具体如何初始化bh
  • 另外,展示你的导入

标签: python python-3.x python-2.x xor


【解决方案1】:

在 Python 3 中,map 返回一个惰性迭代器(很像生成器),而不是像在 Python 2 中那样返回一个列表。这可能是您的问题的原因。

在您的代码中,您执行map(card_to_binary, hand)。如果hand 在您使用结果之前被更改(例如清空),您可能无法得到您想要的(例如,map 可能最终会迭代什么都没有)。

要使代码与 Python 2 一样工作,您只需在从 map 获得的迭代器上调用 list

bh = list(map(card_to_binary, hand))

或者,您可以更改修改 hand 的其他代码,以便它执行不同的操作,可能创建一个新列表,在修改列表之前复制列表,或者仅在 reduce 调用之后修改 hand已完成。

【讨论】:

    【解决方案2】:

    reduce的第二个参数传递的序列为空时会发生上述错误,这意味着发生错误时bh是一个空序列。

    由于bh 是用另一个序列hand 初始化的,因此您首先需要找出为什么hand 为空。

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 1970-01-01
      • 2012-12-17
      • 2014-04-29
      • 2021-05-10
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多