Какой самый питонный способ импортировать модули в Python? - PullRequest
11 голосов
/ 16 июня 2011

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

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

Примеры ниже.

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 ... ', а также методы и классы:

*Модуль 1017 *

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"

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

Ответы [ 4 ]

14 голосов
/ 16 июня 2011

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

5 голосов
/ 16 июня 2011

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

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

import os
import system

import twisted
import zope

import mymodule_1
import mymodule_2
3 голосов
/ 16 июня 2011

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

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

import os
import sys
import yourmodule
from yourmodule import specific_stuff

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

3 голосов
/ 16 июня 2011

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

import animals
animals.Elephant()

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

from animals import Elephant
Elephant()

или

from animals import *
Elephant()

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

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

...