Cách sử dụng Python3to2
Cây nguồn futurize --stage1 mypackage/**/*.py7 bao gồm các tập lệnh có tên là futurize --stage1 mypackage/**/*.py8 và futurize --stage1 mypackage/**/*.py9 để hỗ trợ tạo mã Python 2 hoặc mã Python 3 tương thích với cả hai nền tảng (Py2/3) bằng cách sử dụng mô-đun futurize --stage1 mypackage/**/*.py7. Chúng dựa trên from __future__ import absolute_import from __future__ import division from __future__ import print_function1 và sử dụng các bộ sửa lỗi từ from __future__ import absolute_import from __future__ import division from __future__ import print_function2, from __future__ import absolute_import from __future__ import division from __future__ import print_function3 và from __future__ import absolute_import from __future__ import division from __future__ import print_function4 Show
futurize --stage1 mypackage/**/*.py8 chuyển mã Python 2 qua tất cả các trình sửa lỗi thích hợp để biến nó thành mã Python 3 hợp lệ, sau đó thêm nhập khẩu gói from __future__ import absolute_import from __future__ import division from __future__ import print_function6 và futurize --stage1 mypackage/**/*.py7 Để chuyển đổi từ mã Python 3 sang Py2/3, hãy sử dụng tập lệnh futurize --stage1 mypackage/**/*.py9 thay thế. Điều này chuyển đổi các cấu trúc chỉ dành cho Py3 (e. g. cú pháp siêu dữ liệu mới) và thêm nhập khẩu from __future__ import absolute_import from __future__ import division from __future__ import print_function6 và futurize --stage1 mypackage/**/*.py7 vào đầu mỗi mô-đun Trong cả hai trường hợp, kết quả phải là mã kiểu Py3 tương đối rõ ràng, hầu như không thay đổi trên cả Python 2 và Python 3 futurize --stage1 mypackage/**/*.py 8. Py2 đến Py2/3Tập lệnh futurize --stage1 mypackage/**/*.py8 chuyển mã Python 2 qua tất cả các trình sửa lỗi thích hợp để biến nó thành mã Python 3 hợp lệ, sau đó thêm nhập khẩu gói from __future__ import absolute_import from __future__ import division from __future__ import print_function6 và futurize --stage1 mypackage/**/*.py7 để kích hoạt lại khả năng tương thích với Python 2 Ví dụ: chạy futurize --stage1 mypackage/**/*.py8 biến mã Python 2 này futurize --stage1 mypackage/**/*.py9 vào mã này chạy trên cả Py2 và Py3 futurize --stage1 mypackage/**/*.py0 Để viết ra tất cả các thay đổi đối với tệp Python của bạn mà futurize --stage1 mypackage/**/*.py8 gợi ý, hãy sử dụng cờ futurize --stage1 mypackage/**/*.py27 Đối với các dự án phức tạp, tốt nhất nên chia quá trình chuyển đổi thành hai giai đoạn. Giai đoạn 1 dành cho các thay đổi “an toàn” giúp hiện đại hóa mã nhưng không phá vỡ Python 2. 7 hoặc giới thiệu một phụ thuộc vào gói futurize --stage1 mypackage/**/*.py7. Giai đoạn 2 là để hoàn thành quá trình Giai đoạn 1. sửa lỗi “an toàn”Chạy giai đoạn đầu tiên của quá trình chuyển đổi với futurize --stage1 mypackage/**/*.py4 hoặc, nếu bạn đang sử dụng zsh, đệ quy futurize --stage1 mypackage/**/*.py Điều này áp dụng các bản sửa lỗi hiện đại hóa mã Python 2 mà không làm thay đổi tác dụng của mã. Nếu may mắn, điều này sẽ không đưa bất kỳ lỗi nào vào mã, hoặc ít nhất sẽ không đáng kể để sửa. Những thay đổi là những thay đổi mang lại mã Python cập nhật mà không vi phạm khả năng tương thích Py2. Mã kết quả sẽ là Python 2 hiện đại. Mã tương thích 7 cộng với nhập khẩu from __future__ import absolute_import from __future__ import division from __future__ import print_function6 từ bộ sau from __future__ import absolute_import from __future__ import division from __future__ import print_function Chỉ những lần nhập from __future__ import absolute_import from __future__ import division from __future__ import print_function6 được coi là cần thiết sẽ được thêm vào trừ khi tùy chọn dòng lệnh futurize --stage1 mypackage/**/*.py91 được chuyển đến futurize --stage1 mypackage/**/*.py8, trong trường hợp đó, tất cả chúng đều được thêm vào Khai báo futurize --stage1 mypackage/**/*.py93 không được thêm vào trừ khi cờ futurize --stage1 mypackage/**/*.py94 được chuyển cho futurize --stage1 mypackage/**/*.py8 Những thay đổi bao gồm futurize --stage1 mypackage/**/*.py2 Nhập khẩu tương đối ngầm cố định, e. g futurize --stage1 mypackage/**/*.py9 Giai đoạn 1 không thêm bất kỳ lần nhập nào từ gói futurize --stage1 mypackage/**/*.py7. Đầu ra của giai đoạn 1 có thể sẽ (chưa) chạy trên Python 3 Mục tiêu của giai đoạn này là tạo ra hầu hết futurize --stage1 mypackage/**/*.py97 cho toàn bộ quá trình chuyển, nhưng không gây ra bất kỳ lỗi nào. Nó không gây tranh cãi và an toàn khi áp dụng cho mọi gói Python 2. Các bản vá tiếp theo giới thiệu khả năng tương thích với Python 3 sau đó sẽ ngắn hơn và dễ xem lại hơn Bộ sửa chữa hoàn chỉnh được áp dụng bởi futurize --stage1 mypackage/**/*.py98 là futurize --stage1 mypackage/**/*.py9 Các bộ sửa lỗi sau từ from __future__ import absolute_import from __future__ import division from __future__ import print_function1 không được áp dụng from __future__ import absolute_import from __future__ import division from __future__ import print_function1 Trình sửa lỗi futurize --stage1 mypackage/**/*.py90 trong futurize --stage1 mypackage/**/*.py91 được áp dụng thay vì futurize --stage1 mypackage/**/*.py92. Trình sửa lỗi mới vừa làm rõ ràng các thao tác nhập tương đối tiềm ẩn vừa thêm phần khai báo futurize --stage1 mypackage/**/*.py93 ở đầu mỗi mô-đun có liên quan from __future__ import absolute_import from __future__ import division from __future__ import print_function6 Trình sửa lỗi futurize --stage1 mypackage/**/*.py94 trong futurize --stage1 mypackage/**/*.py91 được áp dụng thay vì futurize --stage1 mypackage/**/*.py96 trong giai đoạn 1. Trình sửa lỗi mới thay đổi bất kỳ lệnh gọi futurize --stage1 mypackage/**/*.py97 nào thành futurize --stage1 mypackage/**/*.py98, tương thích với Py2/3, nhưng không thay đổi bất kỳ tên phương thức futurize --stage1 mypackage/**/*.py99 nào thành from __future__ import absolute_import from __future__ import division from __future__ import print_function10, điều này sẽ phá vỡ khả năng tương thích với Py2 futurize --stage1 mypackage/**/*.py96 được áp dụng trong giai đoạn 2 futurize --stage1 mypackage/**/*.py00 Trình sửa lỗi from __future__ import absolute_import from __future__ import division from __future__ import print_function12 trong futurize --stage1 mypackage/**/*.py91 thay đổi mã để sử dụng chức năng in và cũng thêm from __future__ import absolute_import from __future__ import division from __future__ import print_function14 vào đầu mô-đun bằng cách sử dụng from __future__ import absolute_import from __future__ import division from __future__ import print_function15 Ngoài ra, nó tránh thêm một bộ dấu ngoặc đơn bổ sung nếu chúng đã tồn tại. Vì vậy, from __future__ import absolute_import from __future__ import division from __future__ import print_function16 không trở thành from __future__ import absolute_import from __future__ import division from __future__ import print_function17 futurize --stage1 mypackage/**/*.py01 Trình sửa lỗi này dịch mã để sử dụng phương thức from __future__ import absolute_import from __future__ import division from __future__ import print_function18 chỉ dành cho Python 3 đối với các trường hợp ngoại lệ futurize --stage1 mypackage/**/*.py02 Điều này chuyển đổi from __future__ import absolute_import from __future__ import division from __future__ import print_function19) thành from __future__ import absolute_import from __future__ import division from __future__ import print_function60 futurize --stage1 mypackage/**/*.py03 Điều này thực hiện thay đổi thẩm mỹ. Điều này không được áp dụng theo mặc định vì nó không phục vụ để cải thiện khả năng tương thích Python 2/3. (Trong một số trường hợp, nó cũng có thể làm giảm khả năng đọc. xem vấn đề #58. ) giai đoạn 2. Mã kiểu Py3 với hàm bao cho Py2Chạy giai đoạn 2 của quá trình chuyển đổi với futurize --stage1 mypackage/**/*.py04 Giai đoạn này thêm một phụ thuộc vào gói futurize --stage1 mypackage/**/*.py7. Mục tiêu của giai đoạn 2 là thực hiện các thay đổi gần như an toàn hơn nữa đối với mã Python 2 để sử dụng mã kiểu Python 3 mà sau đó vẫn chạy trên Python 2 với sự trợ giúp của các nội trang và tiện ích phù hợp trong futurize --stage1 mypackage/**/*.py7 Ví dụ futurize --stage1 mypackage/**/*.py05 sẽ được chuyển đổi bởi Giai đoạn 2 sang mã này futurize --stage1 mypackage/**/*.py06 Giai đoạn 2 cũng đổi tên nhập thư viện tiêu chuẩn thành tên Py3 của chúng và thêm hai dòng này futurize --stage1 mypackage/**/*.py07 Ví dụ futurize --stage1 mypackage/**/*.py08 trở thành futurize --stage1 mypackage/**/*.py09 Danh sách đầy đủ các trình sửa lỗi được áp dụng trong Giai đoạn 2 là futurize --stage1 mypackage/**/*.py40 không áp dụng futurize --stage1 mypackage/**/*.py41 Tách văn bản khỏi byteSau khi áp dụng giai đoạn 2, bước được đề xuất là quyết định xem chuỗi Python 2 nào của bạn đại diện cho văn bản và chuỗi nào đại diện cho dữ liệu nhị phân và thêm tiền tố vào tất cả các chuỗi ký tự bằng from __future__ import absolute_import from __future__ import division from __future__ import print_function63 hoặc from __future__ import absolute_import from __future__ import division from __future__ import print_function64 tương ứng. Hơn nữa, để đảm bảo rằng các loại này hoạt động tương tự trên Python 2 cũng như trên Python 3, hãy bọc các chuỗi byte hoặc văn bản trong các loại from __future__ import absolute_import from __future__ import division from __future__ import print_function65 và from __future__ import absolute_import from __future__ import division from __future__ import print_function66 từ futurize --stage1 mypackage/**/*.py7. Ví dụ futurize --stage1 mypackage/**/*.py42 Khi đó, bất kỳ chuỗi ký tự không được tô điểm nào sẽ đại diện cho các chuỗi nền tảng gốc (chuỗi byte trên Py2, chuỗi unicode trên Py3) Một cách khác là chuyển cờ futurize --stage1 mypackage/**/*.py94 futurize --stage1 mypackage/**/*.py43 Sau khi chạy cái này, tất cả các chuỗi ký tự không được đánh dấu rõ ràng là from __future__ import absolute_import from __future__ import division from __future__ import print_function69 sẽ có nghĩa là văn bản (Python 3 from __future__ import absolute_import from __future__ import division from __future__ import print_function66 hoặc Python 2 futurize --stage1 mypackage/**/*.py001) sau chuyển đổiSau khi chạy futurize --stage1 mypackage/**/*.py8, trước tiên chúng tôi khuyên bạn nên chạy thử nghiệm của mình trên Python 3 và thực hiện các thay đổi mã khác cho đến khi chúng vượt qua Python 3 Bước tiếp theo sẽ là chỉnh sửa mã theo cách thủ công để kích hoạt lại khả năng tương thích với Python 2 với sự trợ giúp của gói futurize --stage1 mypackage/**/*.py7. Ví dụ: bạn có thể thêm trình trang trí futurize --stage1 mypackage/**/*.py004 vào bất kỳ lớp nào xác định các phương thức tùy chỉnh của futurize --stage1 mypackage/**/*.py005. Xem để biết thêm thông tin futurize --stage1 mypackage/**/*.py 8 hướng dẫn bắt đầu nhanhCách chuyển đổi mã Py2 thành mã Py2/3 bằng cách sử dụng futurize --stage1 mypackage/**/*.py8 Bước 0. thành lậpBước 0 mục tiêu. thiết lập và xem các bài kiểm tra vượt qua Python 2 và thất bại trên Python 3
Bước 1. mã Py2 hiện đạiMục tiêu của bước này là hiện đại hóa mã Python 2 mà không đưa ra bất kỳ phụ thuộc nào (trên futurize --stage1 mypackage/**/*.py7 hoặc e. g. futurize --stage1 mypackage/**/*.py018) ở giai đoạn này 1a. Cài đặt futurize --stage1 mypackage/**/*.py7 vào virtualenv bằng cách sử dụng futurize --stage1 mypackage/**/*.py45 1b. Chạy futurize --stage1 mypackage/**/*.py020. Lưu ý rằng với toàn cầu đệ quy trong futurize --stage1 mypackage/**/*.py021 hoặc futurize --stage1 mypackage/**/*.py022, bạn có thể áp dụng đệ quy giai đoạn 1 cho tất cả các tệp nguồn với futurize --stage1 mypackage/**/*.py46 1c. Cam kết tất cả các thay đổi 1ngày. Chạy lại bộ thử nghiệm trên Py2 và sửa bất kỳ lỗi nào Xem để biết thêm thông tin lỗi ví dụMột lỗi tương đối phổ biến sau khi chuyển đổi là futurize --stage1 mypackage/**/*.py47 Nếu bạn gặp lỗi này, hãy thử thêm một tệp futurize --stage1 mypackage/**/*.py023 trống vào thư mục gói. (Trong ví dụ này, trong thư mục tests/. ) Nếu cách này không hiệu quả và nếu thông báo này xuất hiện cho tất cả các lần kiểm tra, thì chúng phải được gọi theo cách khác (từ dòng cmd hoặc e. g. futurize --stage1 mypackage/**/*.py024). Cách để chạy một mô-đun bên trong một gói trên Python 3 hoặc trên Python 2 với futurize --stage1 mypackage/**/*.py025 đang có hiệu lực, là futurize --stage1 mypackage/**/*.py48 (Để biết thêm thông tin, hãy xem phần PEP 328 và PEP 8 về nhập tuyệt đối. ) Bước 2. mã Py3 đang hoạt động vẫn hỗ trợ Py2Mục tiêu của bước này là vượt qua các bài kiểm tra đầu tiên trên Py3 và sau đó là Py2 một lần nữa với sự trợ giúp của gói futurize --stage1 mypackage/**/*.py7 2a. Chạy futurize --stage1 mypackage/**/*.py49 Bạn có thể xem các thay đổi ở giai đoạn 2 đối với tất cả các tệp nguồn Python theo cách đệ quy với futurize --stage1 mypackage/**/*.py0 Để áp dụng các thay đổi, hãy thêm đối số futurize --stage1 mypackage/**/*.py27 Giai đoạn này thực hiện các chuyển đổi cần thiết để hỗ trợ cả Python 2 và 3. Những thứ này có thể sẽ yêu cầu nhập từ futurize --stage1 mypackage/**/*.py7 trên Py2 (và đôi khi trên Py3), chẳng hạn như futurize --stage1 mypackage/**/*.py1 Theo tùy chọn, bạn có thể sử dụng cờ futurize --stage1 mypackage/**/*.py94 để thêm phần nhập này vào đầu mỗi mô-đun futurize --stage1 mypackage/**/*.py2 Tất cả các chuỗi trong mô-đun sau đó sẽ là unicode trên Py2 (như trên Py3) trừ khi được đánh dấu rõ ràng bằng tiền tố from __future__ import absolute_import from __future__ import division from __future__ import print_function69 Nếu bạn muốn futurize --stage1 mypackage/**/*.py8 nhập tất cả các nội trang đã thay đổi để có ngữ nghĩa Python 3 của chúng trên Python 2, hãy gọi nó như thế này futurize --stage1 mypackage/**/*.py3 2b. Chạy lại thử nghiệm của bạn trên Py3 ngay bây giờ. Thực hiện các thay đổi cho đến khi bài kiểm tra của bạn vượt qua Python 3 2c. Cam kết thay đổi của bạn. . ) 2ngày. Bây giờ hãy chạy thử nghiệm của bạn trên Python 2 và nhận thấy các lỗi. Thêm trình bao bọc từ futurize --stage1 mypackage/**/*.py7 để kích hoạt lại khả năng tương thích Python 2. Xem cheat sheet và để biết thêm thông tin Sau mỗi lần thay đổi, hãy chạy lại các thử nghiệm trên Py3 và Py2 để đảm bảo chúng vượt qua cả hai 2e. Bạn đã hoàn tất. Kỉ niệm. Đẩy mã của bạn và thông báo với thế giới. Hashtags #python3 #python-tương lai futurize --stage1 mypackage/**/*.py 9. Py3 đến Py2/3Đang chạy futurize --stage1 mypackage/**/*.py034 biến mã Python 3 này futurize --stage1 mypackage/**/*.py4 vào mã này chạy trên cả Py2 và Py3 futurize --stage1 mypackage/**/*.py5 Lưu ý rằng cả futurize --stage1 mypackage/**/*.py8 và futurize --stage1 mypackage/**/*.py9 đều tạo các lớp kiểu mới rõ ràng kế thừa từ futurize --stage1 mypackage/**/*.py037 trên cả hai phiên bản Python và cả hai đều tham chiếu đến các mô-đun stdlib (cũng như nội trang) dưới tên Py3 của chúng Cũng lưu ý rằng mô-đun futurize --stage1 mypackage/**/*.py038 là trường hợp đặc biệt; . //pypi. org/project/configparser/), vì vậy, kể từ v0. 16. 0, futurize --stage1 mypackage/**/*.py039 không còn cung cấp bí danh gói futurize --stage1 mypackage/**/*.py038. Để sử dụng mã kết quả trên Py2, hãy cài đặt backport futurize --stage1 mypackage/**/*.py038 với futurize --stage1 mypackage/**/*.py042 hoặc bằng cách thêm nó vào tệp futurize --stage1 mypackage/**/*.py043 của bạn futurize --stage1 mypackage/**/*.py9 cũng xử lý các tính năng sau của Python 3
Để xử lý các chú thích chức năng (PEP 3107), hãy xem hạn chế đã biếtfuturize --stage1 mypackage/**/*.py8 và futurize --stage1 mypackage/**/*.py9 rất hữu ích để tự động hóa phần lớn công việc chuyển, đặc biệt là thay thế văn bản lặp đi lặp lại nhàm chán. Chúng cũng giúp đánh dấu phần nào của mã cần chú ý Tuy nhiên, futurize --stage1 mypackage/**/*.py8 và futurize --stage1 mypackage/**/*.py9 vẫn chưa hoàn chỉnh và mắc một số lỗi, chẳng hạn như 2 đến 3, dựa vào đó. Vui lòng báo cáo lỗi trên GitHub. Đóng góp cho các trình sửa lỗi dựa trên from __future__ import absolute_import from __future__ import division from __future__ import print_function1 cho futurize --stage1 mypackage/**/*.py8 và futurize --stage1 mypackage/**/*.py9 đặc biệt được hoan nghênh. xin vui lòng xem futurize --stage1 mypackage/**/*.py8 hiện không tự động thực hiện thay đổi sau
|