Làm cách nào để biến python 2.7 thành mặc định của tôi?

Năm 2020 đang đến gần và đã đến lúc chuyển đổi python mặc định của bạn nếu bạn chưa làm như vậy. Bảo trì Python 2. 7 đã dừng kể từ ngày 1 tháng 1. Điều này có nghĩa là phiên bản python hiện tại của bạn hiện là mã kế thừa. Mặc dù việc giữ phiên bản Python 2 trên hệ thống của bạn vẫn có thể hữu ích cho các tập lệnh cũ hơn, nhưng bây giờ là lúc để cập nhật hệ thống của bạn. Trong phần tóm tắt này, chúng tôi sẽ tải xuống Python 3, đặt nó làm mặc định và lưu trữ Python 2 dưới dạng bí danh. Bây giờ để bắt đầu, hãy khám phá môi trường Python hiện tại của chúng ta

Nguồn XKCD

Để tìm vị trí Python mặc định của chúng tôi trên hệ thống, chỉ cần gõ

which python

Điều này sẽ cho bạn thấy đường dẫn của Python mặc định. Điều này có thể hữu ích nếu bạn có Python mặc định bên ngoài hệ thống/usr/local/bin như tôi. Python mặc định của tôi là một phần của bản phân phối Anaconda. Để xem cách thay đổi Python mặc định trong bản phân phối Anaconda, hãy cuộn xuống một chút qua các phương thức mặc định

Hệ thống MacOS mặc định

Để xem phiên bản hiện tại của Python, chỉ cần gõ

python --version

Phiên bản hiện tại của tôi là 2. 7. 15. Để thay đổi phiên bản mặc định trên MacOS, chúng ta có thể bắt đầu bằng cách tải xuống trình cài đặt mới nhất từ ​​trang tải xuống Python [https. //www. con trăn. org/tải xuống/mac-osx/]. Tải xuống trình cài đặt sẽ chèn phiên bản mới vào /usr/local/bin. Trước khi thay đổi Python mặc định, hãy liên kết phiên bản Python 2 cũ với lệnh python2

echo "alias python2=/usr/local/bin/python2.7" >> ~/.bashrc

Bí danh “python2” có nghĩa là khi chúng ta gõ lệnh, phiên bản python mặc định sẽ là bản phân phối Python 2 của chúng ta. Bây giờ, hãy tạo bí danh cho Python 3 mới

echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc

Nên làm vậy. Một hạn chế của phương pháp này là bạn phải đặt lại bí danh của mình theo cách thủ công nếu muốn cập nhật phiên bản Python. Ý nghĩa cho Python 3. 9 bạn sẽ phải thực hiện lại lệnh trước đó

Nâng cấp với Anaconda Base

Hệ thống của tôi sử dụng phân phối Python mặc định ngoài Anaconda. Để thay đổi phiên bản Python mặc định, chỉ cần gõ

conda install python=3.8.1

Điều này sẽ cài đặt Python 3. 8. 1. Để kiểm tra tất cả các phiên bản Python có sẵn trên Anaconda, chỉ cần gõ

conda search python

Quá trình cài đặt phiên bản Python mới hơn có thể mất vài phút và các giải pháp xung đột bổ sung vì các gói bạn đã tải xuống trước đó có thể không tương thích với phiên bản Python mới hơn

Ở đó bạn có nó. Hướng dẫn đơn giản về cập nhật mặc định Python của bạn để bạn sẵn sàng cho thập kỷ này. Tên tôi là Cody Glickman và bạn có thể tìm thấy tôi trên LinkedIn

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.

    conda search python
    7]

  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 [

    conda search python
    8]

  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 [

    conda search python
    9]

  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
    
    0]

  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 thích 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
python --version
60 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,

python --version
61 chứ không phải
python --version
62; . 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
python --version
65 vào bất kỳ và tất cả các tệp sử dụng toán tử
python --version
66 và
python --version
67 hoặc đang chạy trình thông dịch với cờ
python --version
68. 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

    python --version
    65 vào tệp của bạn

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

    python --version
    67 để sử dụng phép chia sàn hoặc tiếp tục sử dụng
    python --version
    66 và mong đợi một số float

Lý do mà

python --version
66 không được dịch tự động sang
python --version
67 một cách đơn giản là vì nếu một đối tượng xác định một phương thức
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
04 nhưng không phải là
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
05 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
python --version
66 để biểu thị một số hoạt động nhưng không phải là
python --version
67 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

echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 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
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 đã 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 là đố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
conda search python
60 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

conda search python
60 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
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 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à
conda search python
60 trong Python 2 và
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 trong Python 3, đối với nhị phân là
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08/
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
conda search python
70 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ì
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 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
conda search python
72 đã đượ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 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ố

conda search python
73 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ố
conda search python
74 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ố
conda search python
73 hoặc
conda search python
74 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 là bạn không phải lúc nào cũng bận tâm thêm chế độ

conda search python
73 khi mở tệp nhị phân [e. g. ,
conda search python
79 để đọ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ả

echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08 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. Chuyể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.
conda search python
90. 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.
conda search python
92. Một lo lắng tương tự là cần thiết khi chuyển một đối tượng byte tới
echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
08. Trong Python 2, bạn chỉ cần lấy lại đối tượng byte.
conda search python
94. Nhưng trong Python 3, bạn có được biểu diễn chuỗi của đối tượng byte.
conda search python
95

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,

conda search python
96 trong khi ở Python 3
conda search python
97. 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ì
conda search python
98, 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à
conda search python
99 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
00

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

    conda search python
    60 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ố

    conda search python
    73, chữ nguyên văn bằng tiền tố
    conda search python
    74

  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ế độ

    conda search python
    73 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

conda search python
0

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

python --version
6

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

echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
0

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
09 để đượ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ả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
10 thì bạn có thể đảm bảo rằng mình không vô tình bỏ lỡ cảnh bá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
11 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

Sau 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
14 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 tox 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
15 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 phép 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
16, nhưng nếu bạn mắc lỗi khi 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. Các 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

Là Python 2. 7 còn dùng được không?

Mặc dù Python 2 gần như đã lỗi thời nhưng nó vẫn được một số chuyên gia phần mềm sử dụng cho đến ngày nay do một số tính năng đặc biệt của nó.

Tôi có nên sử dụng Python 2. 7 hay 3?

Mặc dù Python 2 đã có thời hoàng kim vào đầu những năm 2000, nhưng Python 3 là lựa chọn tốt nhất để học vào năm 2022 . Bạn có thể thấy một số trường hợp cần sử dụng Python 2, nhưng nhìn chung, Python 3 là ngôn ngữ phổ biến nhất. Kể từ khi Python 2 ngừng hoạt động vào năm 2020, Python 3 đã thống trị thế giới lập trình.

Chủ Đề