python2到3使用list()

时间:2016-08-07 10:45:22

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

我将python2.7脚本转换为python3。 2to3提出了以下建议:

         result        = result.split(',')
         syslog_trace("Result   : {0}".format(result), False, DEBUG)

-        data.append(map(float, result))
+        data.append(list(map(float, result)))
         if (len(data) > samples):
           data.pop(0)
         syslog_trace("Data     : {0}".format(data),   False, DEBUG)

         # report sample average
         if (startTime % reportTime < sampleTime):
-          somma       = map(sum, zip(*data))
+          somma       = list(map(sum, list(zip(*data))))
           # not all entries should be float
           # 0.37, 0.18, 0.17, 4, 143, 32147, 3, 4, 93, 0, 0
           averages    = [format(sm / len(data), '.3f') for sm in somma]

我确定Python3的制造商不想这样做。至少,它给了我一个&#34;你一定是在开玩笑&#34;的感觉。

有更多的pythonic方式吗?

2 个答案:

答案 0 :(得分:2)

未固定的somma

出了什么问题

2to3无法知道somma将如何使用,在这种情况下,作为计算averages的下一行中的生成器,它是正常的,最优的,无需转换它作为一个清单。

这是生成器更改的python 3列表的天才:大多数人已经将这些列表用作生成器,浪费了他们不需要的宝贵内存实现列表。

     # report sample average
     if (startTime % reportTime < sampleTime):
      somma       = map(sum, zip(*data))
       # not all entries should be float
       # 0.37, 0.18, 0.17, 4, 143, 32147, 3, 4, 93, 0, 0
       averages    = [format(sm / len(data), '.3f') for sm in somma]

当然,未转换的第一个语句将失败,因为我们附加了一个生成器,而我们需要一个列表。在这种情况下,错误很快就会得到解决。

如果保留这样的结果:data.append(map(float, result)),下一条跟踪会显示一些可疑的内容:'Data : [<map object at 0x00000000043DB6A0>]',您可以通过将list修改为2to3来快速修复。

2to3尽力创建正在运行的Python 3代码,但它不会取代手动返工或生成最佳代码。当你赶时间你可以应用它,但总是像OP那样检查差异与旧代码。

当使用Python 3引发错误时,最新Python 2版本的-3选项会打印警告。这是另一种方法,当您有更多时间执行迁移时更好。

答案 1 :(得分:1)

  

我确信Python3的制作者不想那样做

嗯,Python的制作者通常不喜欢看到使用Python 2,我已经看到几乎每个PyCon都表达了这种情绪。

  

有更多的pythonic方式吗?

这真的取决于你对Pythonic的解释,在你的情况下,list comps看起来更直观,你想要构造一个list所以不需要用{{1}创建一个迭代器或} map然后将其提供给zip

现在,为什么list()选择2to3包裹而不是comps,我不知道;可能最容易实际实施。