Почему «импорт *» плох? - PullRequest
127 голосов
/ 05 марта 2010

Рекомендуется не использовать import * в Python.

Может кто-нибудь поделиться, пожалуйста, причиной этого, чтобы я мог избежать этого в следующий раз?

Ответы [ 12 ]

3 голосов
/ 10 ноября 2016

Это очень ПЛОХАЯ практика по двум причинам:

  1. Читаемость кода
  2. Риск переопределения переменных / функций и т. Д.

Для точка 1 : Давайте рассмотрим пример этого:

from module1 import *
from module2 import *
from module3 import *

a = b + c - d

Здесь, увидев код, никто не получит представление о том, из какого модуля bc и d на самом деле принадлежит.

С другой стороны, если вы сделаете это следующим образом:

#                   v  v  will know that these are from module1
from module1 import b, c   # way 1
import module2             # way 2

a = b + c - module2.d
#            ^ will know it is from module2

Это намного чище для вас, и у нового человека, присоединившегося к вашей команде, будет лучшая идея.

Для точка 2 : допустим, переменные module1 и module2 имеют значение b.Когда я делаю:

from module1 import *
from module2 import *

print b  # will print the value from module2

Здесь значение из module1 теряется.Будет трудно отладить, почему код не работает, даже если b объявлен в module1, и я написал код, ожидающий, что мой код будет использовать module1.b

Если у вас одинаковые переменные в разныхмодули, и вы не хотите импортировать весь модуль, вы можете даже сделать:

from module1 import b as mod1b
from module2 import b as mod2b
2 голосов
/ 25 января 2019

Как указано в документации, вы никогда не должны использовать import * в рабочем коде.

Хотя импорт * из модуля плох, импорт * из пакета еще хуже. По сути, from package import * импортирует любые имена, определенные в __init__.py пакета, но также включает в себя любые подмодули пакета, которые были загружены предыдущими операторами import.

Рассмотрим этот пример:

# anywhere in the code before import *
import sound.effects.echo
import sound.effects.surround

# in your module
from sound.effects import *

Последний оператор импортирует модули echo и surround в текущее пространство имен (возможно, переопределяя предыдущие определения), потому что они определены в пакете sound.effects при выполнении оператора import.

...