Apa cara yang benar untuk mengurutkan pernyataan Python `import x` dan` dari x import y`?

170

The panduan gaya python menyarankan untuk impor kelompok seperti ini:

Impor harus dikelompokkan dalam urutan berikut:

  1. impor perpustakaan standar
  2. impor pihak ketiga terkait
  3. aplikasi khusus / perpustakaan khusus impor

Namun, tidak disebutkan apa pun bagaimana dua cara impor yang berbeda harus ditata:

from foo import bar
import foo

Ada beberapa cara untuk mengurutkannya (anggap semua impor milik grup yang sama):

  • pertama from..import, laluimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • pertama import, lalufrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • urutan alfabet berdasarkan nama modul, mengabaikan jenis impor

    import abc
    import def
    from g import gg
    import x
    from xx import xx

PEP8 tidak menyebutkan urutan pilihan untuk ini dan fitur "pembersihan impor" beberapa IDE mungkin hanya melakukan apa pun yang disukai pengembang.

Saya mencari PEP lain yang mengklarifikasi ini atau komentar / email yang relevan dari BDFL (atau pengembang inti Python lain). Tolong jangan posting jawaban subjektif yang menyatakan preferensi Anda sendiri.

Pencuri
sumber
20
Untuk pengguna yang memilih untuk menutup ini: Saya tidak meminta pendapat! Silakan baca paragraf terakhir dari pertanyaan saya.
ThiefMaster
9
Saya ragu ada cara yang "benar". Apa salahnya memilih gaya Anda sendiri? Hampir tidak ada konvensi jika tidak ada yang mengetahuinya. Dan apakah itu penting? Apa keuntungan dari menetapkan ini?
Steven Rumbalski
6
+1 terdengar seperti PEP8 harus diperpanjang.
hochl
7
Kelemahan dalam PEP tidak selalu berarti bahwa itu perlu diubah.
Ignacio Vazquez-Abrams
2
Saya biasanya membagi impor menjadi kelompok logis dan kemudian mengurutkan kelompok-kelompok kecil ini dengan panjang garis ... untuk alasan sederhana bahwa mereka terlihat lebih bagus. Jika Anda meletakkan grup logis ini dalam urutan yang logis, maka Anda dapat mencari impor dengan cukup cepat (selain itu Ctrl+Fadalah waktu yang konstan tidak peduli bagaimana Anda mengatur impor ...)
Bakuriu

Jawaban:

112

Impor umumnya diurutkan berdasarkan abjad dan dijelaskan di berbagai tempat di samping PEP 8.

Modul yang diurutkan berdasarkan abjad lebih cepat dibaca dan dapat dicari . Bagaimanapun python adalah tentang keterbacaan. Juga lebih mudah untuk memverifikasi bahwa ada sesuatu yang diimpor, dan menghindari duplikasi impor

Tidak ada yang tersedia di PEP 8 tentang penyortiran. Jadi semuanya tentang pilihan apa yang Anda gunakan.

Menurut beberapa referensi dari situs terkemuka dan repositori juga popularitas, pemesanan abjad adalah caranya.

untuk eg seperti ini:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

ATAU

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Repositori resmi Reddit juga menyatakan bahwa, Secara umum PEP-8 pemesanan impor harus digunakan. Namun ada beberapa tambahan yang ada

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

Referensi:

PS: utilitas isort secara otomatis mengurutkan impor Anda.

Abhishek
sumber
21
Saya tidak melihat di mana Anda menjawab pertanyaan yang sebenarnya ...
liori
3
@liori Saya mengirimkan referensi / tautan yang relevan yang menyatakan bagaimana cara mengurutkan modul. Karena PEP 8 tidak menyebutkan apa pun tetapi banyak referensi lain menyarankan untuk menggunakan metode impor seperti ini.
Abhishek
7
Perhatikan bahwa pertanyaannya adalah tentang penyortiran import xdan from y import zpernyataan relatif satu sama lain. Saya tidak melihat jawaban untuk pertanyaan ini dalam jawaban Anda. Anda pada dasarnya menyatakan kembali bagian dari pertanyaan yang sudah menjelaskan cara pengelompokan PEP8 berdasarkan jenis impor. Jika jawaban untuk pertanyaan khusus ini ada di beberapa tautan, silakan kutip bagian yang relevan.
liori
2
Saya ingin mencatat pandangan berbeda tentang klaim bahwa pernyataan impor yang diurutkan menurut abjad lebih mudah dibaca. Saya menemukan mereka jauh lebih sulit dibaca dibandingkan dengan pernyataan impor yang diurutkan berdasarkan panjang. Jika Anda mengurutkan secara leksikal dalam kelompok panjang tertentu, itu akan baik-baik saja dan bahkan mungkin bermanfaat. Tetapi, saya akan menemukan import datetimediikuti oleh import os lebih sulit untuk dibaca daripada import osdiikuti oleh import datetime. Dan perbedaan dalam mencari mereka yang diberikan pengurutan leksikal vs tidak diurutkan secara leksikal sangat sepele sehingga sama sekali tidak masalah bahkan dengan cara apa pun.
ely
Pesanan apa yang harus digunakan untuk impor swasta vs publik? ( import _tkintervs import unittest)
Stevoisiak
30

Menurut konvensi pengkodean internal CIA (bagian dari kebocoran WikiLeaks Vault 7 ), impor python harus dikelompokkan menjadi tiga kelompok:

  1. Impor perpustakaan standar
  2. Impor pihak ketiga
  3. Impor khusus aplikasi

Impor harus dipesan secara leksikografis dalam kelompok-kelompok ini, dengan mengabaikan kasus:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
sumber
23
Terpilih untuk faktor ketawa bahwa itu adalah pedoman gaya pengkodean CIA. Sangat pintar, tetapi pada saat yang sama relevan mengingat tingkat keahlian yang datang dari para pengembang tersebut.
Tyler James Harden
5
itulah panduan gaya python google
Marius Mucenicu
2
Tautan yang diperbarui: Panduan Gaya Python Google - Bagian 3.13: Pemformatan impor .
Mateen Ulhaq
1
Tapi itu tidak mengikuti dari contoh jika from x import yharus sebelum atau sesudah from y import x- apakah itu nama modul atau impor aktual yang menentukan pesanan?
Niklas R.
1
Saya tahu ini lelucon, tetapi sebagai kutu buku yang tepat saya ingin menunjukkan bahwa ini sebenarnya berasal dari PEP8
Marat
8

PEP 8 memang tidak mengatakan apa-apa tentang itu. Tidak ada konvensi untuk poin ini, dan itu tidak berarti komunitas Python perlu mendefinisikannya secara absolut. Pilihan bisa lebih baik untuk suatu proyek tetapi yang terburuk untuk yang lain ... Ini masalah preferensi untuk ini, karena setiap solusi memiliki pro dan kontra. Tetapi jika Anda ingin mengikuti konvensi, Anda harus menghormati perintah utama yang Anda kutip:

  1. impor perpustakaan standar
  2. impor pihak ketiga terkait
  3. aplikasi khusus / perpustakaan khusus impor

Sebagai contoh, Google merekomendasikan di halaman ini bahwa impor harus diurutkan secara leksikografis , di setiap kategori (standar / pihak ketiga / milik Anda). Tapi di Facebook, Yahoo dan apa pun, itu mungkin konvensi lain ...

Maxime Lorant
sumber
0

Semua import xpernyataan harus diurutkan berdasarkan nilai xdan semua from x import ypernyataan harus diurutkan berdasarkan nilai xdalam urutan abjad dan kelompok from x import ypernyataan yang diurutkan harus mengikuti kelompok import xpernyataan yang diurutkan .

import abc
import def
import x
from g import gg
from x import xx
from z import a
Astitva Srivastava
sumber
0

Saya merasa jawaban yang diterima agak terlalu bertele-tele. Inilah TLDR:

Dalam setiap pengelompokan, impor harus diurutkan secara leksikografis, mengabaikan case, sesuai dengan jalur paket lengkap setiap modul

Panduan gaya kode Google

Jadi, opsi ketiga sudah benar:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Marat
sumber