Python: есть ли недостаток импорта из пакета *, кроме коллизии пространства имен - PullRequest
2 голосов
/ 30 ноября 2010

Я создаю класс для расширения пакета, и до создания экземпляра класса я не знаю, какое подмножество пространства имен пакета мне нужно.Я старался избегать конфликтов пространства имен в моем коде, поэтому создает ли

from package import * 

проблемы помимо конфликтов имен?

Лучше ли изучить входные данные класса и импортировать только нужные мне имена (во время выполнения) в __init__ ??

Может ли Python импортировать из набора []?

имеет ли

for name in [namespace,namespace]:
    from package import name

какой-либо смысл?

Надеюсь, этот вопрос не кажется ненужным ручным звонком, я просто новичок в Python и не хочусделать одну вещь , которую каждое «руководство для начинающих» говорит «не делать» (из pkg import *), если я не уверен, что альтернативы нет.

мысли, советы приветствуются.

Ответы [ 4 ]

6 голосов
/ 30 ноября 2010

По порядку:

  • Это не создает других проблем - однако конфликты имен могут быть гораздо большей проблемой, чем вы ожидаете.

  • Определенно отложите ваш импорт, если можете.Несмотря на то, что область видимости переменных в Python упрощена, вы также получаете преимущество в том, что вам не нужно импортировать модуль, если никогда не вызывается нужная ему функциональность.

  • Я не знаю, что вы имеете в виду,Квадратные скобки используются для составления списков, а не наборов.Вы можете импортировать несколько имен из модуля в одну строку - просто используйте разделенный запятыми список:

    from awesome_module import spam, ham, eggs, baked_beans
    # awesome_module defines lots of other names, but they aren't pulled in.
    
  • Нет, это не будет делать то, что вы хотите - name isидентификатор и, как таковой, каждый раз в цикле код будет пытаться импортировать имя name, а не имя, соответствующее строке, указанной в переменной name.

Однако вы можете получить такой эффект "динамического импорта", используя функцию __import__.Обратитесь к документации для получения дополнительной информации и убедитесь, что у вас есть реальная причина для ее использования в первую очередь.Мы довольно быстро разбираемся в этом языке, и обычно это не так необходимо, как кажется на первый взгляд.Не становись слишком умным.Мы ненавидим их хитрых хоббитов.

2 голосов
/ 30 ноября 2010

При импорте * вы получаете все, что находится в модуле, прямо в ваше пространство имен.Это не всегда хорошо, так как вы могли бы перезаписать что-то вроде:

from time import *
sleep = None

Это сделало бы функцию time.sleep бесполезной ...

Другой способ получения функций, переменныхи классы из модуля говорили бы:

from time import sleep

Это более хороший способ, но часто лучший способ - просто импортировать модуль и ссылаться на модуль напрямую, как

import time
time.sleep(3)
0 голосов
/ 30 ноября 2010

Синтаксические конструкции помогают избежать столкновения имен:

from package import somename as another_name
import package as another_package_name
0 голосов
/ 30 ноября 2010

вы можете импортировать как from PIL import Image, ImageDraw

то, что импортируется from x import *, ограничено списком __all__ в x, если оно существует

импорт во время выполнения, если имя модуля не известно или не исправлено в коде, должен выполняться с помощью __import__, но вам не нужно это делать

...