• 如何把Python2的代码转换为Python3的代码


    ls *.py|xargs -i 2to3 -w {}

     

     

    如何把Python2的代码转换为Python3的代码

    如果对于python2和python3不熟悉的,可以参考:

    【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间的区别


    之前有机会接触到,将Python2的代码转换为Python3的代码。

    经过一番折腾,大概有了基本概念了。

    现在简要整理一下,关于如何将Python 2.x的代码,转换为Python 3.x的代码。


    把Python 2.x的代码转换为Python 3.x代码的方法

    1.自己手动转换

    这个不必多说,如果只是涉及很少的函数,比如print等。

    那么自己改改代码,也就可以了。

    2.利用Python内置(Python脚本)工具,帮你自动转换

    Python 2.x版本,比如我安装的Python 2.7.2,其在windows下载安装好之后,就自带了相关的一些有用的工具。

    其中一个叫做2to3.py,就是用来帮你实现,将Python 2.x的代码,转换为Python 3.x的代码的。

    其位置位于:Python安装的根目录Python27ToolsScripts2to3.py

    【如何利用2to3.py,实现将Python 2.x的代码,转换为Python 3.x的代码】 
    比如我手上有个Python 2.x的python脚本:

    D: mp mp_dev_rootpythonpython2_to_python334563264_data_from_site.py

    现在,想要将其转换为Python 3.x的代码。

    可以通过打开windows的cmd,定位至该要转换的脚本下,然后运行

    D: mpWordPressDevRootPython27ToolsScripts2to3.py -w 34563264_data_from_site.py

    即可成功转换,对应的执行结果为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    D: mp mp_dev_rootpythonpython2_to_python3>D: mpWordPressDevRootPython27ToolsScripts2to3.py -w 34563264_data_from_site.py
    RefactoringTool: Skipping implicit fixer: buffer
    RefactoringTool: Skipping implicit fixer: idioms
    RefactoringTool: Skipping implicit fixer: set_literal
    RefactoringTool: Skipping implicit fixer: ws_comma
    RefactoringTool: Refactored 34563264_data_from_site.py
    --- 34563264_data_from_site.py  (original)
    +++ 34563264_data_from_site.py  (refactored)
    @@ -18,7 +18,7 @@
     import time;
     import codecs;
     import logging;
    -import urllib;
    +import urllib.request, urllib.parse, urllib.error;
     from datetime import datetime,timedelta;
     from optparse import OptionParser;
     from string import Template,replace;
    @@ -90,7 +90,7 @@
             foundPhone = eachItemSoup.find(attrs={"class":"phone"});
             logging.debug("foundPhone=%s", foundPhone);
             if(foundPhone):
    -            foundPhoneUni = unicode(foundPhone);
    +            foundPhoneUni = str(foundPhone);
                 logging.debug("foundPhoneUni=%s", foundPhoneUni);
                 # case 1:
                 #<p class="phone"><strong>phone:</strong>&nbsp;800.206.7886<br />
    @@ -122,7 +122,7 @@
             foundWeb = eachItemSoup.find(attrs={"class":"web"});
             logging.debug("foundWeb=%s", foundWeb);
             if(foundWeb):
    -            foundWebUni = unicode(foundWeb);
    +            foundWebUni = str(foundWeb);
                 logging.debug("foundWebUni=%s", foundWebUni);
     
                 # <p class="web"><strong>e-mail:</strong>&nbsp;<a href="#">sales@cinesysinc.com</a><br />
    @@ -151,7 +151,7 @@
             foundAddr = eachItemSoup.find(attrs={"class":"addr"});
             logging.debug("foundAddr=%s", foundAddr);
             if(foundAddr):
    -            foundAddrUni = unicode(foundAddr);
    +            foundAddrUni = str(foundAddr);
     
                 # <p class="addr">
                     # <strong>address:</strong>&nbsp;740 SW 21st Ave, Suite #310<br />
    RefactoringTool: Files that were modified:
    RefactoringTool: 34563264_data_from_site.py

    此时,你可以看到原先的34563264_data_from_site.py,已经变成了Python 3.x的代码了。

    对应的,也多出一个bak文件:34563264_data_from_site.py.bak,两者比较一下,即可看出区别:

    2 diff with 3

    当前,对于2to3.py本身,也可以通过help查看到更多的用法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    D: mp mp_dev_rootpythonpython2_to_python3>D: mpWordPressDevRootPython27ToolsScripts2to3.py -h
    Usage: 2to3 [options] file|dir ...
     
    Options:
      -h, --help            show this help message and exit
      -d, --doctests_only   Fix up doctests only
      -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all
      -j PROCESSES, --processes=PROCESSES
                            Run 2to3 concurrently
      -x NOFIX, --nofix=NOFIX
                            Prevent a transformation from being run
      -l, --list-fixes      List available transformations
      -p, --print-function  Modify the grammar so that print() is a function
      -v, --verbose         More verbose logging
      --no-diffs            Don't show diffs of the refactoring
      -w, --write           Write back modified files
      -n, --nobackups       Don't write backups for modified files

    此处只多解释几句:

    (1)如果上述不加-w参数,则默认只是把转换过程所对应的diff内容打印输出到当前窗口而已。

    (2)加了-w,就是把改动内容,写回到原先的文件了。

    (3)不想要生成bak文件,再加上-n即可。

    (4)不想看到那一堆输出的内容,加上–no-diffs,即可。

    其他的,就不多介绍了。感兴趣的可以自己去继续折腾。

  • 相关阅读:
    三十一:数据库之SQLAlchemy属性常用数据类型和Column常用参数
    xml和configparser模块
    shelve和hashlib模块
    json和pickle序列化模块
    sys模块和shutil模块
    random和os模块
    collections、time和datetime模块
    Python模块及其导入
    Python生成器和迭代器
    Python装饰器
  • 原文地址:https://www.cnblogs.com/timssd/p/5545557.html
Copyright © 2020-2023  润新知