繁体   English   中英

__xor__在functools.reduce()中导致错误

[英]__xor__ in functools.reduce() causing error

我目前正在使用Discord API在python 3中工作,并且我想使用以python 2编写的模块。我正在编辑一些代码以使其与python 3一起工作。这个:

odd_xor = reduce(__xor__, bh) >> 16

这适用于python 2,但不适用于python3。我认为可行的简单解决方法是:

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)

我不太了解代码段要做什么,这就是为什么我很难找到解决这个问题的方法的原因。 有什么想法吗? 提前致谢!

PS:如果有更简便的方法将python 2模块与python 3项目一起使用,请赐教。

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

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

在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM