Правильно импортирующие модули в Python

Реализация

System.Globalization.CultureInfo.CurrentCulture.Calendar.ToFourDigitYear 

-

public virtual int ToFourDigitYear(int year)
{
  if (year < 0)
    throw new ArgumentOutOfRangeException("year", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  if (year < 100)
    return (this.TwoDigitYearMax / 100 - (year > this.TwoDigitYearMax % 100 ? 1 : 0)) * 100 + year;
  else
    return year;
}

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

11
задан Peter Mortensen 5 February 2011 в 13:00
поделиться

4 ответа

«У меня есть приложение Python среднего размера с файлами модулей в различных подкаталогах.»

Хорошо. Обязательно убедитесь, что каждый каталог включает файл __ init __. Py , так что это пакет.

«Я создал модули, которые добавляют эти подкаталоги в sys.path »

Плохой. Используйте PYTHONPATH или установите всю структуру Lib / site-packages . Не обновляйте sys.path динамически. Это плохо. Трудно управлять и поддерживать.

"импортирует группу модулей, используя import thisModule as tm ."

Не имеет смысла. Возможно, у вас есть один import thisModule как tm для каждого модуля в вашей структуре. Это типичная стандартная практика: импортируйте только нужные модули, никаких других.

"Затем я импортирую этот модуль в другие с помощью from moduleImports import * "

Плохо. Не скрывайте импорт кучи случайных вещей.

Каждый модуль должен иметь длинный список конкретных вещей, которые ему нужны.

import this
import that
import package.module

Явный список. Никакой магии. Нет динамического изменения в sys.path .

В моем текущем проекте есть сотни модулей, около дюжины пакетов. Каждый модуль импортирует только то, что ему нужно. Никакой магии.

около дюжины пакетов. Каждый модуль импортирует только то, что ему нужно. Никакой магии.

около дюжины пакетов. Каждый модуль импортирует только то, что ему нужно. Никакой магии.

23
ответ дан 3 December 2019 в 01:53
поделиться

Несколько указателей

  1. Возможно, вы уже разбили функциональность в различных модулях. Если правильно сделал большую часть времени вы не попадет в круговой импорт проблемы (например, если модуль a зависит на b и b на a вы можете сделать третий модуль c для удаления такого циркуляра зависимость). В крайнем случае, в import b, но в b import a в точка, где требуется, например, внутри функция.

  2. Как только функциональные возможности модули группируют их в пакеты под подкаталог и добавьте файл __ init __. py к нему, чтобы вы могли импортировать пакет. Храните такие пакеты в папку, например lib, а затем либо добавить в sys.path или установите PYTHONPATH env переменная

  3. из импорта модуля * не может быть хорошей идеей. Вместо этого импортируйте все нужно. Это может быть полностью квалифицировано. Это не повредит быть многословным. например из pakageA.moduleB импорт CoolClass.

6
ответ дан 3 December 2019 в 01:53
поделиться

Способ сделать это - избегать магии. Другими словами, если вашему модулю требуется что-то от другого модуля, он должен импортировать это явно. Вы не должны полагаться на то, что что-то импортируется автоматически.

Как сказано в Zen of Python ( import this ), явное лучше, чем неявное.

4
ответ дан 3 December 2019 в 01:53
поделиться

Вы не получите рекурсию при импорте, потому что Python кэширует каждый модуль и не перезагружает тот, который у него уже есть.

3
ответ дан 3 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: