Apakah ada format yang direkomendasikan untuk impor multi-baris?

114

Saya telah membaca ada tiga cara untuk mengkodekan impor multi-baris dengan python

Dengan garis miring:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Menggandakan senteces:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

Dengan tanda kurung:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

Apakah ada format yang direkomendasikan atau cara yang lebih elegan untuk pernyataan ini?

Manuel Alvarez
sumber
3
dengan begitu banyak impor, mengapa tidak from Tkinter import *?
Inbar Rose
2
Ini sebuah contoh. Pernyataan sebenarnya adalah from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedFieldtetapi tidak ingin mengimpor semua bidang tersemat lainnya dalam data.forms
Manuel Alvarez
19
Banyak alasan. Misalnya, Anda mungkin menimpa banyak variabel yang tidak Anda sadari. Apakah Anda tahu semua nama yang diimpor oleh from Tkinter import *? Saya tidak. Dan IDE tidak akan tahu apakah nama-nama ini (mungkin), sehingga mereka tidak dapat mengetahui apakah Anda memasukkan nama yang tidak valid.
Thorsten Kranz
2
@InbarRose Itu kebiasaan yang buruk, lihat stackoverflow.com/questions/3615125/…
Yuval Pruss

Jawaban:

161

Secara pribadi saya menggunakan tanda kurung saat mengimpor lebih dari satu komponen dan mengurutkannya menurut abjad. Seperti:

from Tkinter import (
    Button,
    Canvas,
    DISABLED,
    END,
    Entry,
    Frame,
    LEFT,
    NORMAL,
    RIDGE,
    Text,
    Tk,
)

Ini memiliki keuntungan tambahan karena mudah melihat komponen apa yang telah ditambahkan / dihapus di setiap komit atau PR.

Secara keseluruhan meskipun itu adalah preferensi pribadi dan saya akan menyarankan Anda untuk memilih apa pun yang terbaik bagi Anda.

Brendan Maguire
sumber
3
Saya pikir yang penting adalah konsisten (setidaknya, dalam proyek tertentu). Itu akan memudahkan seseorang membaca kode untuk menemukan apa yang diimpor tanpa terlalu banyak kesulitan.
Blckknght
1
isort dapat digunakan untuk secara otomatis memformat impor multi-baris dalam gaya yang berbeda, lihat github.com/timothycrosley/isort#multi-line-output-modes
Motin
16

Contoh Anda tampaknya berasal dari PEP 328 . Di sana, notasi-tanda kurung diusulkan untuk masalah ini, jadi mungkin saya akan memilih yang ini.

Thorsten Kranz
sumber
4

Saya akan menggunakan notasi kurung dari PEP328 dengan baris baru ditambahkan sebelum dan sesudah tanda kurung:

from Tkinter import (
    Tk, Frame, Button, Entry, Canvas, Text, 
    LEFT, DISABLED, NORMAL, RIDGE, END
)

Ini adalah format yang digunakan Django :

from django.test.client import Client, RequestFactory
from django.test.testcases import (
    LiveServerTestCase, SimpleTestCase, TestCase, TransactionTestCase,
    skipIfDBFeature, skipUnlessAnyDBFeature, skipUnlessDBFeature,
)
from django.test.utils import (
    ignore_warnings, modify_settings, override_settings,
    override_system_checks, tag,
)
Max Malysh
sumber
Tidak ada baris baru yang ditambahkan setelah / sebelum tanda kurung di PEP 328?
Gandalf Saxe
@GandalfSaxe PEP 328 adalah tentang semantik (menambahkan fitur baru ke bahasa), bukan tentang pemformatan.
Max Malysh
Saya tidak begitu mengerti. Anda mengutip PEP 328 yang memiliki tanda kurung untuk impor multi-baris, tetapi tidak ada? "Saya akan menggunakan notasi tanda kurung dari PEP328 dengan baris baru ditambahkan sebelum dan sesudah tanda kurung:"
Gandalf Saxe
PEP 328 menambahkan notasi tanda kurung ke bahasa. Notasi kurung adalah kemampuan untuk mengimpor beberapa modul seperti ini: from foo import (bar, baz). PEP 328 tidak menjelaskan apa pun tentang pemformatan.
Max Malysh
Ah ok, saya mengerti apa yang Anda maksud sekarang :)
Gandalf Saxe
-4

Biasanya dengan Tkinter, tidak apa-apa untuk hanya digunakan from Tkinter import *karena modul hanya akan mengekspor nama yang jelas merupakan widget.

PEP 8 tidak mencantumkan konvensi apa pun untuk kasus seperti itu, jadi saya rasa terserah Anda untuk memutuskan opsi apa yang terbaik. Ini semua tentang keterbacaan, jadi pilih apa pun yang memperjelas bahwa Anda mengimpor barang dari satu modul.

Karena semua nama tersebut tersedia dalam cakupan Anda, menurut saya opsi 2 adalah yang paling jelas karena Anda dapat melihat nama yang diimpor sebagai yang terbaik. Anda bahkan dapat membaginya lebih banyak untuk mungkin mengelompokkan nama-nama itu bersama-sama yang dimiliki satu sama lain. Dalam contoh Anda, saya mungkin menempatkan Tk, Framedan Canvassecara terpisah saat mereka mengelompokkan widget bersama, sementara memiliki Buttondan Textsecara terpisah karena mereka adalah komponen yang lebih kecil dalam tampilan.

menyodok
sumber
11
Tidak boleh menggunakan dari X import *
Tolo Palmer
1
@ToloPalmer Biasanya itu benar, tetapi untuk Tkinter ini secara umum tidak masalah, karena Anda hanya mengimpor widget; itu bahkan terdaftar seperti itu di referensi perpustakaan . Dan jika Anda mencantumkan impor sebagai yang pertama, Anda harusnya sangat aman dari konflik apa pun.
aduk
1
Sebagai referensi, masalah from X import *bahkan untuk paket yang digunakan __all__dengan benar adalah bahwa penganalisis kode statis seperti pyflakestidak dapat mendeteksi nama yang tidak ditentukan jika ada import *karena harus berasumsi bahwa nama yang tidak ditentukan mungkin diimpor oleh *.
RubenLaguna