最近我碰到一个可能的解决方案感到困惑的一个问题和,代码部分
// code part in result reader
result = map(int, input())
// consumer call
result_consumer(result)
它不是关于他们是如何工作的,问题是,当你在运行python2
它会引发异常,对结果取一部分,因此导致读者可以处理异常,但柜面的python3
一个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'
>>>
行为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
是危险所以使用更安全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)
如果你总是需要异常在同一个地方出现,你总是可以强制地图对象通过在包装它产生的结果list
的呼叫:
result = list(map(int, input()))
如果在Python 2中发生错误这将是在呼叫期间map
而,在Python 3,误差会在过程中进行表面list
呼叫。
轻微的缺点是,在Python 2的情况下,你将创建一个新的列表。 为了避免这种情况,你可以根据交替分支sys.version
并使用list
仅在Python 3,但可能是对你来说太乏味。
我通常会用我自己的地图版本,在这种情况下,逃避任何可能出现的问题,可能会出现,它的
def my_map(func,some_list):
done = []
for item in some_list:
done.append( func(item) )
return done
和我自己的版本的输入过
def getinput(text):
import sys
ver = sys.version[0]
if ver=="3":
return input(text)
else:
return raw_input(text)
如果你是在一个大项目的工作将它们添加到一个Python文件,并将其导入你需要一个像我做什么,任何时候。