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

Введение

Примеры

  • 14

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

    Используйте 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 
  • 3

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

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

     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) 
  • 5

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

     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 
  • 22

    Специальная переменная __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 
  • 4

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

    Чтобы импортировать модуль через вызов функции, используйте модуль `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() ручки для вас.

  • 6

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

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

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

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

  • 4

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

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

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

        from math import sqrt, ceil      # Not recommended
       from math import sqrt            # Recommended
       from math import ceil 
    1. Порядок импорта в верхней части модуля выглядит следующим образом:

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

    3. Избегайте использования относительного импорта; вместо этого используйте явный импорт.

  • 1

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

     from module.submodule import function
    
     

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

  • 1

    __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") 
  • 1

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

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

    Обратите внимание , что вы не можете просто 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
    
     

    Но есть более простой и простой способ.

    Python 2


    Использование reload функции:

    импорт math math.pi = 3 печать (math.pi) # 3 перезагрузка (математика) печать (math.pi) # 3.141592653589793

    Python 3


    reload функция перешла к importlib :

    import math math.pi = 3 print (math.pi) # 3 из importlib import reload перезагрузить (math) печать (math.pi) # 3.141592653589793

Синтаксис

Параметры

Примечания