Pertanyaan Haruskah impor wildcard dihindari?


Saya menggunakan PyQt dan berlari ke masalah ini. Jika pernyataan impor saya adalah:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

kemudian pylint memberikan ratusan peringatan "Impor tidak terpakai". Saya ragu-ragu untuk mematikannya, karena mungkin ada impor lain yang tidak digunakan yang sebenarnya berguna untuk dilihat. Pilihan lain adalah melakukan ini:

from PyQt4.QtCore import Qt, QPointF, QRectF
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ...

dan saya akhirnya memiliki 9 kelas di jalur QtGui. Ada opsi ketiga, yaitu:

from PyQt4 import QtCore, QtGui

dan kemudian awali semua kelas dengan QtCore atau QtGui setiap kali saya menggunakannya.

Pada titik ini saya agnostik seperti yang saya lakukan dalam proyek saya, meskipun yang terakhir tampaknya yang paling menyakitkan dari perspektif saya. Apa praktik umum di sini? Adakah alasan teknis untuk menggunakan satu gaya di atas yang lain?


32
2017-09-01 04:54


asal


Jawaban:


Jawaban atas judul pertanyaan Anda adalah "ya": Saya sarankan tidak pernah menggunakan from ... import *, dan saya mendiskusikan alasan-alasan dalam jawaban yang sangat baru. Secara singkat, nama yang memenuhi syarat adalah baik, nama baren sangat terbatas, sehingga "opsi ketiga" optimal (karena Anda akan menggunakan nama yang memenuhi syarat, bukan nama-nama baren) di antara yang Anda sajikan.

(Keuntungan dari nama yang memenuhi syarat wrt barenames termasuk kemudahan berpura-pura / mengejek untuk tujuan pengujian, direduksi menjadi risiko terhapus dari kesalahan tak terlihat yang disebabkan oleh rebinding yang tidak disengaja, kemampuan untuk "semi-palsu" nama teratas dalam "kelas pelacakan" untuk tujuan penebangan apa yang Anda gunakan dan mengurangi aktivitas seperti pembuatan profil, dan sebagainya - kerugian, hampir tidak ada ... lihat juga koan terakhir-tetapi-tidak-paling dalam Zen of Python, import this di prompt interpreter interaktif).

Sama baiknya, jika Anda menaruh dendam 7 karakter ekstra untuk mengatakannya QtCore.whatever, adalah menyingkat - from PyQt4 import QtCore as Cr dan from PyQt4 import QtGi as Gu (kemudian gunakan Cr.blah dan Gu.zorp) atau sejenisnya. Seperti semua singkatan, itu adalah tradeoff gaya antara keringkasan dan kejelasan (apakah Anda lebih suka nama variabel count_of_all_widgets_in_the_inventory, num_widgets, atau x? sering pilihan tengah akan menjadi yang terbaik, tetapi tidak selalu ;-).

BTW, saya tidak akan menggunakan lebih dari satu as klausa dalam satu from atau import pernyataan (bisa membingungkan), saya lebih suka memiliki beberapa pernyataan (juga lebih mudah untuk debug jika ada impor yang memberi masalah, untuk mengedit jika Anda mengubah impor Anda di masa depan, ...).


32
2017-09-01 05:17



Ada juga kasus yang bagus untuk import *. yaitu. itu umum bagi pengembang Django untuk memiliki banyak file konfigurasi dan rantai mereka menggunakan impor *:

settings.py:
FOO = 1
BAR = 2
DEBUG = False

test_settings.py:
from settings import *
DEBUG = True

Dalam hal ini sebagian besar kerugian dari import * menjadi kelebihan.


7
2017-09-01 05:24



Dokumen Python mengatakan:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.

Ini dapat memiliki efek samping dan sangat sulit untuk didebug

Personnaly, saya menggunakan import daripada from import karena saya menemukan deklarasi besar yang mengerikan di awal file dan saya pikir itu membuat kode lebih mudah dibaca

import PyQt4

PyQt4.QtCore

Jika nama modul terlalu panjang dan dapat diganti namanya secara lokal dengan as kata kunci. Sebagai contoh:

 import PyQt4.QtCore as Qc

Saya harap itu membantu


3
2017-09-01 05:09



Saya menggunakan "impor *" untuk modul PyQt yang saya gunakan, tetapi saya menempatkannya di modul mereka sendiri, sehingga tidak mencemari namespace pengguna. misalnya

Di qt4.py:

 dari PyQt4.QtCore impor *
 dari PyQt4.QtGui impor *

Lalu gunakan seperti ini

 impor qt4
 app = qt4.QApplication (...)

1
2018-02-25 16:06



impor untuk PyQt4 adalah kasus khusus.
kadang-kadang saya akan memilih "opsi pertama" untuk pengkodean cepat dan kotor, dan mengubahnya ke "opsi kedua" ketika kode tumbuh lebih lama dan lebih lama.
tabrakan namespace mungkin bukan masalah besar di sini, saya belum melihat nama paket lain dimulai dengan "Q" besar. dan kapan pun saya menyelesaikan skrip PyQt4. mengkonversi "dari PyQt4.QtGui impor *" ke sth. seperti "

from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
                         QVBoxLayout)

" hanya FYI, tanda kurung untuk impor multi-baris berguna di sini.


0
2017-09-02 07:07