Введение
В этом лабораторном занятии (LabEx) вы научитесь проверять, принимает ли функция Python определенные аргументы, исследуя сигнатуры функций. В лабораторной работе используется модуль inspect для доступа к сигнатурам функций и их анализа, что позволяет получить ценную информацию о ожидаемых аргументах и возвращаемых значениях функции.
В рамках лабораторной работы вы создадите Python-скрипт с примером функции, а затем используете функцию inspect.signature() для получения и вывода сигнатуры функции. Вы также научитесь интерпретировать вывод, чтобы понять параметры функции и тип возвращаемого значения. Наконец, в лабораторной работе будет показано, как тестировать передачу аргументов с использованием блоков try-except.
Изучите сигнатуры функций
На этом этапе вы узнаете о сигнатурах функций в Python. Сигнатуры функций предоставляют ценную информацию о ожидаемых аргументах и возвращаемых значениях функции. Понимание сигнатур функций является важным аспектом при написании чистого, поддерживаемого и безошибочного кода.
Сигнатура функции включает в себя следующую информацию:
- Имя функции: Название функции.
- Параметры: Имена и типы аргументов, которые функция принимает.
- Тип возвращаемого значения: Тип значения, которое функция возвращает (если таковое имеется).
Python предоставляет несколько способов доступа к сигнатурам функций и их анализа. Одним из наиболее распространенных и мощных методов является использование модуля inspect. Давайте рассмотрим, как использовать модуль inspect для изучения сигнатур функций.
Сначала создадим простой Python-скрипт с именем my_function.py в каталоге ~/project с помощью редактора VS Code. В этом скрипте будет определена функция, а затем с использованием модуля inspect будет проанализирована ее сигнатура.
## filename: ~/project/my_function.py
import inspect
def add_numbers(x: int, y: int) -> int:
"""This function adds two numbers and returns the result."""
return x + y
sig = inspect.signature(add_numbers)
print(sig)
В этом скрипте:
- Мы импортируем модуль
inspect. - Мы определяем функцию с именем
add_numbers, которая принимает два целочисленных аргумента (xиy) и возвращает их сумму в виде целого числа. - Мы используем подсказки типов (
x: int,y: int,-> int), чтобы указать ожидаемые типы аргументов и возвращаемого значения. - Мы используем функцию
inspect.signature(), чтобы получить сигнатуру функцииadd_numbersи сохранить ее в переменнойsig. - Мы выводим сигнатуру в консоль.
Теперь запустим скрипт с помощью команды python:
python ~/project/my_function.py
Вы должны увидеть следующий вывод:
(x: int, y: int) -> int
Этот вывод представляет сигнатуру функции add_numbers. Он показывает, что функция принимает два параметра, x и y, оба из которых должны быть целыми числами, и что функция возвращает целое число.
Понимание сигнатур функций помогает правильно использовать функции и избегать распространенных ошибок. В следующих шагах вы узнаете больше о том, как использовать модуль inspect для извлечения подробной информации из сигнатур функций.
Используйте inspect.signature()
На предыдущем этапе вы узнали, как получить сигнатуру функции с помощью функции inspect.signature(). На этом этапе вы углубитесь в то, как использовать объект сигнатуры для извлечения более подробной информации о параметрах функции.
Функция inspect.signature() возвращает объект Signature, который имеет несколько полезных атрибутов и методов для анализа параметров функции. Давайте модифицируем скрипт my_function.py, чтобы исследовать эти возможности.
Откройте файл my_function.py в каталоге ~/project с помощью редактора VS Code и измените его следующим образом:
## filename: ~/project/my_function.py
import inspect
def add_numbers(x: int, y: int = 10) -> int:
"""This function adds two numbers and returns the result."""
return x + y
sig = inspect.signature(add_numbers)
for param in sig.parameters.values():
print(f"Parameter Name: {param.name}")
print(f"Parameter Default: {param.default}")
print(f"Parameter Annotation: {param.annotation}")
print(f"Parameter Kind: {param.kind}")
print("-" * 20)
В этом модифицированном скрипте:
- Мы добавили значение по умолчанию
10для параметраy(y: int = 10). - Мы проходим по атрибуту
parametersобъектаSignature, который представляет собой упорядоченный словарь объектовParameter. - Для каждого объекта
Parameterмы выводим его атрибутыname,default,annotationиkind.
Теперь запустите скрипт с помощью команды python:
python ~/project/my_function.py
Вы должны увидеть следующий вывод:
Parameter Name: x
Parameter Default: <class 'inspect._empty'>
Parameter Annotation: <class 'int'>
Parameter Kind: POSITIONAL_OR_KEYWORD
--------------------
Parameter Name: y
Parameter Default: 10
Parameter Annotation: <class 'int'>
Parameter Kind: POSITIONAL_OR_KEYWORD
--------------------
Разберем вывод:
- Parameter Name: Имя параметра (
xиy). - Parameter Default: Значение по умолчанию параметра. Если у параметра нет значения по умолчанию, то здесь будет
inspect._empty. - Parameter Annotation: Тип аннотации параметра (например,
<class 'int'>). - Parameter Kind: Тип параметра, который может быть
POSITIONAL_OR_KEYWORD,VAR_POSITIONAL,VAR_KEYWORD,KEYWORD_ONLYилиPOSITIONAL_ONLY. В данном случае иx, иyявляютсяPOSITIONAL_OR_KEYWORD, что означает, что они могут быть переданы как позиционные или именованные аргументы.
Используя функцию inspect.signature(), вы можете получить более глубокое понимание параметров функции и их свойств. Эта информация ценна для написания кода, который корректно взаимодействует с функциями, и для эффективной документации кода.
Проверьте передачу аргументов с использованием try-except
На этом этапе вы узнаете, как использовать блоки try-except для обработки потенциальных ошибок при передаче аргументов в функцию. Это особенно важно при работе с пользовательским вводом или внешними данными, где тип данных или формат могут отличаться от того, что ожидает функция.
Давайте модифицируем скрипт my_function.py, чтобы включить обработку ошибок с использованием try-except. Мы попытаемся вызвать функцию add_numbers с некорректными аргументами и поймать возникающее исключение TypeError.
Откройте файл my_function.py в каталоге ~/project с помощью редактора VS Code и измените его следующим образом:
## filename: ~/project/my_function.py
import inspect
def add_numbers(x: int, y: int = 10) -> int:
"""This function adds two numbers and returns the result."""
return x + y
try:
result = add_numbers("hello", 5)
print(f"Result: {result}")
except TypeError as e:
print(f"Error: {e}")
try:
result = add_numbers(5, "world")
print(f"Result: {result}")
except TypeError as e:
print(f"Error: {e}")
try:
result = add_numbers(5, 5)
print(f"Result: {result}")
except TypeError as e:
print(f"Error: {e}")
В этом модифицированном скрипте:
- Мы оборачиваем вызовы функции
add_numbersв блокиtry-except. - Мы пытаемся вызвать функцию
add_numbersс передачей строки в качестве первого аргумента и целого числа в качестве второго аргумента. - Мы пытаемся вызвать функцию
add_numbersс передачей целого числа в качестве первого аргумента и строки в качестве второго аргумента. - Мы пытаемся вызвать функцию
add_numbersс передачей двух целых чисел в качестве аргументов. - Если возникает исключение
TypeError(что произойдет, когда мы передаем строку вместо целого числа), мы ловим это исключение и выводим сообщение об ошибке. - Если исключение
TypeErrorне возникает, мы выводим результат вызова функции.
Теперь запустите скрипт с помощью команды python:
python ~/project/my_function.py
Вы должны увидеть следующий вывод:
Error: unsupported operand type(s) for +: 'str' and 'int'
Error: unsupported operand type(s) for +: 'int' and 'str'
Result: 10
Этот вывод демонстрирует, как блоки try-except можно использовать для элегантной обработки ошибок, возникающих при передаче некорректных аргументов в функцию. Первые два вызова функции add_numbers приводят к возникновению исключений TypeError, которые ловятся и обрабатываются блоками except. Третий вызов функции add_numbers с передачей двух целых чисел выполняется успешно, и результат выводится на экран.
Использование блоков try-except является рекомендуемой практикой при написании надежного и устойчивого к ошибкам кода. Это позволяет предвидеть потенциальные ошибки и обрабатывать их таким образом, чтобы программа не аварийно завершалась.
Резюме
В этом практическом занятии (лабораторной работе) вы узнали о сигнатурах функций в Python и о том, как они предоставляют информацию о ожидаемых аргументах функции и возвращаемых значениях. Понимание сигнатур функций является важным аспектом при написании чистого и поддерживаемого кода.
В рамках практического занятия показано, как использовать модуль inspect, а именно функцию inspect.signature(), для получения и анализа сигнатуры функции Python. Вы создали простую функцию с использованием подсказок типов и затем воспользовались функцией inspect.signature() для вывода сигнатуры функции в консоль, тем самым выявив ожидаемые типы аргументов и тип возвращаемого значения.



