Шаг 128.
Основы языка Python.
Модули и пакеты. Инструкция from

    На этом шаге мы рассмотрим назначение и использование этой инструкции.

    Для импортирования только определенных идентификаторов из модуля можно воспользоваться инструкцией from. Ее формат таков:

  from <Название модуля> import  <Идентификатор 1> [as <Псевдоним 1>]
                      [, ...,] <Идентификатор N> [as  <Псевдоним N>] ]
  from <Название модуля> import (<Идентификатор 1> [as <Псевдоним 1>]
                      [, ...,  <Идентификатор N> [as <Псевдоним N>]] )
  from <Название модуля> import *

    Первые два варианта позволяют импортировать модуль и сделать доступными только указанные идентификаторы. Для длинных имен можно назначить псевдонимы, указав их после ключевого слова as. В качестве примера сделаем доступными константу pi и функцию floor () из модуля math, а для названия функции создадим псевдоним:

# -*- coding: utf-8  -*-
from math import pi, floor as f
print(pi) # Вывод числа pi
# Вызываем функцию floor() через идентификатор f
print(f(5.49)) # Выведет: 5
input()
Архив с файлом можно взять здесь.

    Результат:

3.141592653589793
5

    Идентификаторы можно разместить на нескольких строках, указав их названия через запятую внутри круглых скобок: ,

  from math  import (pi, floor,
                        sin, cos)

    Третий вариант формата инструкции from позволяет импортировать из модуля все идентификаторы. Для примера импортируем все идентификаторы из модуля math.

# -*- coding: utf-8  -*-
from math import * # Импортируем все идентификаторы из модуля math
print(pi) # Вывод числа pi
print(floor(5.49)) # Выведет: 5
input()
Архив с файлом можно взять здесь.

    Результат:

3.141592653589793
5

    Следует заметить, что идентификаторы, названия которых начинаются с символа подчеркивания, импортированы не будут. Кроме того, необходимо учитывать, что импортирование всех идентификаторов из модуля может нарушить пространство имен главной программы, т. к. идентификаторы, имеющие одинаковые имена, будут перезаписаны. Создадим два модуля и подключим их с помощью инструкций from и import. Содержимое файла module1.py приведено ниже:

# Содержимое файла module1.py
# -*- coding: utf-8 -*-
s = "Значение из модуля module1"

    Содержимое файла module2.py:

# Содержимое файла module2.py
# -*- coding: utf-8 -*-
s = "Значение из модуля module2"

    Исходный код основной программы:

# Исходный код основной программы
# -*- coding: utf-8  -*-
from module1 import *
from module2 import *
import module1, module2
print(s) # Выведет: "Значение из модуля module2"
print(module1.s) # Выведет: "Значение из модуля modulel"
print(module2.s) # Выведет: "Значение из модуля module2"
input()
Архив с файлами можно взять здесь.

    Результат:

Значение из модуля module2
Значение из модуля module1
Значение из модуля module2

    Итак, в обоих модулях определена переменная с именем s. Размещаем все файлы в одной папке, а затем запускаем основную программу с помощью двойного щелчка на значке файла. При импортировании всех идентификаторов значением переменной s будет значение из модуля, который был импортирован последним, - в нашем случае это значение из модуля module2.py. Получить доступ к обеим переменным можно только при использовании инструкции import. Благодаря точечной нотации пространство имен не нарушается.

    В атрибуте __all__ можно указать список идентификаторов, которые будут импортировать ся с помощью выражения from module import *. Идентификаторы внутри списка указываются в виде строки. Создадим файл module3.py:

# Содержимое файла module3.py
# Использование атрибута __all__
# -*- coding: utf-8  -*-
x, y, z, _s = 10, 80, 22, "Строка"
__all__ = ["x", "_s"]

    Затем подключим его к основной программе:

# Исходный код основной программы
# -*- coding: utf-8  -*-
from module3 import *
print(sorted(vars().keys())) # Получаем список всех идентификаторов
input()
Архив с файлами можно взять здесь.

    После запуска основной программы (с помощью двойного щелчка на значке файла) получим следующий результат:

['__builtins__', '__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__', '_s', 'x']

    Как видно из примера, были импортированы только переменные _s и x. Если бы мы не указали идентификаторы внутри списка __all__, то результат был бы другим:

['__builtins__', '__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__', 'x', 'y', 'z']

    Обратите внимание на то, что переменная _s в этом случае не импортируется, т. к. ее имя начинается с символа подчеркивания.

    На следующем шаге мы рассмотрим пути поиска модулей.




Предыдущий шаг Содержание Следующий шаг