__xor__ в functools.reduce (), вызывающий ошибку - PullRequest
0 голосов
/ 29 июня 2018

В настоящее время я работаю в 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 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, пожалуйста, просветите меня.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

В 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 на месте после вызова reduce было завершено.

0 голосов
/ 29 июня 2018

Указанная ошибка возникает, когда последовательность, переданная в качестве второго аргумента reduce, пуста, что означает, что bh является пустой последовательностью при возникновении ошибки.

Поскольку bh инициализируется с другой последовательностью, hand, вам необходимо выяснить, почему hand пусто в первую очередь.

...