В этом конспекте , да и не только, будет встречаться словосочетание "через точку". Так часто говорят для краткости. Но для такой формы записи имён определений (module.name) существует и официальный термин: квалифицированное имя от слова "квалифицировать" ("qualify"). Соответственно, "импорт модуля целиком" официально называется квалифицированным импортом.

В Python все строчки с import принято располагать в самом начале кода модуля. Такой набор строчек называют "блок импортов", синтаксически этот блок никак не выделен — всего лишь обычные строчки одна за другой. Такая группировка нужна для удобства ра

Модули и импортирование

файл с кодом на Python называется модулем. Имя модуля соответствует имени файла, поэтому файлы в Python принято называть в стиле "snake_case". Одни модули могут использовать содержимое других, если импортируют эти другие модули с помощью инструкции import.

В Python импортировать модули можно несколькими способами:

  1. импортировать сам модуль
  2. импортировать отдельные определения из модуля
  3. импортировать всё содержимое модуля сразу

Импортирование модуля

Рассмотрим применение первого способа — импортирование модуля целиком.

Синтаксис импорта: import <имя_модуля (без суффикса ".py")>

После ключевого слова import указываем имя модуля (файла). Но при этом суффикс .py в имени надо опустить. К примеру, для модуля с именем my_module.py в инструкции импорта достаточно прописать my_module, а полный вид инструкции будет таким: import my_module.

В модуле (файле) с именем greeting.py определим функцию say_hi и переменную name:

# file: greeting.py
            def say_hi():
                print('Hi!')
            
            name = 'Bob'
            

А в модуле с именем main.py сделаем импорт содержимого модуля greeting.py:

# file: main.py
            import greeting  # заметьте, расширение ".py" не указывается!
            
            print(greeting.name)  # => Bob
            greeting.say_hi()     # => Hi!
            

Импортирование модуля в таком виде делает модуль доступным по имени — в данном случае это greeting. К содержимому же модуля идёт обращение, как говорят, "через точку". И конечно можно получить доступ к переменным (greeting.name), и вызывать функции модуля (greeting.say_hi).

Импортирование отдельных определений

Синтаксис импорта: from <имя_модуля (без суффикса ".py")> import <список определений>.

Если нужна пара функций или переменных, а имя модуля сложное и громозкое, то нам пригодиться следующий вариант использования инструкции import:

# file: main.py
            from greeting import say_hi, name
            
            print(name)  # используем переменную
            say_hi()     # вызываем функцию
            

Здесь после ключевого слова from указано имя модуля, а затем после ключевого слова import — имена определений из этого модуля, которые мы в дальнейшем будем использовать напрямую (а не "через точку").

Импорт всего содержимого модуля

Ранее мы познакомились с модулями и рассмотрели два из трёх вариантов импортирования — импорт самого модуля и импорт отдельных определений. Рассмотрим оставшийся вариант — импортирование всего содержимого модуля. Пример:

from some_module import *
                  from another_module import *
                  

Здесь из модулей some_module и another_module импортируются все определения неявно. Часто после такого импорта программисту становятся доступны десятки переменных, констант, функций и тому подобного. В этом-то и кроется проблема! Когда ниже по коду программист, читающий этот код, встречает некое имя, то ему бывает очень сложно понять, откуда это имя взялось — нельзя, просто взглянув на блок импортов, найти источник. Поиск по коду модуля тоже не помогает — все имена определений, импортированных данным способом, скрываются за *!

Большинство руководств по написанию хорошего кода на Python крайне не рекомендует использовать такой стиль импортирования. Однако в реальном коде такие импорты встречаются, поэтому мы не могли этот вариант не упомянуть.

Сочетание способов импортирования

Импортирование модуля целиком (т.е. квалифицированное) и импортирование отдельных определений могут сочетаться даже применительно к одному и тому же модулю!

Давайте рассмотрим пример.

В модуле computation.py определим функцию и переменные:

# file: computation.py
                  PI = 3.1415926
                  E = 2.7182818
                  
                  def pi_times(x):
                      return x + PI
                  

А в модуле main.py сделаем разными способами импорты из модуля computation.py:

# file: main.py
                  import computation
                  from computation import PI, E
                  from computation import pi_times
                  
                  print(PI)
                  print(computation.E)
                  print(pi_times(2))
                  print(computation.pi_times(E))
                  

Из кода видно, что: