GNU/Linux >> Belajar Linux >  >> Linux

Mengonversi kode Python 2 Anda ke Python 3

Python 2 mencapai akhir masa pakainya pada 1 Januari 2020. Python 3 telah tersedia sejak 2008, tetapi konversi dari 2 ke 3 lambat karena ketergantungan pada pustaka yang tidak tersedia di Python 3 pada awalnya, versi python 3 sebelumnya lebih lambat dari python 2 dan juga karena Python 2 bekerja cukup baik untuk banyak orang. Python 2 End of Life berarti tidak ada lagi rilis yang didukung dan tidak ada perbaikan bug dari Python. Beberapa distribusi Linux seperti Ubuntu dan Red Hat akan mendukung Python 2 untuk beberapa waktu, tetapi migrasi ke Python 3 adalah solusi yang lebih baik.

Saya pikir Python 3 kompatibel dengan Python 2?

Tidak 100%. Perubahan dari Python 2 ke Python 3 diambil sebagai kesempatan untuk "memperbaiki" beberapa masalah dengan Python 2. Di antaranya mempromosikan Unicode lebih seragam di seluruh bahasa dan untuk menjernihkan beberapa masalah dalam sintaks seperti print menjadi pernyataan daripada a fungsi.

Beberapa perbedaan antara Python 2 dan Python 3

Beberapa pernyataan seperti print, exec, dan lainnya telah diubah menjadi fungsi bawaan. Contoh:

print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2

Divisi Integer juga telah diubah. Contoh:

print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5

// telah ditambahkan ke python 3 untuk mendukung perilaku lama

Banyak fungsi sekarang mengembalikan unicode/byte di python 3 alih-alih ascii/str string di python 2. Contoh:

type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2

Untuk mengonversi python 3 menjadi string, Anda dapat menggunakan opsi .decode('ascii').

type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3

Beberapa perpustakaan telah ditata ulang.

Misalnya. Pustaka python2 urllib2 telah diganti dengan urllib di python 3. Urllib di Python 3 juga tersedia dalam modul seperti urllib.request dan urllib.error sehingga Anda dapat mengimpornya untuk mendapatkan fungsionalitas serupa dengan python 2.

from urllib import urlopen # python 2
from urllib.request import urlopen # python 3

Konversi dari Python 2 ke Python 3 sebagian besar Secara Otomatis

Meskipun Anda dapat membuat semua perubahan untuk mengonversi skrip python Anda dari python 2 ke python 3 dengan tangan, ada alat yang akan melakukan banyak pekerjaan berat untuk Anda. 2to3 adalah paket yang dapat diinstal dari pustaka pip dan juga tersedia sebagai paket terpisah di banyak repositori distribusi. Untuk menginstal melalui pip3

% pip3 install 2to3

Untuk menginstal di Debian/Ubuntu

% sudo apt install 2to3

Untuk menginstal di Fedora/CentOS

% sudo yum install 2to3

Catatan:menginstal dari pip akan memberi Anda versi terbaru, sementara versi distribusi mungkin sedikit lebih lama, jadi instalasi pip mungkin bekerja lebih baik untuk Anda.

Menjalankan 2to3

$ 2to3 --help # will provide you the help message from the system

Beberapa opsi menarik

-l                  # will provide a list of the fixes available in 2to3.  E.g. print, exec, urllib, and others
-x                  # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base
-o                  # output dir, put transformed files into another location
--add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files
-w                  # overwrite current files with modified files

Dengan asumsi Anda memiliki direktori kode python 2 (skrip) dan folder tujuan untuk kode python 3 (skrip3), Anda dapat melakukan hal berikut:Perintah untuk melakukan konversi adalah sebagai berikut

% 2to3 scripts -n -w -o scripts3

Pilihannya adalah sebagai berikut

scripts  - source dir
-n       - no backups
-w       - write-unchanged files, write file even if no changes are required by 2to3
-o       - output directory
scripts3 - output directory, where the converted scripts are written

Dengan cara ini kode asli tidak diubah dan pengguna dapat meninjau kode yang dikonversi di folder scripts3 dan masih merujuk ke kode asli juga.

Modernize adalah pembungkus sekitar 2to3

Ini memiliki perilaku yang mirip dengan 2to3 kecuali mendukung flag --six-unicode yang akan menggunakan enam fungsi pembantu yang membantu mendukung Python 3.1 dan Python 3.2. Saya mungkin akan menggunakan 2to3 kecuali ada fitur menarik yang ditambahkan untuk memodernisasi yang akan mendorong Anda untuk menggunakannya. Modernisasi juga tersedia dengan beberapa distribusi seperti pengujian Debian dan Arch. Untuk menginstal

# pip3 install modernize

Untuk menjalankan

# python-modernize --help

Kiat

Lakukan

Do conversion in small chunks
Do use tools like pylint to help you figure out problematic code, before you convert it
Do compare the code before and after the conversion
Do use the debugger to validate critical code

Larangan

Do not overwrite your code with 2to3, recommend a separate directory
Do not trust in the tools to do everything correctly

Uji, Tes, Tes

Terlepas dari bagaimana Anda mengonversi kode Anda dari Python 2 ke Python 3, Anda harus mengujinya secara menyeluruh. Untuk kode python kritis misi, saya bahkan menyarankan menggunakan python debugger untuk menjalankan kode baris demi baris.

# python3 -m pdb 

Kemudian ketik n untuk menuju ke baris berikutnya dalam skrip Anda, dan q untuk keluar dari debugger.

Kesimpulan

Python 2 sudah mati setelah hidup yang panjang dan berbuah. Jika Anda masih menggunakan Python 2, Anda harus mengonversi ke Python 3. Python menyediakan alat dalam 2to3 yang membantu konversi dari Python 2 ke Python 3 dan membutuhkan banyak kerja keras. 2to3 bukanlah alat yang sempurna, tetapi dapat melakukan banyak pekerjaan untuk Anda dan mengurangi kerumitan konversi dari Python 2 ke 3 dengan beberapa kali lipat.

  • Halaman 2to3 di pustaka dokumentasi Python https://docs.python.org/3/library/2to3.html
  • Perpustakaan modern https://pypi.org/project/modernize/
  • Memindahkan halaman Kode Python 2 ke Python 3 di python.org https://docs.python.org/3/howto/pyporting.html


Linux
  1. Kode Sumber Netstat?

  2. Bisakah kita menggunakan kode C dengan Python?

  3. Kode python untuk memeriksa apakah layanan sedang berjalan atau tidak.?

  1. Skrip Vs Satu Baris?

  2. Lindungi Kode Java Anda dari Rekayasa Terbalik

  3. Mengimpor modul Python dari Bash

  1. Kesalahan Instalasi ConfigParser - python setup.py egg_info gagal dengan kode kesalahan 1 [Terpecahkan]

  2. Bagaimana saya membuat python sendiri dari kode sumber di Ubuntu?

  3. Apa :-!! dalam kode C?