我目前正在使用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)
我不太了解代码段要做什么,这就是为什么我很难找到解决这个问题的方法。有什么想法吗?预先感谢!
P.S。如果有更简单的方法将python 2模块与python 3项目一起使用,请赐教。
答案 0 :(得分:2)
当作为reduce
的第二个参数传递的序列为空时,将发生上述错误,这意味着发生错误时bh
是一个空序列。
由于bh
是用另一个序列hand
初始化的,因此您首先需要找出为什么hand
为空。
答案 1 :(得分:2)
在Python 3中,map
返回一个惰性迭代器(非常类似于生成器),而不是像在Python 2中那样返回列表。这可能是导致问题的原因。
在您的代码中,您执行map(card_to_binary, hand)
。如果在使用结果之前hand
被更改(例如清空),则可能无法获得所需的内容(例如map
可能最终没有任何迭代)。
要使代码与Python 2相同,您只需在从list
获得的迭代器上调用map
:
bh = list(map(card_to_binary, hand))
或者,您可以更改其他修改hand
的代码,以使其有所不同,例如创建一个新列表,在修改之前复制列表,或者仅在{之后修改hand
{1}}通话已完成。