4
tập trung vào
1094
Người theo dõi

Những thay đổi giữa Python 2.x.x và Python 3.x.x & Cách chuyển đổi Python 2.x.x sang Python 3.x.x

Được tạo ra trong: 2016-10-09 12:36:49, cập nhật trên: 2017-10-11 10:18:05
comments   2
hits   4963

đượ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.

  • #### sys.exc_type, sys.exc_value, sys.exc_traceback

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]
  • #### Phân tích danh sách đối với các nguyên tố

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)]
  • #### Chức năng os.getcwdu

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()
  • #### Metaclass

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.

  • #### Về phong cách mã

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ể.

  • #### set (định nghĩa)

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}
  • #### Global Function Buffer (((như thể hiện)

Đố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)
  • #### Không gian xung quanh dấu phẩy (được hiển thị)

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ổ ngữ (Common idioms)

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

Làm thế nào để chuyển đổi mã Python 2 thành mã Python 3

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

  • #### 1. Chuyển đổi bằng tay

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.

  • #### 2. Sử dụng công cụ Python built-in (Python script) để tự động chuyển đổi

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>&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

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:

Những thay đổi giữa Python 2.x.x và Python 3.x.x & Cách chuyển đổi Python 2.x.x sang Python 3.x.x

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! ^_^