2010-09-01 2 views
30

Я использую PyQt и сталкиваюсь с этой проблемой. Если мои операторы импорта:Следует избегать импорта подстановочных знаков?

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

затем pylint предоставляет сотни предупреждений «Неиспользованный импорт». Я не решаюсь просто отключить их, потому что могут быть другие неиспользуемые импорт, которые действительно полезны для просмотра. Другим вариантом было бы это сделать:

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

И я в конечном итоге имею 9 классов на линии QtGui. Там еще третий вариант, который:

from PyQt4 import QtCore, QtGui 

, а затем префикс все классы с QtCore или QtGui всякий раз, когда я использую их.

На данный момент я агностик в отношении того, какой из них я делаю в своем проекте, хотя последний кажется самым болезненным с моей точки зрения. Каковы общие практики здесь? Есть ли техническая причина использовать один стиль над другим?

+0

Я играл главную роль на этот вопрос, потому что я хочу, чтобы увидеть ответ, но я также любопытно, почему один будет сделай это. Обычно я только импортирую то, что мне нужно, и я знаю, что мне нужно, поэтому я только импортирую эти вещи. Может быть, я наивна, но мне кажется, что «боль» при наборе QtCore.something была бы лучше (autofill?), Чем тратить время процессора на импорт сотен неиспользуемых элементов. Я знаю, что это сделает меня взорванным в обзоре кода. Они спрашивают меня о каждом импортировании, который я использую. – xnine

+0

Я бы с вами согласился на профессиональный код, но для личных сценариев или проектов это не такая уж большая проблема. Тем более, что импорт, вероятно, произойдет прямо при запуске программы, поэтому он не должен влиять на производительность, просто время запуска. – Colin

+0

Связано: [Почему «импорт» «плохо?» (Https://stackoverflow.com/q/2386714/3357935) –

ответ

31

Ответ на названии вашего вопроса является «да»: Я не рекомендую никогда не используя from ... import *, и я обсуждал причины в другом очень недавнем ответе. Вкратце, квалифицированные имена - good, бармены очень ограничены, поэтому «третий вариант» является оптимальным (поскольку вы будете использовать квалифицированные имена, а не имена) среди присутствующих.

(Преимущества квалифицированных имен wrt barenames включают в себя простоту подделки/издевательств для целей тестирования, сводящуюся к аннулированному риску незаметных ошибок, вызванных случайным переуплотнением, возможность «полуфайла» верхнего имени в «классе трассировки» для цель регистрации того, что вы используете, и облегчения таких действий, как профилирование, и т. д. - недостатки, почти ничего ... см. также последний, но не наименее коан в Zen of Python, import this на интерактивный интерпретатор).

Столь же хорошо, если вы жалели 7 дополнительных символов, чтобы сказать QtCore.whatever, является сокращайте - from PyQt4 import QtCore as Cr и from PyQt4 import QtGi as Gu (используйте Cr.blah и Gu.zorp) или тому подобное. Как и все аббревиатуры, это сочетание стиля между лаконичностью и ясностью (вы бы назвали переменную count_of_all_widgets_in_the_inventory, num_widgets, или x? Часто средний выбор был бы лучшим, но не всегда ;-).

Кстати, я бы не использовать более одного as положение в одном from или import заявление (может сбивать с толку), я предпочел бы иметь несколько операторов (также проще отлаживать если импорт дает проблему, отредактировать, если вы измените свой импорт в будущем, ...).

+1

Спасибо, это много полезной информации. – Colin

+0

Еще одно преимущество квалифицированного - вы не можете импортировать все в огромную библиотеку, например PyQt, а затем случайно вызвать столкновение пространства имен с тем, что вы не знали. – user106514

+1

Возможно, есть опечатка, «импорт из этого» -> «import this» – sunqiang

3

Python doc говорит:

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.

Это может иметь побочные эффекты, и очень трудно отлаживать

Personnaly, я использую import, а не from import потому что я нахожу ужасные большие заявления в начале файл, и я думаю, что он сохраняет код более читаемым.

import PyQt4 

PyQt4.QtCore 

Если имя модуля слишком длинное и его можно переименовать локально с помощью ключевого слова as. Например:

import PyQt4.QtCore as Qc 

Я надеюсь, что это помогает

+0

Итак, если у вас был обработчик событий мыши, например, у вас может быть строка вроде этого: if event.buttons() & PyQt4.QtCore.Qt.LeftButton: "? Это не кажется читаемым, как «if event.buttons() & Qt.LeftButton:« – Colin

+3

Если он слишком длинный, я делаю: import PyQt4.QtCore.Qt в Qc, а затем Qc.LeftButton – luc

+0

Я имел в виду: импортировать PyQt4. QtCore.Qt как Qc – luc

6

Есть также хорошие чехлы для import *. то есть. это общая для разработчиков Django, чтобы иметь много конфигурационных файлов и приковать их с помощью импорта *:

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

test_settings.py: 
from settings import * 
DEBUG = True 

В этом случае большинство недостатков import * становятся преимуществом.

+0

Такие файлы - одноразовые чудеса, которые предназначены для импорта звездой. PyQt4.QtGui не подходит! C-; – Phlip

+4

@Phlip Согласен, но заголовок этого сообщения «Следует ли избегать импорта подстановочных знаков?» не «Следует избегать импорта подстановочных знаков ** в PyQt4 **?« –

+0

Я думаю, что этот ответ необходим для показа хороших сценариев, а не только для того, чтобы выбрать главный сценарий и сказать, что это плохо. Это как сказать« Должен ли я ездить на своем автомобиле по дороге », а кто-то говорит« да », а кто-то говорит« нет » если есть знаки «нет записи». – James

0

импорт для PyQt4 - это особый случай.
Иногда я выбираю «первый вариант» для быстрого и грязного кодирования и превращаю его в «второй вариант», когда код увеличивается дольше и дольше.
Пространство имен, возможно, не имеет большого значения здесь, я не вижу, чтобы другое имя пакета начиналось с большого «Q». и всякий раз, когда я заканчиваю скрипт PyQt4. конвертировать "из PyQt4.QtGui import *" в sth. как "

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

" просто FYI, parentheses for multi-line import удобно здесь.

1

Я использую «import *» для модулей PyQt, которые я использую, но я помещаю их в свой собственный модуль, поэтому он не загрязняет пространство имен пользователя. например

В qt4.py:

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

затем использовать его как этот

 
import qt4 
app = qt4.QApplication(...) 
+1

Разве это не эквивалентно «импортировать PyQt4.QtCore как qt4»? Думаю, вам понадобятся отдельные пространства имен для QtCore и QtGui, если вы это сделали, но это не похоже на такая плохая вещь. – Colin

+0

Это эквивалентно, если в qt4.py есть только один импорт. Я не нашел различия между QtCore, QtGui и т. д. ... очень полезно при программировании. – xioxox

+0

Это приятное решение, которое обойдет крут в верхней части исходных файлов. Модули Qt не конфликтуют друг с другом, поэтому это не представляет никаких проблем, насколько я могу судить. – mfitzp

Смежные вопросы