2016-12-11 4 views
0

Недавно я наткнулся на вопрос & спутать с возможным решением, часть кода являетсяHandling карта функция python2 & Python3

// code part in result reader 
result = map(int, input()) 
// consumer call 
result_consumer(result) 

его не о том, как они работают, проблема, когда вы работаете в python2 будет вызывать исключение, в результате выборки части, поэтому результирующий читатель может обрабатывать исключение, но возвращается python3 a map object, так что только потребитель сможет обрабатывать исключение. есть ли решение держать map функцию & обработать исключение в python2 & python3

Python3

>>> d = map(int, input()) 
1,2,3,a 
>>> d 
<map object at 0x7f70b11ee518> 
>>> 

python2

>>> d = map(int, input()) 
1,2,3,'a' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'a' 
>>> 
+1

Помимо «карты», у вас совершенно другая ошибка в том, что 'input' не работает таким образом на Python 3. – user2357112

ответ

1

поведение map это не единственное различие между python2 и Python3, input также разница, вы должны иметь в виду, основные различия между ними, чтобы сделать код совместимым как для

python 3 vs python 2 
    map = itertools.imap 
    zip = itertools.izip 
    filter = itertools.ifilter 
    range = xrange 
    input = raw_input 

так, чтобы сделать код для обоих, вы можете использовать альтернативы, такие как понимание списка, которые работают одинаково для обоих, а для тех, у кого нет простых альтернатив, вы можете создавать новые функции и/или использовать условные переименования, например,

my_input = input 
try: 
    raw_input 
except NameError: #we are in python 3 
    my_input = lambda msj=None: eval(input(msj)) 

(или с вашим любимым способом, чтобы проверить, какую версию питона в исполнении)

# code part in result reader 
result = [ int(x) for x in my_input() ] 
# consumer call 
result_consumer(result) 

таким образом ваш код делать то же самое независимо от того, какой версии Python вы запустите его.

Но jsbueno упоминалось, eval и python2-х input являются dangerous так использовать более безопасный raw_input или python3-х input

try: 
    input = raw_input 
except NameError: #we are in python 3 
    pass 

(или с вашим любимым способом, чтобы проверить, какая версия питона в исполнении)

, то если ваш план должен представить ваш ввод как 1,2,3 добавить соответствующий сплит

# code part in result reader 
result = [ int(x) for x in input().split(",") ] 
# consumer call 
result_consumer(result) 
+1

Пожалуйста, сделайте все наоборот и переустановите 2 сломанных входа Python с рабочим входом Python3. Ваша функция try-except просто воссоздает разбитое поведение в Python3, где оно не существует. – jsbueno

+0

@jsbueno, что вы имели в виду? измените my_input на raw_input ?? Я делаю это так, потому что похоже, что OP использует py2 в качестве основного, и я пытаюсь сделать поведение одинаковым для обеих версий. – Copperfield

+0

«try: raw_input else: input = raw_input' - tht делает Python3 хорошо выполненной версией ввода чтобы быть на месте небезопасного и причудливого ввода Python2. – jsbueno

1

Если вам всегда нужно исключение произойдет на то же место вы всегда можете заставить объект на карте, чтобы получить свои результаты, обернув его в list вызова:

result = list(map(int, input())) 

Если ошибка возникает в Python 2 она будет во время вызова map время, в Python 3, ошибка выходя на поверхность во время вызова list.

Небольшой недостаток заключается в том, что в случае Python 2 вы создадите новый список. Чтобы этого избежать, вы можете в качестве альтернативы входить на основе sys.version и использовать list только в Python 3, но это может оказаться слишком утомительным для вас.

+0

« Dowsnside », о котором вы упоминаете, является полным без проблем - вы делаете один вызов функции - порядка нескольких микросекунд в ответ на ввод пользователем ввода - soemhting, который занимает порядка секунд. – jsbueno