python(內建函式, 模組)打補丁 相容py2 py3
阿新 • • 發佈:2020-12-02
轉自
使用背景
py2官方已不在維護, 所以將專案升級到py3, 但是專案也不是一行兩行的事, 並且專案還在使用, 所以必須要相容py2, 升級到py3
所以就有了以下常見問題, 比如, py2的內建函式py3已不使用, py2的內建模組py3已經改名.........
錯誤檔案測試
print(unicode, type(unicode)) # 輸出 """ Traceback (most recent call last): File "/Users/msw/Desktop/tools/py3_test.py", line 4, in <module> print(unicode, type(unicode)) NameError: name 'unicode' is not defined"""
解決方案
打補丁
(下列補丁中的判斷py版本是為了相容2,3)
1. 內建函式補丁
import sys if sys.version_info[0] >= 3: PY3 = True else: PY3 = False def patch_default_type(): if not PY3: return __builtins__["unicode"] = __builtins__["basestring"] = str __builtins__["long"] = int
匯入補丁 測試
from py2_to_py3 importpatch_default_type patch_default_type() print(unicode, type(unicode)) # py3 輸出 <class 'str'> <class 'type'>
# py2 輸出 (<type 'unicode'>, <type 'type'>)
2. 內建模組補丁
import sys if sys.version_info[0] >= 3: PY3 = True else: PY3 = False def patch_modules(copy_reg=False, itertools_imap=False):if not PY3: return
if copy_reg: import copyreg sys.modules["copy_reg"] = copyreg if itertools_imap: import itertools setattr(itertools, "imap", map)
匯入補丁 測試
from py2_to_py3 import patch_modules patch_modules(copy_reg=True, itertools_imap=True) import copy_reg from itertools import imap print(copy_reg) print(imap)
# py3 輸出 # <module 'copyreg' from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/copyreg.py'> # <class 'map'> # py2 輸出 # <module 'copy_reg' from '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.pyc'> # <type 'itertools.imap'>
補丁模組
主要用於相容py2 py3, 功能強大, 使用簡單
six
from six.moves import map, copyreg print(copyreg) print(map) # py3 輸出 # <module 'copyreg' from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/copyreg.py'> # <class 'map'> # py2 輸出 # <module 'copy_reg' from '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.pyc'> # <type 'itertools.imap'>
six基本可以解決相容py2,3 問題, 但還有極個別的問題, 需要單獨處理