Модуль 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]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи