Làm cách nào để chạy 3 tệp python?

Với Python 3 là tương lai của Python trong khi Python 2 vẫn đang được sử dụng tích cực, thật tốt khi dự án của bạn có sẵn cho cả hai bản phát hành chính của Python. Hướng dẫn này nhằm giúp bạn tìm ra cách tốt nhất để hỗ trợ đồng thời cả Python 2 & 3

Nếu bạn đang muốn chuyển một mô-đun mở rộng thay vì mã Python thuần túy, vui lòng xem

Nếu bạn muốn đọc ý kiến ​​của một nhà phát triển Python cốt lõi về lý do Python 3 ra đời, bạn có thể đọc phần Hỏi & Đáp về Python 3 của Nick Coghlan hoặc Tại sao Python 3 tồn tại của Brett Cannon

Để được trợ giúp về chuyển, bạn có thể xem danh sách gửi thư chuyển python đã lưu trữ

Giải thích ngắn gọn

Để làm cho dự án của bạn tương thích với Python 2/3 nguồn đơn, các bước cơ bản là

  1. Chỉ lo về việc hỗ trợ Python 2. 7

  2. Hãy chắc chắn rằng bạn có phạm vi kiểm tra tốt [bảo hiểm. py có thể giúp đỡ;

  3. Tìm hiểu sự khác biệt giữa Python 2 & 3

  4. Sử dụng Futurize [hoặc Modernize] để cập nhật mã của bạn [e. g.

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    1]

  5. Sử dụng Pylint để giúp đảm bảo rằng bạn không thụt lùi với hỗ trợ Python 3 của mình [

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    2]

  6. Sử dụng caniusepython3 để tìm ra phần phụ thuộc nào đang chặn việc bạn sử dụng Python 3 [

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    3]

  7. Khi các phụ thuộc của bạn không còn chặn bạn nữa, hãy sử dụng tích hợp liên tục để đảm bảo bạn luôn tương thích với Python 2 & 3 [tox có thể giúp kiểm tra nhiều phiên bản Python;

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    4]

  8. Cân nhắc sử dụng kiểm tra kiểu tĩnh tùy chọn để đảm bảo việc sử dụng kiểu của bạn hoạt động trong cả Python 2 & 3 [e. g. sử dụng mypy để kiểm tra cách gõ của bạn trong cả Python 2 và Python 3;

Ghi chú

Ghi chú. Sử dụng

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
0 đảm bảo rằng
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
1 bạn gọi là một cài đặt cho Python hiện đang được sử dụng, cho dù đó là một
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
1 toàn hệ thống hay một cài đặt trong một

Chi tiết

Một điểm quan trọng về việc hỗ trợ đồng thời Python 2 & 3 là bạn có thể bắt đầu ngay hôm nay. Ngay cả khi các phụ thuộc của bạn không hỗ trợ Python 3, điều đó không có nghĩa là bạn không thể hiện đại hóa mã của mình để hỗ trợ Python 3. Hầu hết các thay đổi cần thiết để hỗ trợ Python 3 dẫn đến mã sạch hơn bằng cách sử dụng các phương pháp mới hơn ngay cả trong mã Python 2

Một điểm quan trọng khác là việc hiện đại hóa mã Python 2 của bạn để hỗ trợ Python 3 phần lớn được tự động hóa cho bạn. Mặc dù bạn có thể phải đưa ra một số quyết định API nhờ Python 3 làm rõ dữ liệu văn bản so với dữ liệu nhị phân, công việc cấp thấp hơn hiện hầu hết được thực hiện cho bạn và do đó ít nhất có thể hưởng lợi từ các thay đổi tự động ngay lập tức

Hãy ghi nhớ những điểm chính đó trong khi bạn đọc về các chi tiết chuyển mã của bạn để hỗ trợ đồng thời Python 2 & 3

Bỏ hỗ trợ cho Python 2. 6 tuổi trở lên

Trong khi bạn có thể tạo Python 2. 5 làm việc với Python 3, sẽ dễ dàng hơn nhiều nếu bạn chỉ phải làm việc với Python 2. 7. Nếu bỏ Python 2. 5 không phải là một tùy chọn thì dự án Six có thể giúp bạn hỗ trợ Python 2. 5 & ​​3 đồng thời [

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
3]. Tuy nhiên, hãy nhận ra rằng gần như tất cả các dự án được liệt kê trong HOWTO này sẽ không có sẵn cho bạn

Nếu bạn có thể bỏ qua Python 2. 5 trở lên, thì các thay đổi bắt buộc đối với mã của bạn sẽ tiếp tục trông giống như mã Python đặc trưng. Tệ nhất là bạn sẽ phải sử dụng một hàm thay vì một phương thức trong một số trường hợp hoặc phải nhập một hàm thay vì sử dụng một hàm tích hợp sẵn, nhưng nếu không thì quá trình chuyển đổi tổng thể sẽ không khiến bạn cảm thấy xa lạ

Nhưng bạn nên đặt mục tiêu chỉ hỗ trợ Python 2. 7. Trăn 2. 6 không còn được hỗ trợ miễn phí và do đó không nhận được các bản sửa lỗi. Điều này có nghĩa là bạn sẽ phải giải quyết mọi vấn đề bạn gặp phải với Python 2. 6. Ngoài ra còn có một số công cụ được đề cập trong HOWTO này không hỗ trợ Python 2. 6 [e. g. , Pylint] và điều này sẽ trở nên phổ biến hơn theo thời gian. Đơn giản là sẽ dễ dàng hơn cho bạn nếu bạn chỉ hỗ trợ các phiên bản Python mà bạn phải hỗ trợ

Đảm bảo bạn chỉ định hỗ trợ phiên bản phù hợp trong tệp
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4 của mình

Trong tệp

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4 của bạn, bạn nên có trình phân loại trove phù hợp chỉ định phiên bản Python nào bạn hỗ trợ. Vì dự án của bạn không hỗ trợ Python 3 nên ít nhất bạn phải chỉ định
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
6. Tốt nhất là bạn cũng nên chỉ định từng phiên bản chính/phụ của Python mà bạn hỗ trợ, chẳng hạn như. g.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
7

Có phạm vi kiểm tra tốt

Khi bạn có mã hỗ trợ phiên bản Python 2 cũ nhất mà bạn muốn, bạn sẽ muốn đảm bảo rằng bộ thử nghiệm của mình có phạm vi bảo hiểm tốt. Một nguyên tắc nhỏ là nếu bạn muốn đủ tự tin trong bộ thử nghiệm của mình thì bất kỳ lỗi nào xuất hiện sau khi các công cụ viết lại mã của bạn đều là lỗi thực sự trong công cụ chứ không phải trong mã của bạn. Nếu bạn muốn nhắm đến một con số, hãy cố gắng đạt được mức độ phù hợp trên 80% [và đừng cảm thấy tồi tệ nếu bạn thấy khó đạt được mức độ phù hợp cao hơn 90%]. Nếu bạn chưa có công cụ để đo phạm vi kiểm tra thì phạm vi. py được khuyên dùng

Tìm hiểu sự khác biệt giữa Python 2 & 3

Khi mã của bạn đã được kiểm tra kỹ lưỡng, bạn đã sẵn sàng bắt đầu chuyển mã của mình sang Python 3. Nhưng để hiểu đầy đủ mã của bạn sẽ thay đổi như thế nào và bạn muốn chú ý điều gì khi viết mã, bạn sẽ muốn tìm hiểu những thay đổi mà Python 3 tạo ra đối với Python 2. Thông thường, hai cách tốt nhất để làm điều đó là đọc tài liệu cho mỗi bản phát hành Python 3 và sách Chuyển sang Python 3 [miễn phí trực tuyến]. Ngoài ra còn có một mánh gian lận tiện dụng từ dự án Python-Future

Cập nhật mã của bạn

Khi bạn cảm thấy mình biết Python 3 khác với Python 2 ở điểm nào, đã đến lúc cập nhật mã của bạn. Bạn có thể lựa chọn giữa hai công cụ để tự động chuyển mã của mình. Tương lai hóa và hiện đại hóa. Công cụ bạn chọn sẽ phụ thuộc vào mức độ giống Python 3 mà bạn muốn mã của mình. Futurize cố gắng hết sức để làm cho các thành ngữ và thực hành Python 3 tồn tại trong Python 2, e. g. nhập lại loại

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 từ Python 3 để bạn có sự tương đương về ngữ nghĩa giữa các phiên bản chính của Python. Mặt khác, Modernize bảo thủ hơn và nhắm mục tiêu tập hợp con Python 2/3 của Python, trực tiếp dựa vào sáu để giúp cung cấp khả năng tương thích. Vì Python 3 là tương lai, nên tốt nhất bạn nên xem xét Futurize để bắt đầu điều chỉnh theo bất kỳ phương pháp mới nào mà Python 3 giới thiệu mà bạn chưa quen

Bất kể bạn chọn công cụ nào, họ sẽ cập nhật mã của bạn để chạy trên Python 3 trong khi vẫn tương thích với phiên bản Python 2 mà bạn đã bắt đầu. Tùy thuộc vào mức độ bảo thủ mà bạn muốn, trước tiên bạn có thể muốn chạy công cụ trên bộ thử nghiệm của mình và kiểm tra sự khác biệt một cách trực quan để đảm bảo quá trình chuyển đổi là chính xác. Sau khi bạn đã chuyển đổi bộ thử nghiệm của mình và xác minh rằng tất cả các thử nghiệm vẫn vượt qua như mong đợi, thì bạn có thể chuyển đổi mã ứng dụng của mình khi biết rằng bất kỳ thử nghiệm nào không thành công đều là lỗi dịch thuật

Thật không may, các công cụ không thể tự động hóa mọi thứ để làm cho mã của bạn hoạt động trong Python 3 và do đó, có một số thứ bạn sẽ cần cập nhật theo cách thủ công để nhận được hỗ trợ Python 3 đầy đủ [bước nào trong số các bước này là cần thiết khác nhau giữa các công cụ]. Đọc tài liệu về công cụ bạn chọn sử dụng để xem những gì nó sửa theo mặc định và những gì nó có thể làm tùy chọn để biết những gì sẽ [không] được sửa cho bạn và những gì bạn có thể phải tự sửa [e. g. sử dụng

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
9 trên chức năng
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
00 tích hợp bị tắt theo mặc định trong Hiện đại hóa]. Tuy nhiên, may mắn thay, chỉ có một vài điều cần chú ý có thể được coi là vấn đề lớn có thể khó gỡ lỗi nếu không được theo dõi.

Phân công

Trong Python 3,

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
01 chứ không phải
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
02; . Thay đổi này thực sự đã được lên kế hoạch kể từ Python 2. 2 được phát hành vào năm 2002. Kể từ đó, người dùng được khuyến khích thêm
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
05 vào bất kỳ và tất cả các tệp sử dụng toán tử
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
06 và
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
07 hoặc đang chạy trình thông dịch với cờ
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
08. Nếu bạn chưa làm điều này thì bạn sẽ cần xem lại mã của mình và thực hiện hai việc

  1. Thêm

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    05 vào tệp của bạn

  2. Cập nhật bất kỳ toán tử chia nào cần thiết để sử dụng

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    07 để sử dụng phép chia sàn hoặc tiếp tục sử dụng
    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    06 và mong đợi một số float

Lý do mà ________ 106 không được dịch tự động sang

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
07 một cách đơn giản là vì nếu một đối tượng định nghĩa một phương thức ________ 244 nhưng không phải là
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
45 thì mã của bạn sẽ bắt đầu bị lỗi [e. g. một lớp do người dùng định nghĩa sử dụng
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
06 để biểu thị một số hoạt động nhưng không phải là
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
07 cho cùng một thứ hoặc hoàn toàn]

Văn bản so với dữ liệu nhị phân

Trong Python 2, bạn có thể sử dụng loại

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 cho cả dữ liệu văn bản và dữ liệu nhị phân. Thật không may, sự hợp lưu của hai khái niệm khác nhau này có thể dẫn đến mã dễ vỡ đôi khi hoạt động cho cả hai loại dữ liệu, đôi khi không. Nó cũng có thể dẫn đến các API khó hiểu nếu mọi người không tuyên bố rõ ràng rằng thứ gì đó đã chấp nhận
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 đã chấp nhận dữ liệu văn bản hoặc dữ liệu nhị phân thay vì một loại cụ thể. Điều này làm phức tạp tình hình, đặc biệt đối với bất kỳ ai hỗ trợ nhiều ngôn ngữ vì API sẽ không bận tâm hỗ trợ rõ ràng cho
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
00 khi họ yêu cầu hỗ trợ dữ liệu văn bản

Để làm cho sự khác biệt giữa dữ liệu văn bản và dữ liệu nhị phân rõ ràng và rõ ràng hơn, Python 3 đã làm điều mà hầu hết các ngôn ngữ được tạo ra trong thời đại internet đã làm và tạo ra các loại dữ liệu văn bản và dữ liệu nhị phân riêng biệt không thể trộn lẫn với nhau một cách mù quáng [Python có trước quyền truy cập rộng rãi vào . Đối với bất kỳ mã nào chỉ xử lý văn bản hoặc chỉ dữ liệu nhị phân, sự tách biệt này không gây ra vấn đề gì. Nhưng đối với mã phải xử lý cả hai, điều đó có nghĩa là bây giờ bạn có thể phải quan tâm đến việc khi nào bạn đang sử dụng văn bản so với dữ liệu nhị phân, đó là lý do tại sao điều này không thể hoàn toàn tự động

Để bắt đầu, bạn sẽ cần phải quyết định API nào lấy văn bản và API nào lấy nhị phân [bạn không nên thiết kế các API có thể lấy cả hai do khó giữ cho mã hoạt động; như đã nêu trước đó, rất khó để làm tốt . Trong Python 2, điều này có nghĩa là đảm bảo các API lấy văn bản có thể hoạt động với

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
00 và những API hoạt động với dữ liệu nhị phân hoạt động với loại
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 từ Python 3 [là một tập hợp con của
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 trong Python 2 và hoạt động như một bí danh cho loại
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 trong . Thông thường, vấn đề lớn nhất là nhận ra phương thức nào tồn tại đồng thời trên loại nào trong Python 2 và 3 [đối với văn bản là
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
00 trong Python 2 và
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 trong Python 3, đối với nhị phân là
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48/
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 trong Python 2 và
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 trong Python 3]. Bảng sau liệt kê các phương thức duy nhất của từng loại dữ liệu trên Python 2 & 3 [e. g. , phương thức
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
10 có thể sử dụng được trên loại dữ liệu nhị phân tương đương trong Python 2 hoặc 3, nhưng nó không thể được sử dụng bởi loại dữ liệu văn bản nhất quán giữa Python 2 và 3 vì
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 trong Python 3 không có phương thức này]. Xin lưu ý rằng kể từ Python 3. 5, phương thức
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
12 đã được thêm vào loại byte

dữ liệu văn bản

Dữ liệu nhị phân

giải mã

mã hóa

định dạng

là số thập phân

số học

Có thể thực hiện việc phân biệt dễ dàng hơn bằng cách mã hóa và giải mã giữa dữ liệu nhị phân và văn bản ở cạnh mã của bạn. Điều này có nghĩa là khi bạn nhận được văn bản ở dạng dữ liệu nhị phân, bạn nên giải mã nó ngay lập tức. Và nếu mã của bạn cần gửi văn bản dưới dạng dữ liệu nhị phân thì hãy mã hóa nó càng muộn càng tốt. Điều này cho phép mã của bạn chỉ hoạt động với văn bản bên trong và do đó loại bỏ việc phải theo dõi loại dữ liệu bạn đang làm việc

Vấn đề tiếp theo là đảm bảo rằng bạn biết liệu chuỗi ký tự trong mã của bạn đại diện cho dữ liệu văn bản hay dữ liệu nhị phân. Bạn nên thêm tiền tố

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
13 vào bất kỳ chữ nào thể hiện dữ liệu nhị phân. Đối với văn bản, bạn nên thêm tiền tố
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
14 vào chữ văn bản. [có một thao tác nhập để buộc tất cả các chữ không xác định phải là Unicode, nhưng việc sử dụng cho thấy nó không hiệu quả bằng việc thêm tiền tố
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
13 hoặc
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
14 vào tất cả các chữ một cách rõ ràng]

Là một phần của sự phân đôi này, bạn cũng cần cẩn thận khi mở tệp. Trừ khi bạn đang làm việc trên Windows, có khả năng bạn không phải lúc nào cũng bận tâm thêm chế độ

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
13 khi mở tệp nhị phân [e. g. ,
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
19 để đọc nhị phân]. Trong Python 3, các tệp nhị phân và tệp văn bản rõ ràng là khác biệt và không tương thích lẫn nhau; . Do đó, bạn phải đưa ra quyết định xem một tệp sẽ được sử dụng để truy cập nhị phân [cho phép đọc và/hoặc ghi dữ liệu nhị phân] hay truy cập văn bản [cho phép đọc và/hoặc ghi dữ liệu văn bản]. Bạn cũng nên sử dụng để mở tệp thay vì chức năng tích hợp vì mô-đun nhất quán từ Python 2 đến 3 trong khi chức năng tích hợp thì không [thực ra trong Python 3]. Đừng bận tâm đến cách sử dụng đã lỗi thời vì điều đó chỉ cần thiết để duy trì khả năng tương thích với Python 2. 5

Hàm tạo của cả

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48 và
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 có ngữ nghĩa khác nhau cho cùng một đối số giữa Python 2 & 3. Truyền một số nguyên tới
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 trong Python 2 sẽ cung cấp cho bạn chuỗi biểu diễn của số nguyên.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
30. Nhưng trong Python 3, một đối số số nguyên thành
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
8 sẽ cung cấp cho bạn một đối tượng byte miễn là số nguyên được chỉ định, chứa đầy các byte rỗng.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
32. Một lo lắng tương tự là cần thiết khi chuyển một đối tượng byte tới
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
48. Trong Python 2, bạn chỉ cần lấy lại đối tượng byte.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
34. Nhưng trong Python 3, bạn có được biểu diễn chuỗi của đối tượng byte.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
35

Cuối cùng, việc lập chỉ mục dữ liệu nhị phân yêu cầu xử lý cẩn thận [cắt lát không yêu cầu bất kỳ xử lý đặc biệt nào]. Trong Python 2,

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
36 trong khi ở Python 3
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
37. Vì dữ liệu nhị phân chỉ đơn giản là một tập hợp các số nhị phân, Python 3 trả về giá trị số nguyên cho byte mà bạn lập chỉ mục trên đó. Nhưng trong Python 2 vì
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
38, lập chỉ mục trả về một lát byte một mục. Dự án Six có một hàm tên là
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
39 sẽ trả về một số nguyên như trong Python 3.
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
40

Để tóm tắt

  1. Quyết định API nào lấy văn bản và API nào lấy dữ liệu nhị phân

  2. Đảm bảo rằng mã của bạn hoạt động với văn bản cũng hoạt động với

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    00 và mã cho dữ liệu nhị phân hoạt động với
    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    8 trong Python 2 [xem bảng trên để biết những phương pháp bạn không thể sử dụng cho từng loại]

  3. Đánh dấu tất cả các chữ nhị phân bằng tiền tố

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    13, chữ nguyên văn bằng tiền tố
    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    14

  4. Giải mã dữ liệu nhị phân thành văn bản càng sớm càng tốt, mã hóa văn bản dưới dạng dữ liệu nhị phân càng muộn càng tốt

  5. Mở tệp bằng cách sử dụng và đảm bảo chỉ định chế độ

    import sys
    
    if sys.version_info[0] > 2:
        from importlib import abc
    else:
        from importlib2 import abc
    
    13 khi thích hợp

  6. Hãy cẩn thận khi lập chỉ mục vào dữ liệu nhị phân

Sử dụng phát hiện tính năng thay vì phát hiện phiên bản

Chắc chắn bạn sẽ có mã phải chọn việc cần làm dựa trên phiên bản Python đang chạy. Cách tốt nhất để làm điều này là phát hiện tính năng xem phiên bản Python bạn đang chạy có hỗ trợ những gì bạn cần hay không. Nếu vì lý do nào đó mà nó không hoạt động thì bạn nên kiểm tra phiên bản dựa trên Python 2 chứ không phải Python 3. Để giúp giải thích điều này, hãy xem xét một ví dụ

Hãy giả sử rằng bạn cần quyền truy cập vào một tính năng có sẵn trong thư viện chuẩn của Python kể từ Python 3. 3 và có sẵn cho Python 2 thông qua importlib2 trên PyPI. Bạn có thể muốn viết mã để truy cập e. g. mô-đun bằng cách làm như sau

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4

Vấn đề với mã này là điều gì sẽ xảy ra khi Python 4 xuất hiện?

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc

Tuy nhiên, giải pháp tốt nhất là không phát hiện phiên bản nào cả và thay vào đó dựa vào phát hiện tính năng. Điều đó tránh mọi vấn đề tiềm ẩn về việc phát hiện phiên bản sai và giúp bạn tương thích trong tương lai

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
0

Ngăn chặn hồi quy tương thích

Khi bạn đã dịch hoàn toàn mã của mình để tương thích với Python 3, bạn sẽ muốn đảm bảo rằng mã của mình không bị thụt lùi và ngừng hoạt động trong Python 3. Điều này đặc biệt đúng nếu bạn có một phụ thuộc đang ngăn bạn thực sự chạy dưới Python 3 vào lúc này

Để giúp duy trì tính tương thích, bất kỳ mô-đun mới nào bạn tạo phải có ít nhất khối mã sau ở đầu mô-đun

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4

Bạn cũng có thể chạy Python 2 với cờ

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
49 để được cảnh báo về các sự cố tương thích khác nhau mà mã của bạn gây ra trong quá trình thực thi. Nếu bạn biến các cảnh báo thành lỗi với
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
50 thì bạn có thể đảm bảo rằng mình không vô tình bỏ lỡ một cảnh báo nào

Bạn cũng có thể sử dụng dự án Pylint và cờ

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
51 của nó để tạo mã của bạn để nhận cảnh báo khi mã của bạn bắt đầu đi chệch khỏi khả năng tương thích với Python 3. Điều này cũng giúp bạn không phải chạy Modernize hoặc Futurize trên mã của mình thường xuyên để bắt hồi quy tương thích. Điều này không yêu cầu bạn chỉ hỗ trợ Python 2. 7 và Trăn 3. 4 hoặc mới hơn vì đó là hỗ trợ phiên bản Python tối thiểu của Pylint

Kiểm tra phần phụ thuộc nào chặn quá trình chuyển đổi của bạn

Sau khi bạn đã làm cho mã của mình tương thích với Python 3, bạn nên bắt đầu quan tâm đến việc liệu các phụ thuộc của bạn cũng đã được chuyển chưa. Dự án caniusepython3 được tạo để giúp bạn xác định dự án nào – trực tiếp hoặc gián tiếp – đang cản trở bạn hỗ trợ Python 3. Có cả công cụ dòng lệnh cũng như giao diện web tại https. //caniusepython3. com

Dự án cũng cung cấp mã mà bạn có thể tích hợp vào bộ thử nghiệm của mình để bạn sẽ có một bài kiểm tra không đạt khi bạn không còn bị phụ thuộc ngăn cản sử dụng Python 3. Điều này cho phép bạn tránh phải kiểm tra thủ công các phụ thuộc của mình và được thông báo nhanh chóng khi bạn có thể bắt đầu chạy trên Python 3

Cập nhật tệp
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4 của bạn để biểu thị khả năng tương thích với Python 3

Khi mã của bạn hoạt động trong Python 3, bạn nên cập nhật các trình phân loại trong

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
4 của mình để chứa
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
54 và không chỉ định hỗ trợ Python 2 duy nhất. Điều này sẽ cho bất kỳ ai sử dụng mã của bạn biết rằng bạn hỗ trợ Python 2 và 3. Lý tưởng nhất là bạn cũng sẽ muốn thêm các trình phân loại cho từng phiên bản chính/phụ của Python mà bạn hiện hỗ trợ

Sử dụng tích hợp liên tục để luôn tương thích

Khi bạn có thể chạy hoàn toàn trong Python 3, bạn sẽ muốn đảm bảo mã của mình luôn hoạt động trong cả Python 2 & 3. Có lẽ công cụ tốt nhất để chạy thử nghiệm của bạn dưới nhiều trình thông dịch Python là tox. Sau đó, bạn có thể tích hợp độc tố với hệ thống tích hợp liên tục của mình để không bao giờ vô tình vi phạm hỗ trợ Python 2 hoặc 3

Bạn cũng có thể muốn sử dụng cờ

import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
55 với trình thông dịch Python 3 để kích hoạt một ngoại lệ khi bạn đang so sánh byte với chuỗi hoặc byte với một int [cái sau có sẵn bắt đầu từ Python 3. 5]. Theo mặc định, các so sánh khác kiểu chỉ trả về
import sys

if sys.version_info[0] > 2:
    from importlib import abc
else:
    from importlib2 import abc
56, nhưng nếu bạn mắc lỗi trong việc phân tách xử lý dữ liệu văn bản/dữ liệu nhị phân hoặc lập chỉ mục trên byte, bạn sẽ không dễ dàng tìm thấy lỗi. Cờ này sẽ đưa ra một ngoại lệ khi các loại so sánh này xảy ra, giúp dễ dàng theo dõi lỗi hơn nhiều

Và đó chủ yếu là nó. Tại thời điểm này, cơ sở mã của bạn tương thích đồng thời với cả Python 2 và 3. Thử nghiệm của bạn cũng sẽ được thiết lập để bạn không vô tình làm hỏng khả năng tương thích của Python 2 hoặc 3 bất kể bạn thường chạy thử nghiệm trên phiên bản nào trong khi phát triển

Cân nhắc sử dụng kiểm tra kiểu tĩnh tùy chọn

Một cách khác để giúp chuyển mã của bạn là sử dụng trình kiểm tra kiểu tĩnh như mypy hoặc pytype trên mã của bạn. Những công cụ này có thể được sử dụng để phân tích mã của bạn như thể nó đang chạy trên Python 2, sau đó bạn có thể chạy công cụ này lần thứ hai như thể mã của bạn đang chạy trên Python 3. Bằng cách chạy trình kiểm tra kiểu tĩnh hai lần như thế này, bạn có thể khám phá xem mình có đang. g. lạm dụng kiểu dữ liệu nhị phân trong một phiên bản Python so với phiên bản khác. Nếu bạn thêm gợi ý loại tùy chọn vào mã của mình, bạn cũng có thể nêu rõ liệu API của mình sử dụng dữ liệu văn bản hay dữ liệu nhị phân, giúp đảm bảo mọi thứ hoạt động như mong đợi trong cả hai phiên bản Python

Chủ Đề