Создание собственных модулей
Писать собственные модули 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 будет показывать подсказки типов, когда вы пишете код:
Код основной функции в модуле
Если модуль содержит код, который не находится внутри определения функции (то есть если модуль содержит код в основной функции модуля), этот код автоматически выполняется каждый раз, когда модуль импортируется.
Предположим, наш файл 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__" точно как выше. Теперь вы знаете почему.
Ответьте, пожалуйста, на короткий опрос по материалам этой недели.
Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.