__xor__ in functools.reduce() 导致错误

__xor__ in functools.reduce() causing error

我目前在 python 3 中使用 Discord API 工作,我想使用在 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)

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

P.S。如果有python 2个模块和python 3个项目更简单的方法,请赐教。

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

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

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

在您的代码中,您执行 map(card_to_binary, hand)。如果 hand 在你使用结果之前被改变(例如清空),你可能得不到你想要的东西(例如 map 可能最终没有迭代)。

要使代码与 Python 2 相同,您只需在从 map:

获得的迭代器上调用 list
bh = list(map(card_to_binary, hand))

或者,您可以更改其他修改 hand 的代码,使其做一些不同的事情,也许创建一个新列表,在修改之前复制列表,或者仅在之后修改 hand reduce 调用已完成。