Модуль dis Python: найдите инструкции возврата в байт-коде
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Профилирование Python: задачи на cProfile, pstats и байт-код dis.
Поиск ранних возвратов в байт-коде
Модуль статической верификации проверяет функции бизнес-логики на строгое соблюдение правила явного выхода: у каждой функции должна быть ровно одна терминальная точка завершения. Для этого инспектор байт-кода без выполнения самой функции изучает её инструкции с помощью dis.get_instructions. Анализатор находит все инструкции возврата RETURN_VALUE или RETURN_CONST, сопоставляя их со смещениями в байт-коде и номерами строк в исходном коде.
Если обнаруженных точек возврата оказывается строго больше одной, функция признаётся содержащей преждевременные выходы. В этом случае инструмент формирует отчёт по строкам исходного кода для всех инструкций возврата, исключая ту, которая расположена физически последней в теле функции.
Напишите функцию проверки байт-кода, которая возвращает отсортированный по возрастанию список уникальных номеров строк исходного кода с ранними возвратами, либо пустой список, если точка выхода из функции единственная.
Что уже дано
В редакторе представлена заготовка функции early_return_lines(function).
Вспомогательные инструменты для проверки доступны при выполнении, реализовывать их самостоятельно не требуется.
Что нужно сделать
Реализуйте функцию early_return_lines(function).
Функция принимает объект function (нативная функция Python 3.12 со стандартными метаданными строк компилятора; объём байт-кода — от 0 до 10 000 инструкций; возможны неявные возвраты, асинхронные конструкции, блоки try/finally и вложенные функции).
Правила проверки:
- Инспектируйте инструкции переданной функции с помощью
dis.get_instructions. Учитывайте только операции возврата:RETURN_VALUEиRETURN_CONST. - Не выполняйте переданную функцию и не оценивайте её граф потока управления на этапе исполнения.
- Анализируйте только байт-код самой функции: рекурсивный спуск во вложенные кодовые объекты, строковый парсинг исходного файла и подсчёт вспомогательных инструкций (например,
LOAD_*) не требуются. - Ранними считаются все точки возврата, кроме физически последней по байт-код-смещению (
offset) в теле исследуемой функции. - Если в функции обнаружено не более одной инструкции возврата (ноль или одна), функция должна вернуть пустой список
[]. - Результатом должен быть отсортированный по возрастанию список уникальных положительных номеров строк исходного кода, на которых находятся ранние возвраты. Допускается
listили совместимый с ним список целых чисел (не кортеж и не смещения байт-кода).
Ввод и вывод
Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля функцию верхнего уровня early_return_lines и вызывает её с проверочными аргументами.
Пример использования
def example(flag):
if flag:
return 1
return 2
print([line - example.__code__.co_firstlineno for line in early_return_lines(example)])
Вывод:
[2]
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- CProfile Python: разница между tottime и cumtime в отчёте
- CProfile и pstats: найдите доминирующую операцию в профиле Python
- Модуль dis Python: аудит повторяющихся инструкций LOADGLOBAL
- Удаление ключа из ChainMap в Python: проверка поведения del
- Обратный индекс на Python: группировка уникальных значений через defaultdict
- Подсчёт дефицита ресурсов в Python: квоты и суммы заявок
