Импорт модулей

Импорт модуля

Используйте import заявление:

>>> import random
>>> print(random.randint(1, 10))
4

 

import module будет импортировать модуль , а затем позволяют ссылаться на свои объекты - ценности, функции и классы, например - с помощью module.name синтаксиса. В приведенном выше примере, то random образом модуль импортируется, который содержит randint функцию. Таким образом , за счет импорта random образом вы можете вызвать randint с random.randint .

Вы можете импортировать модуль и назначить ему другое имя:

>>> import random as rn
>>> print(rn.randint(1, 10))
4

 

Если ваш питон файл main.py находится в той же папке, custom.py.Вы можете импортировать это так:

import custom

 

Также возможно импортировать функцию из модуля:

>>> from math import sin
>>> sin(1)
0.8414709848078965

 

Чтобы импортировать определенные функции глубже в модуль, оператор точки может быть использован только на левой стороне import ключевого слова:

from urllib.request import urlopen


 

В python у нас есть два способа вызвать функцию с верхнего уровня. Одним из них является import и другое from.Мы должны использовать import , когда мы имеем возможность коллизии имен. Предположим , что мы имеем hello.py файл и world.py файлы , имеющие ту же самую функцию с именем function.Тогда import заявление будет хорошо работать.

from hello import function
from world import function

function() #world's function will be invoked. Not hello's  


 

В общем import предоставит вам пространство имен.

import hello
import world

hello.function() # exclusively hello's function will be invoked 
world.function() # exclusively world's function will be invoked

 

Но если вы достаточно уверены, в целом вашего проекта нет никакого способа , имеющий такое же имя функции следует использовать from заявлением

Многократный импорт может быть выполнен в одной строке:

>>> # Multiple modules
>>> import time, sockets, random
>>> # Multiple functions
>>> from math import sin, cos, tan
>>> # Multiple constants
>>> from math import pi, e

>>> print(pi)
3.141592653589793
>>> print(cos(45))
0.5253219888177297
>>> print(time.time())
1482807222.7240417

 

Ключевые слова и синтаксис, показанные выше, также могут использоваться в комбинациях:

>>> from urllib.request import urlopen as geturl, pathname2url as path2url, getproxies
>>> from math import factorial as fact, gamma, atan as arctan
>>> import random.randint, time, sys

>>> print(time.time())
1482807222.7240417
>>> print(arctan(60))
1.554131203080956
>>> filepath = "/dogs/jumping poodle (december).png"
>>> print(path2url(filepath))
/dogs/jumping%20poodle%20%28december%29.png 

Импорт определенных имен из модуля

Вместо импорта всего модуля вы можете импортировать только указанные имена:

from random import randint # Syntax "from MODULENAME import NAME1[, NAME2[, ...]]"
print(randint(1, 10))      # Out: 5
 

from random необходимо, так как интерпретатор питона должен знать , из какого ресурса он должен импортировать функции или класс и import randint определяет функцию или сам класс.

Еще один пример ниже (аналогичный приведенному выше):

from math import pi
print(pi)                  # Out: 3.14159265359

 

Следующий пример вызовет ошибку, потому что мы не импортировали модуль:

random.randrange(1, 10)    # works only if "import random" has been run before

Выходы:

NameError: name 'random' is not defined

 

Интерпретатор питона не понимает , что вы имеете в виду с random.Он должен быть объявлен добавлением import random к примеру:

import random
random.randrange(1, 10) 

Импорт всех имен из модуля

from module_name import *

 

например:

from math import *
sqrt(2)    # instead of math.sqrt(2)
ceil(2.7)  # instead of math.ceil(2.7)

 

Это будет импортировать все имена , определенные в math модуле в глобальное пространство имен, кроме имен , которые начинаются с символа подчеркивания (что свидетельствует о том , что писатель чувствует , что это только для внутреннего использования).

Внимание: Если функция с тем же именем уже определена или импортирована, он будет перезаписан. Почти всегда импортировать только конкретные имена from math import sqrt, ceil является рекомендуемым способом:

def sqrt(num):
    print("I don't know what's the square root of {}.".format(num))

sqrt(4)
# Output: I don't know what's the square root of 4.

from math import * 
sqrt(4)
# Output: 2.0

 

Помеченный импорт разрешен только на уровне модуля. Попытки выполнить их в определениях класса или функции приводит к SyntaxError .

def f():
    from math import *

 

а также

class A:
    from math import *

 

оба терпят неудачу с:

SyntaxError: import * only allowed at module level 

Специальная переменная __all__

Модули могут иметь специальную переменную __all__ , чтобы ограничить , какие переменные импортируются при использовании from mymodule import * .

Дан следующий модуль:

# mymodule.py

__all__ = ['imported_by_star']

imported_by_star = 42
not_imported_by_star = 21

 

Только imported_by_star импортируется при использовании from mymodule import * :

>>> from mymodule import *
>>> imported_by_star
42
>>> not_imported_by_star
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'not_imported_by_star' is not defined

 

Тем не менее, not_imported_by_star может быть импортирован в явном виде:

>>> from mymodule import not_imported_by_star
>>> not_imported_by_star
21 

Программный импорт

Чтобы импортировать модуль через вызов функции, используйте модуль importlib (включен в Python начиная с версии 2.7):

import importlib
random = importlib.import_module("random")

Функция importlib.import_module() также импортирует Подмодуль пакета напрямую:

collection_abc = importlib.import_module ("collection.abc")

Для более старых версий Python, используйте imp модуль.  Используйте функцию imp.find_module и imp.load_module выполнять программный импорт.

Взятые из стандартной документации библиотеки

import imp, sys
def import_module(name):
    fp, pathname, description = imp.find_module(name)
    try:
        return imp.load_module(name, fp, pathname, description)
    finally:
        if fp:
            fp.close()

 

Не используйте __import__() программно импортировать модули! Есть тонкие детали , связанные с sys.modules , в fromlist аргумент и т.д., которые легко упустить из виду , который importlib.import_module() ручки для вас.

Импорт модулей из произвольного расположения файловой системы

Если вы хотите импортировать модуль , который уже не существует , как встроенный модуль в стандартной библиотеке Python , ни в качестве побочного пакета, вы можете сделать это, добавив путь к директории , где ваш модуль найден в sys.path.Это может быть полезно, когда на хосте существует несколько сред Python.

import sys
sys.path.append("/path/to/directory/containing/your/module")
import mymodule

 

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

Правила PEP8 для импорта

Некоторые рекомендуемые PEP8 принципы стиля для импорта:

Импорт должен быть в отдельных строках:

from math import sqrt, ceil      # Not recommended
from math import sqrt            # Recommended
from math import ceil 

Порядок импорта в верхней части модуля выглядит следующим образом:

  • Импорт стандартной библиотеки
  • Связанный импорт третьей стороны
  • Локальный импорт приложений / библиотек
  1. Следует избегать импорта подстановочных знаков, поскольку это приводит к путанице в именах в текущем пространстве имен. Если вы from module import * , он может быть нечетким , если конкретное имя в коде происходит от module или нет. Это вдвойне верно , если у вас есть несколько from module import * отчетности -типа.
  2. Избегайте использования относительного импорта; вместо этого используйте явный импорт.

Импорт подмодулей

from module.submodule import function

 

Это импортирует function из module.submodule .

__import __ () функция

__import__() функция может быть использована для импорта модулей , где имя известно лишь во время выполнения

if user_input == "os":
    os = __import__("os")

# equivalent to import os

 

Эту функцию также можно использовать для указания пути к файлу модуля

mod = __import__(r"C:/path/to/file/anywhere/on/computer/module.py")

Повторный импорт модуля

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

Обратите внимание , что вы не можете просто import модуль еще раз , чтобы вернуться:

import math
math.pi = 3
print(math.pi)    # 3
import math
print(math.pi)    # 3

 

Это потому, что интерпретатор регистрирует каждый импортируемый вами модуль. И когда вы пытаетесь повторно импортировать модуль, интерпретатор видит его в реестре и ничего не делает. Так трудный путь реимпортировать является использование import после удаления соответствующего пункта из реестра:

print(math.pi)    # 3
import sys
if 'math' in sys.modules:  # Is the ``math`` module in the register?
    del sys.modules['math']  # If so, remove it.
import math
print(math.pi)    # 3.141592653589793