inspect — Инспекция живых объектов исполнения
Модуль inspect предоставляет богатые функции для того, чтобы изучать внутренности запущенной Python программы (работающие мета-инструменты). С его помощью можно проверять типы классов, читать "живой" исходный код функций прямо из памяти, а также анализировать, какие аргументы принимает функция.
Этот модуль активно используется под капотом продвинутых библиотек (таких как Pytest или FastAPI) для реализации магии "внедрения зависимостей" (Dependency Injection).
import inspect
Получение исходного кода
Вы можете получить настоящий текстовый исходный код любой функции или класса, который был считан интерпретатором!
import inspect
def secret_logic(x):
# Главный алгоритм!
return x * 100
# Получить исходный код в виде строки
source = inspect.getsource(secret_logic)
print(source)
# Узнать, в каком физическом файле на диске функция была написана
print(inspect.getfile(secret_logic))
Инспекция параметров (Сигнатур)
Позволяет узнать, какие аргументы ждет функция, есть ли у них аннотации типов (type hints) и значения по умолчанию.
import inspect
def register(username: str, age: int = 18):
pass
# Получаем объект "Сигнатура"
sig = inspect.signature(register)
# Перебираем все аргументы
for name, param in sig.parameters.items():
print(f"Аргумент: {name}")
print(f"Тип данных: {param.annotation}")
if param.default is not inspect.Parameter.empty:
print(f"По умолчанию: {param.default}")
print("---")
Полный справочник API (API Reference)
Типы и Классификация
| Функция | Описание |
|---|---|
inspect.ismodule(obj) |
Вернет True, если переданный объект — импортированный модуль. |
inspect.isclass(obj) |
Проверяет, является ли объект классом. |
inspect.isfunction(obj) |
Проверяет, является ли объект классической Python-функцией. |
inspect.iscoroutinefunction(obj) |
Вернет True, если это асинхронная корутина (async def). |
Исходный код и Файлы
| Функция | Описание |
|---|---|
inspect.getdoc(obj) |
Возвращает очищенную __doc__ строку документации объекта (Docstring) без отступов. |
inspect.getfile(obj) |
Возвращает полный путь к файлу на диске, в котором был определен (написан) объект. |
inspect.getsource(obj) |
Ищет файл объекта и читает из него текстовый Python-код этого самого объекта/функции/класса. |
Сигнатуры
| Функция/Класс | Описание |
|---|---|
inspect.signature(func) |
Возвращает объект Signature, описывающий аргументы, которые может принимать функция (очень мощный инструмент для фреймворков). |
Signature.parameters |
Упорядоченный словарь аргументов функции. |
Parameter.default |
Свойство, содержащее значение по умолчанию для аргумента, ЛИБО константу inspect.Parameter.empty. |
Parameter.annotation |
Свойство, содержащее класс ожидаемого типа (type hint), ЛИБО константу empty. |