Подробное объяснение модулей Python

Python Командная строка Язык программирования модульный тест

Эта статья была впервые опубликована вЗнай почти

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

  • Концептуальная записка
  • Простой вызов модуля
  • импорт пакета
  • особый__init__.pyдокумент
  • Путь поиска импортированных модулей
  • __all__
  • Абсолютные и относительные ссылки
  • сущность запуска импорта
  • if __name__ == '__main__'

Концептуальная записка

Здесь, чтобы прояснить концептуальные различия между модулями, библиотеками и пакетами в python.

  • Модуль на самом деле представляет собой py-файл, который определяет некоторые функции, классы, переменные и т. д.
  • Пакет — это папка, образованная совокупностью нескольких модулей, которая может содержать несколько py-файлов или вложенных папок.
  • Библиотеки относятся к другим языкам программирования и относятся к набору кодов, выполняющих определенные функции.В python это модули и пакеты.

Простой вызов модуля

Например, у нас естьtrymoduleпапка, содержащаяfirst.pyфайл, содержимое файла следующее

a = 1
def myfun(s):
print(s + 1)

существуетtrymoduleОткройте окно командной строки в папкеpythonВойдите в интерактивный режим командной строки

>>> import first
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> first.a
1
>>> first.myfun(2)
3

Итак, файл first.py — это модуль, который можно использовать сimportИмпорт, переменные в нем должны быть использованыfirst.префикс для ссылки, если вы не хотите использовать этот префикс, вы можете сделать это

>>> from first import a
>>> a
1

Другие варианты использования следующие

# 重命名
>>> from first import myfun as addone
>>> addone(4)
5
# 导入模块中全部变量
>>> from first import *
>>> myfun(2)
3
# 一次导入多个变量
>>> from first import a, myfun
>>> a
1

импорт пакета

Создайте новый в папке trymodulefolder1папка, мы хотимfolder1Папка становится пакетом. новая папкаabcd.pyфайл, содержимое файла следующее

b = 2
class Myclass:
def __init__(self, name, age):
self.name = name
self.age = age
def get_info(self):
print('my name is {name} and age is {age}'.format(name = self.name, age = self.age))

в это время вfolder1создать новую папку__init__.pyфайл, иначе программа будет рассматривать эту папку как обычную папку, а не как пакет. это__init__.pyВ файле ничего нельзя заполнить.

Структура файла следующая

trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py

мы по-прежнемуtrymoduleОткройте командную строку в папке и войдите в интерактивный режим Python.

Давайте рассмотрим следующие методы импорта

>>> import folder1
>>> folder1.abcd.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'folder1' has no attribute 'abcd'
>>> from folder1 import abcd
>>> bob = abcd.Myclass(name = 'Bob', age = 20)
>>> bob.name
'Bob'
>>> bob.get_info()
my name is Bob and age is 20
>>> from folder1.abcd import b
>>> b
2
>>> import folder1.abcd
>>> abcd.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'abcd' is not defined
>>> folder1.abcd.b
2
>>> import folder1.abcd as aa
>>> aa.b
2

Уведомление:

  • Просто пакет импорта не может случайно использовать находящиеся в нем модули, и его нужно импортировать на уровень конкретных модулей или переменных.
  • Доступно между папками и файлами.также можно использоватьfrom importформате, а файл и переменные в нем можно использовать толькоfrom importформат, т.е. не можетimport folder1.abcd.b

особый__init__.pyдокумент

__init__.pyФайл на самом деле является специальным файлом, который эквивалентен модулю с именем папки1, то есть, если вы используетеimport folder1тогда можешь позвонить__init__.pyПеременные, определенные в файле file.

Буду__init__.pyФайл пишется так

from folder1.abcd import b
c = 3

Откройте командную строку в папке trymodule и войдите в интерактивный режим Python.

>>> import folder1
>>> folder1.c
3
>>> folder1.b
2
>>> from folder1 import b
>>> b
2

Ранееfrom folder1.abcd import b,использовать__init__.pyФайл может импортировать некоторые часто используемые переменные для облегчения вызова.

Еще две вещи, на которые следует обратить внимание

  • __init__.pyКогда файл будет записан, если вы хотите импортировать переменные в другие модули, даже если__init__.pyдокументы иabcd.pyфайлы находятся в одной папке и не могутfrom abcd import b, начал писать бумажки приходят с abcd, начинается с названия пакета.
  • Не нужно создавать заново созданную вложенную папку в папке Folder1__init__.pyФайл можно назвать как модуль, но обычно необходимо создать новый файл, чтобы легко импортировать общие переменные.

Путь поиска импортированных модулей

использоватьimport hello, python будет искатьhello.pyфайлы, порядок поиска следующий

  • Первый поиск встроенных модулейhello(Поэтому определяемое нами имя модуля не должно совпадать со встроенным модулем)
  • Если встроенного модуля нет, посмотрите, есть ли они в следующих каталогах
>>> import sys
>>> sys.path
['', 'C:\\Program Files\\Anaconda3\\python35.zip', 'C:\\Program Files\\Anaconda3\\DLLs', 'C:\\Program Files\\Anaconda3\\lib', 'C:\\Program Files\\Anaconda3', 'C:\\Program Files\\Anaconda3\\lib\\site-packages', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\Sphinx-1.4.6-py3.5.egg', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\snownlp-0.12.3-py3.5.egg', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.5.egg']

первый из которых''Указывает текущий рабочий путь, мы можем видеть путь, где находится установленный сторонний пакет ('C:\\Program Files\\Anaconda3\\lib\\site-packages') тоже есть в этом списке, так что где бы ни был рабочий путь, эти пакеты будут найдены.

Если вы хотите добавить путь поиска, вы можете обратиться кэта статья

__all__

Прежде всего, понятно,import *нельзя импортировать имена переменных, начинающиеся с подчеркивания

__init__.pyСодержимое файла изменяется следующим образом

from folder1.abcd import b
c = 3
_e = 4

В интерактивном режиме Python

>>> from folder1 import *
>>> c
3
>>> _e
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_e' is not defined

И если указанный импорт в порядке

>>> from folder1 import c
>>> c
3
>>> from folder1 import _e
>>> _e
4

если определено__all__,ноimport *Вы можете импортировать переменную, начиная с подчеркнутого

__init__.pyСодержимое файла изменяется следующим образом

from folder1.abcd import b
__all__ = ['c', '_e']
c = b + 1
_e = 4

В интерактивном режиме Python

>>> from folder1 import *
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> c
3
>>> _e
4

видимыйimport *будет только импортировать__all__Переменная, указанная в , независимо от того, начинается ли она с символа подчеркивания. Это ограничение предотвращаетimport *Команда импортирует слишком много переменных, чтобы загрязнить пространство имен, отфильтруйте некоторые промежуточные переменные, такие какb

Абсолютные и относительные ссылки

в питонеimportСуществует два типа: абсолютная ссылка и относительная ссылка. Разница между ними заключается в том, как расположен ссылочный модуль при ссылке на модуль.

  • Абсолютная ссылка заключается в явном указании файла (папки) самого высокого уровня и использовании.Подключитесь, а затем перейдите к модулю, на который нужно сослаться. Все наши варианты использования выше являются абсолютными ссылками.
  • Относительная ссылка предназначена для указания относительного положения модуля, на который нужно сослаться, и текущего файла,.Указывает родительский файл

В этой файловой структуре

trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py

записывать__init__.pyфайл, на который следует ссылатьсяabcd.pyпеременная в файле

  • абсолютные ссылкиfrom folder1.abcd import b
  • Относительные ссылкиfrom .abcd import b

В относительных ссылках.ссылается на родительский файл (который также имеетfrom . import xxxПрименение),.xxxотносится к тому же слою файлов,..xxxнаходится на том же уровне, что и родительская папкаxxxфайл (еще один.Указывает на еще один слой вверх)

Какой из них вы обычно используете?

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

сущность запуска импорта

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

(1) При выполнении команды импорта модуля она сначала проверяет, входит ли импортируемый модуль в число существующих модулей, и если да, то пропускает его.import. Поэтому модули, ссылающиеся друг на друга, не вызовут бесконечных циклов.

Используйте следующий метод для просмотра текущих импортированных модулей

import sys
sys.modules

Результат — словарь, ключ — имя модуля, а значение — путь, по которому находится файл

(2)importЗаявление и выполнение файла

В этой файловой структуре

trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py

folder1 — это пакет, abcd — это модуль

  • import folder1Просто импортируйте пакет, что эквивалентно выполнению__init__.pyдокумент
  • from folder import abcdзатем казнен__init__.pyфайл файл сabcd.pyдокумент
  • from folder1.abcd import bФактически реализовано__init__.pyфайл файл сabcd.pyдокумент

(Чтобы знать, что выполняется, вы можете добавить в эти файлыprintоператор, чтобы увидеть, напечатан ли результат)

Зная этот принцип реализации, можно лучше понять некоторые выводы, полученные ранее.

  • первый в__init__.pyКогда в файле ничего нет,import folder1нельзя назватьabcdпеременные в модуле, потому что это эквивалентно запуску пустого файла без импорта всего пакета в рабочую область
  • abcdопределено в модулеprintПосле заявления,importДважды, только в первый раз будетprintЕсли значение отсутствует, это означает, что вторая проверка того, что модуль был импортирован, игнорирует этоimportЗаказ

Для получения более подробной информации см.эта статья

if __name__ == '__main__'

Мы часто находим в чужом кодеif __name__ == '__main__', чтобы понять, что он делает, давайте посмотрим на следующий пример

Создайте новый файл new.py в папке folder1 с содержимым

print(__name__)

Откройте командную строку в папке folder1 и введите

python new.py

Возвращаемый результат__main__

Откройте командную строку в папке trymodule и войдите в интерактивный режим Python.

>>> from folder1 import new
folder1.new
>>> print(__name__)
__main__
>>> print(new.__name__)
folder1.new

Приведенные выше результаты теста показывают, что запуск файла напрямую иimportФайлы разные, разница заключается в двух__name__Переменные бывают разные.__name__Переменная — это специальная переменная, которая соответствует единице при запуске каждого файла py.__name__переменная, значение этой переменной можно просмотреть даже в интерактивном режиме.

такif __name__ == '__main__'Легко понять рольimportСледующий код не выполняется при непосредственном выполнении файла, а следующий код выполняется только при непосредственном выполнении файла. Это обычный способ записи, если вы не боитесь, что файл будетimport, можно обойтись и без этого.

Добро пожаловать, чтобы обратить внимание на мою колонку знаний

Домашняя коробка:программирование на питоне

Каталог столбцов:содержание

Примечания к выпуску:Примечания к выпуску программного обеспечения и пакетов

Категории