được trả về dạng iterator, chứ không phải là danh sách. Trong Python 3, các hàm biến thể trong các itertools này đã được loại bỏ vì loại trả về của các hàm toàn cầu này là iterator.
Notes | Python 2 | Python 3 |
---|---|---|
① | itertools.izip(a, b) | zip(a, b) |
② | itertools.imap(a, b) | map(a, b) |
③ | itertools.ifilter(a, b) | filter(a, b) |
④ | from itertools import imap, izip, foo | from itertools import foo |
1, sử dụng hàm zip () toàn cầu thay vì itertools.izip () 2/ Sử dụng map () thay vì itertools.imap () 3,itertools.ifilter() đã biến thành filter() Mô-đun itertools vẫn tồn tại trong Python 3, nó chỉ không bao gồm các hàm đã được chuyển sang namespace toàn cầu nữa. Các kịch bản 2to3 có thể có đủ thông minh để loại bỏ các lệnh nhập không còn hữu ích, trong khi vẫn giữ nguyên các lệnh nhập khác.
Trong mô-đun sys, có ba biến bạn có thể truy cập khi xử lý các trường hợp ngoại lệ: sys.exc_type, sys.exc_value, sys.exc_traceback. (Thực tế, chúng đã có từ thời Python 1). Từ Python 1.5, không còn được khuyến cáo sử dụng ba biến này nữa do sys.exc_info mới được phát hành, đây là một tập hợp chứa tất cả ba yếu tố trên.
Notes | Python 2 | Python 3 |
---|---|---|
sys.exc_type | sys.exc_info()[0] | |
sys.exc_value | sys.exc_info()[1] | |
sys.exc_traceback | sys.exc_info()[2] |
Trong Python 2, nếu bạn cần viết phân tích danh sách của một phân tử đi qua, bạn không cần phải thêm dấu ngoặc kép xung quanh giá trị phân tử. Trong Python 3, các dấu ngoặc kép là bắt buộc.
Notes | Python 2 | Python 3 |
---|---|---|
[i for iin 1,2] | [i for iin(1,2)] |
Python 2 có một hàm gọi là os.getcwd() trả về thư mục làm việc hiện tại dưới dạng một chuỗi ((không mã hóa Unicode)). Vì các hệ thống tệp hiện đại có thể xử lý tên thư mục được mã hóa bằng các ký tự số, Python 2.3 đã giới thiệu hàm os.getcwdu (((). Trong Python 3, bạn chỉ cần os.getcwdu (() để trả về các ký tự được mã hóa bằng Unicode trong thư mục làm việc hiện tại.
Notes | Python 2 | Python 3 |
---|---|---|
os.getcwdu() | os.getcwd() |
Trong Python 2, bạn có thể định nghĩa các tham số metaclass trong các tuyên bố của lớp, hoặc định nghĩa một cấp lớp đặc biệt (class-level)metaclass thuộc tính, để tạo một subclass. Trong Python 3,metaclass thuộc tính đã bị xóa.
Notes | Python 2 | Python 3 |
---|---|---|
① | class C(metaclass=PapayaMeta): pass |
unchanged |
② | class Whip: _metaclass_ = PapayaMeta |
class Whip(metaclass=PapayaMeta): pass |
③ | class C(Whipper, Beater): _metaclass_ = PapayaMeta |
class C(Whipper,Beater,metaclass=PapayaMeta): pass |
1, tuyên bố tham số metaclass khi tuyên bố lớp, điều này có hiệu lực trong cả Python 2 và Python 3, chúng giống nhau. 2, trong định nghĩa của lớp, tuyên bố rằng thuộc tính metaclass có hiệu lực trong Python 2, nhưng không còn hiệu lực trong Python 3. 3, 2to3 có thể xây dựng một tuyên bố lớp có hiệu lực ngay cả khi lớp này kế thừa từ nhiều lớp cha.
Các bản sửa lỗi dưới đây về cơ bản không phải là các bản sửa lỗi thực sự. Nghĩa là chúng chỉ là những điều về phong cách của mã, không liên quan đến bản chất của mã. Nhưng các nhà phát triển Python rất quan tâm đến việc làm cho phong cách mã phù hợp nhất có thể.
Trong Python 2, cách duy nhất để xác định một tập hợp giá trị chữ ((literal set) là gọi set ((a_sequence)). Trong Python 3, điều này vẫn còn hiệu quả, nhưng sử dụng ký hiệu đánh dấu mới ((literal notation): dấu ngoặc kép lớn (({}) là một cách rõ ràng hơn. Phương pháp này có hiệu quả ngoài tập hợp trống, vì từ điển cũng được đánh dấu bằng dấu ngoặc kép lớn, vì vậy {} biểu thị một từ điển trống, chứ không phải một tập hợp trống.
Các kịch bản 2to3 sẽ không sửa set (()) theo nghĩa đen theo mặc định. Để bật tính năng này, hãy chỉ định -f set_literal khi gọi 2to3 trên dòng lệnh.
Notes | Before | After |
---|---|---|
set([1,2,3]) | {1,2,3} | |
set((1,2,3)) | {1,2,3} | |
set([i for iin a_sequence]) | {i for iin a_sequence} |
Đối tượng Python được thực hiện bằng C có thể xuất ra một giao diện buffer interface, cho phép các mã Python khác đọc và viết một bộ nhớ trực tiếp. Điều này nghe có vẻ rất mạnh mẽ, nhưng nó cũng đáng sợ. Trong Python 3, buffer được đổi tên thành memoryview. Các sửa đổi thực tế phức tạp hơn, nhưng bạn hầu như có thể bỏ qua những khác biệt này.
Các kịch bản 2to3 không sửa buffer () theo mặc định. Để kích hoạt chức năng này, hãy chỉ định tham số -f buffer khi gọi 2to3 trên dòng lệnh.
Notes | Before | After |
---|---|---|
x =buffer(y) | x =memoryview(y) |
Mặc dù Python rất nghiêm ngặt về các khoảng trống cho việc chèn và chèn (indenting and outdenting), nhưng Python rất tự do về việc sử dụng khoảng trống ở các khía cạnh khác. Trong danh sách, mảng, tập hợp và từ điển, khoảng trống có thể xuất hiện ở phía trước hoặc phía sau dấu phẩy, điều này sẽ không có ảnh hưởng xấu. Tuy nhiên, hướng dẫn về phong cách mã Python chỉ ra rằng không thể có khoảng trống trước dấu phẩy và sau dấu phẩy nên có một khoảng trống. Mặc dù đây chỉ là một sự cân nhắc về thẩm mỹ thuần túy, mã vẫn có thể hoạt động bình thường, có thể trong Python 2 và Python 3, nhưng kịch bản 2to3 có thể thực hiện sửa chữa này cho bạn theo tiêu chuẩn trên sổ tay.
Các kịch bản 2to3 sẽ không sửa khoảng trống xung quanh dấu phẩy theo mặc định. Để bật tính năng này, hãy chỉ định tham số -f wscomma khi gọi dòng lệnh 2to3.
Notes | Before | After |
---|---|---|
a ,b | a, b | |
{a :b} | {a: b} |
Có rất nhiều quy tắc được xây dựng trong cộng đồng Python. Một số như while 1: loop, có từ Python 1. Python không có kiểu Boolean theo nghĩa đen cho đến khi Python 2.3, vì vậy các nhà phát triển trước đây sử dụng thay thế 1 và 0. Các lập trình viên Python hiện đại nên tập luyện bộ não của họ để sử dụng các phiên bản hiện đại của các quy tắc này.
Các kịch bản 2to3 sẽ không sửa lỗi cho các thông lệ này theo mặc định. Để bật tính năng này, hãy chỉ định tham số -f idioms khi gọi 2to3 trên dòng lệnh.
Notes | Before | After |
---|---|---|
while 1: do_stuff() |
while True: do_stuff() |
|
type(x) == T | isinstance(x, T) | |
type(x) is T | isinstance(x, T) | |
a_list = list(a_sequence) | a_list = sorted(a_sequence) | |
a_list.sort() | do_stuff(a_list) | |
do_stuff(a_list) |
Ghi chú:Blog CSDN
Cách chuyển đổi mã từ Python 2.x sang Python 3.x. Cách chuyển đổi mã Python 2.x sang mã Python 3.x
Không cần phải nói nhiều, nếu chỉ liên quan đến một số chức năng, chẳng hạn như print và nhiều hơn nữa.
Vậy thì bạn có thể tự sửa đổi mã của mình.
Phiên bản Python 2.x, ví dụ như Python 2.7.2 mà tôi đã cài đặt, mang theo một số công cụ hữu ích liên quan khi cài đặt trên windows.
Một trong số đó có tên là 2to3.py, nó giúp bạn thực hiện việc chuyển code từ Python 2.x sang Python 3.x.
Địa chỉ gốc cài đặt Python: \ Python27 \ Tools \ Scripts \ 2to3.py
Làm thế nào để sử dụng 2to3.py để thực hiện chuyển đổi mã Python 2.x sang mã Python 3.x Ví dụ, tôi có một kịch bản Python 2.x:
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
Bây giờ, mã muốn chuyển đổi nó thành Python 3.x.
Bạn có thể mở cmd của windows, di chuyển đến script muốn chuyển đổi và chạy
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
Sau đó, bạn có thể chuyển đổi thành công và kết quả thực hiện tương ứng là:
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.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> 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> <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> 740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py
Tại đây, bạn có thể thấy rằng 34563264_data_from_site.py đã trở thành mã của Python 3.x.
Một tập tin bak khác::34563264_data_from_site.py.bak, so sánh hai tập tin này và bạn sẽ thấy sự khác biệt:
Hiện tại, 2to3.py có thể được sử dụng nhiều hơn bằng cách tìm kiếm trợ giúp:
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.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
Một vài lời giải thích:
(1) Nếu không có tham số -w như trên, thì mặc định chỉ in ra các nội dung khác nhau tương ứng với quá trình chuyển đổi vào cửa sổ hiện tại.
(2) Thêm -w, thay đổi nội dung và viết lại tài liệu ban đầu.
(3) Nếu bạn không muốn tạo một file bak, bạn có thể thêm -n.
(4) Không muốn nhìn thấy một loạt các đầu ra, cộng với các no-diffs, có thể.
Những người quan tâm có thể tự đi tìm hiểu thêm.
2to3 được sử dụng ở trên.Trên đường đi
Nếu có lỗi, xin vui lòng cho biết! ^_^