在python2和python3处理地图功能(Handling map function in py

2019-09-29 07:09发布

最近我碰到一个可能的解决方案感到困惑的一个问题和,代码部分

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

它不是关于他们是如何工作的,问题是,当你在运行python2它会引发异常,对结果取一部分,因此导致读者可以处理异常,但柜面的python3一个map object返回,所以只有消费者会能够处理异常。 有没有什么解决办法保存map功能和处理异常python2python3

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'
>>> 

Answer 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是危险所以使用更安全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)


Answer 2:

如果你总是需要异常在同一个地方出现,你总是可以强制地图对象通过在包装它产生的结果list的呼叫:

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

如果在Python 2中发生错误这将是在呼叫期间map而,在Python 3,误差会在过程中进行表面list呼叫。

轻微的缺点是,在Python 2的情况下,你将创建一个新的列表。 为了避免这种情况,你可以根据交替分支sys.version并使用list仅在Python 3,但可能是对你来说太乏味。



Answer 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文件,并将其导入你需要一个像我做什么,任何时候。



文章来源: Handling map function in python2 & python3