Part 7

Создание собственных модулей

Писать собственные модули Python легко. Любой файл, содержащий корректный код Python, можно импортировать как модуль. Предположим, у нас есть файл с именем words.py и таким содержимым:

def first_word(my_string: str):
    parts = my_string.split(" ")
    return parts[0]

def last_word(my_string: str):
    parts = my_string.split(" ")
    return parts[-1]

def number_of_words(my_string: str):
    parts = my_string.split(" ")
    return len(parts)

К функциям, определенным в файле, можно получить доступ, импортировав файл:

import words

my_string = "Sheila sells seashells by the seashore"

print(words.first_word(my_string))
print(words.last_word(my_string))
print(words.number_of_words(my_string))
Пример вывода

Sheila seashore 6

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

Мы можем использовать собственные модули так же, как уже научились использовать модули из стандартной библиотеки Python:

from words import first_word, last_word

sentence = input("Please type in a sentence: ")

print("The first word was: " + first_word(sentence))
print("The last word was: " + last_word(sentence))
Пример вывода

Please type in a sentence: Python is a swell programming language The first word was: Python The last word was: language

Использование подсказок типов

При использовании модулей подсказки типов становятся особенно полезными. Если вы используете редактор со встроенной поддержкой подсказок типов, работать с разными модулями становится намного проще.

Например, Visual Studio Code будет показывать подсказки типов, когда вы пишете код:

7 vihje

Код основной функции в модуле

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

Предположим, наш файл words.py также содержит несколько тестов:

def first_word(my_string: str):
    parts = my_string.split(" ")
    return parts[0]

def last_word(my_string: str):
    parts = my_string.split(" ")
    return parts[-1]

def number_of_words(my_string: str):
    parts = my_string.split(" ")
    return len(parts)

print(first_word("This is a test"))
print(last_word("Here we are still testing"))
print(number_of_words("One two three four five"))

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

import words

my_string = "Sheila sells seashells by the seashore"

print(words.first_word(my_string))
print(words.last_word(my_string))
print(words.number_of_words(my_string))
Пример вывода

This testing 5 Sheila seashore 6

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

К счастью, есть решение, и вы уже много раз использовали его в упражнениях этого курса. Нужно лишь проверить, выполняется ли программа сама по себе или ее код был импортирован инструкцией import. В Python есть встроенная переменная __name__, которая содержит имя выполняемой программы. Если программа выполняется сама по себе, значение переменной равно __main__. Если программа была импортирована, значение переменной равно имени импортированного модуля (в этом случае words).

Зная это, мы можем добавить условную инструкцию, которая позволит выполнять тесты только тогда, когда программа запущена сама по себе. Как видно ниже, структура выглядит знакомо:

def first_word(my_string: str) -> str:
    parts = my_string.split(" ")
    return parts[0]

def last_word(my_string: str) -> str:
    parts = my_string.split(" ")
    return parts[-1]

def number_of_words(my_string: str) -> int:
    parts = my_string.split(" ")
    return len(parts)

if __name__ == "__main__":
    # testing functionality
    print(first_word("This is a test"))
    print(last_word("Here we are still testing"))
    print(number_of_words("One two three four five"))

Если выполнить модуль сам по себе, тесты будут напечатаны:

Пример вывода

This testing 5

Когда модуль импортируется в другую программу, тесты не выполняются:

import words

my_string = "Sheila sells seashells by the seashore"

print(words.first_word(my_string))
print(words.last_word(my_string))
print(words.number_of_words(my_string))
Пример вывода

Sheila seashore 6

В упражнениях этого курса, когда вас просили писать функции, обычно ожидалось, что вы также обернете тесты в блок if __name__ == "__main__" точно как выше. Теперь вы знаете почему.

Loading

Ответьте, пожалуйста, на короткий опрос по материалам этой недели.

Вы дошли до конца этого раздела! Перейти к следующему разделу:

Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.