处理python2中的map函数& python3

时间:2016-12-11 19:38:23

标签: python-2.7 python-3.x python-internals

最近我遇到了一个问题&与可能的解决方案混淆 代码部分是

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

它不是关于它们如何工作,问题是当你在python2中运行它会在结果提取部分引发异常,因此结果读者可以处理异常,但是{{1}返回python3,因此只有使用者才能处理异常。 是否有任何解决方案保持map object功能&处理map&中的例外情况python2

python3

python3

python2

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

3 个答案:

答案 0 :(得分:2)

如果你总是需要在同一个地方发生异常,你总是可以通过将它包装在list调用中来强制地图对象产生结果:

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

如果在Python 2中发生错误,它将在调用map期间,而在Python 3中,错误将在list调用期间浮出水面。

略微不足的是,在Python 2的情况下,您将创建一个新列表。为了避免这种情况,您可以根据sys.version进行分支,并仅在Python 3中使用list,但这对您来说可能过于繁琐。

答案 1 :(得分: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))

(或者用你最喜欢的方式检查哪个版本的python正在执行中)

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

无论你运行哪个版本的python,你的代码都会这样做。

但正如 jsbueno 所提到的,eval和python2&#39; inputdangerous所以请使用更安全的raw_input或python3&# 39; s input

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

(或者用你最喜欢的方式检查哪个版本的python正在执行中)

然后,如果您的计划是按1,2,3提供输入,请添加适当的拆分

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

答案 2 :(得分:0)

我通常在这种情况下使用我自己的地图版本来逃避可能发生的任何问题而且它是

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文件中,并在您需要的时候随意导入它们。