Какой самый питонный способ импорта модулей в python

Может ли кто-нибудь предложить мне, какой самый пифонический способ импорта модулей в python? Позвольте мне объяснить - я прочитал много кода на Python и нашел несколько разных способов импорта модулей или, если быть более точным, - когда импортировать:

  • Используйте один модуль/несколько модулей, которые включают все импортные модули (сторонние модули), которые необходимы для всего проекта, поэтому весь импорт сконцентрирован в нескольких модулях, поэтому легко поддерживать импорт. Когда какой-либо отдельный модуль требует, чтобы какой-либо модуль был импортирован, он запрашивает для него модуль ссылок. Например, в нашем проекте мы разделили уровень с именем "ссылки", поэтому он содержит такие модули, как "system.py" (содержит ссылки на все системные библиотеки), "platform.py" (содержит ссылки на все библиотеки платформ), "devexpress.py '(содержит ссылки на все библиотеки devexpress) и так далее. Эти модули выглядят следующим образом:
  • Каждый модуль импортирует все необходимые классы и функции в верхней части модуля - например, есть раздел с импортом в каждом модуле проекта
  • Каждая функция/класс использует импорт локально, например, сразу после определения и импортирует только те вещи, которые им действительно нужны.

Пожалуйста, найдите образцы ниже.

1 модуль импорта образцов - только операторы "import" и "from... import..." (без каких-либо методов или классов):

#references.py
import re
import clr
import math

import System
import System.Text.RegularExpressions
import System.Random
import System.Threading
import System.DateTime

# System assemblies

clr.AddReference("System.Core")
clr.AddReference("System.Data")
clr.AddReference("System.Drawing")
...

#test.py
from references.syslibs import (Array, DataTable, OleDbConnection, OleDbDataAdapter,
                                 OleDbCommand, OleDbSchemaGuid)

def get_dict_from_data_table(dataTable):
    pass

2 с параметрами "import" и "from... import..." , а также методами и классами:

from ... import ...
from ... import ...

def Generate(param, param1 ...):
    pass

3 с операциями "import" и "from... import..." , которые используются внутри методов и классов:

import clr
clr.AddReference("assembly")       

from ... import ...
...

def generate_(txt, param1, param2):
  from ... import ...
  from ... import ...
  from ... import ...

  if not cond(param1): res = "text"
  if not cond(param2): name = "default"

Итак, каков самый пифонический способ импорта модулей в python?

Ответ 1

Это действительно не имеет значения, если вы не from ... import *. Остальное - все вкусы и проблемы циклического импорта. PEP 8 заявляет, что вы должны импортировать в верхней части script, но даже это не задано в камне.

Ответ 2

Люди уже прокомментировали основные проблемы стиля (вверху script и т.д.), поэтому я пропущу это.

Для моего импорта я обычно заказываю их в алфавитном порядке по имени модуля (независимо от того, импортируется ли он или из... import...). Я разбил его на группы: стандартные библиотеки lib, сторонние модули ( от pypi или другого), внутренние модули.

import os
import system

import twisted
import zope

import mymodule_1
import mymodule_2

Ответ 3

Python "import" загружает модуль Python в собственное пространство имен, поэтому вам нужно добавить имя модуля, за которым следует точка перед ссылками на любые имена из импортированного модуля

import animals
animals.Elephant()

"from" загружает модуль Python в текущее пространство имен, чтобы вы могли ссылаться на него без необходимости упоминания имени модуля снова

from animals import Elephant
Elephant()

или

from animals import *
Elephant()

используя это хорошо, (но использование импорта подстановочных знаков обескураживает). но если у вас большой проект с масштабированием, импорт из разных модулей может привести к ограничению имен. Подобно импорту Функция Elephant() из двух разных модулей вызовет проблему (например, с помощью импорта подстановочных знаков с *)

Итак, если у вас большой масштабный проект, в котором вы импортируете множество разных вещей из других модулей, лучше использовать импорт и использование импортированных вещей с помощью module_name.your_class_or_function. В противном случае используйте нотацию...

Ответ 4

Не используйте from module import *. Это будет загрязнять пространство имен и сильно осуждается. Однако вы можете импортировать определенные вещи, используя; from module import something. Это упрощает пространство имен. В больших проектах, если вы используете подстановочный знак, вы можете импортировать 2 foo или 2 бар в одно и то же пространство имен.

PEP 8 говорит о наличии импорта в отдельных строках. Например:

import os
import sys
import yourmodule
from yourmodule import specific_stuff

Одна вещь, которую я делаю, - это перевести свой импорт в две группы. Один из них - std/third party, а второй - внутренние модули.