Следует ли избегать импорта подстановочных знаков? - PullRequest
44 голосов
/ 01 сентября 2010

Я использую 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 всякий раз, когда я их использую.

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

Ответы [ 6 ]

45 голосов
/ 01 сентября 2010

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

(Преимущества квалифицированных имен по сравнению с простыми именами включают простоту фальсификации / насмешки в целях тестирования, снижение до нуля риска незаметных ошибок, вызванных случайным повторным связыванием, возможность «подделать» верхнее имя в «классе трассировки» для цель регистрации именно того, что вы используете, и упрощение таких действий, как профилирование и т. д. - недостатки, почти ничего ... см. также последний, но не менее важный коан в 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 (это может сбивать с толку), я бы предпочел иметь несколько операторов (также легче отлаживать, если какой-либо импорт дает проблема, чтобы изменить, если вы измените свой импорт в будущем, ...).

11 голосов
/ 01 сентября 2010

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

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

test_settings.py:
from settings import *
DEBUG = True

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

3 голосов
/ 01 сентября 2010

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

Надеюсь, это поможет

1 голос
/ 25 февраля 2013

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

В qt4.py:

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

Затем используйте его следующим образом

 import qt4
 app = qt4.QApplication(...)
0 голосов
/ 28 июня 2019

Я тоже абсолютно против import * в общем случае. В случае PySide2 применяется одно из редких исключений:

from PySide2 import *

- это шаблон для импорта всех известных модулей из PySide2. это Импорт очень удобен, потому что импорт всегда корректен. Константа вычисляется из генератора CMAKE. Очень полезно когда быстро что-то пробует в интерактивной консоли, но и в автоматическом тестировании.

Для расширенного использования имеет смысл также использовать переменную PySide2.__all__ напрямую, которая реализует это особенность. Элементы PySide2.__all__ упорядочены по зависимости, поэтому сначала идет QtCore, затем QtGui, QtWidgets, ... и т. д.

0 голосов
/ 02 сентября 2010

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

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

» просто к сведению, скобки для многострочного импорта здесь удобно.

...