Импорт модуля
Используйте 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
Порядок импорта в верхней части модуля выглядит следующим образом:
- Импорт стандартной библиотеки
- Связанный импорт третьей стороны
- Локальный импорт приложений / библиотек
- Следует избегать импорта подстановочных знаков, поскольку это приводит к путанице в именах в текущем пространстве имен. Если вы
from module import *
, он может быть нечетким , если конкретное имя в коде происходит отmodule
или нет. Это вдвойне верно , если у вас есть несколькоfrom module import *
отчетности -типа. - Избегайте использования относительного импорта; вместо этого используйте явный импорт.
Импорт подмодулей
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