Как проверить, принимает ли функция в Python определенные аргументы

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы научитесь проверять, принимает ли функция Python определенные аргументы, исследуя сигнатуры функций. В лабораторной работе используется модуль inspect для доступа к сигнатурам функций и их анализа, что позволяет получить ценную информацию о ожидаемых аргументах и возвращаемых значениях функции.

В рамках лабораторной работы вы создадите Python-скрипт с примером функции, а затем используете функцию inspect.signature() для получения и вывода сигнатуры функции. Вы также научитесь интерпретировать вывод, чтобы понять параметры функции и тип возвращаемого значения. Наконец, в лабораторной работе будет показано, как тестировать передачу аргументов с использованием блоков try-except.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/FunctionsGroup -.-> python/default_arguments("Default Arguments") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") subgraph Lab Skills python/variables_data_types -.-> lab-559516{{"Как проверить, принимает ли функция в Python определенные аргументы"}} python/function_definition -.-> lab-559516{{"Как проверить, принимает ли функция в Python определенные аргументы"}} python/arguments_return -.-> lab-559516{{"Как проверить, принимает ли функция в Python определенные аргументы"}} python/default_arguments -.-> lab-559516{{"Как проверить, принимает ли функция в Python определенные аргументы"}} python/catching_exceptions -.-> lab-559516{{"Как проверить, принимает ли функция в Python определенные аргументы"}} end

Изучение сигнатур функций

На этом этапе вы узнаете о сигнатурах функций в 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() для вывода сигнатуры функции в консоль, тем самым выявив ожидаемые типы аргументов и тип возвращаемого значения.