У меня есть программа Python 3, которая вызывает функцию C. Функция C возвращает целое число: 0 при успехе или соответствующее errno
при ошибке. В случае неудачи код Python может просто поднять OSError
. Но я бы предпочел, чтобы он поднял соответствующий подкласс OSError
.
Например, если программа Python получает код возврата 2, она должна повысить FileNotFoundError
, подкласс OSError
, Я уже могу найти правильный подкласс, выполнив следующие три шага. Очевидно, что производительность не является проблемой, потому что мне нужно выполнять эти шаги только один раз для версии Python 3 для всех значений errno
и кэшировать результаты.
- Найти все подклассы
OSError
. Это легко, используя __subclass__
, рекурсивно, если необходимо. - Сопоставьте все значения
errno
с именами. Например, если errno
равно 2, это должно соответствовать ENOENT
. Это делается путем анализа соответствующего C включаемого файла. Например, во FreeBSD этот файл будет /usr/include/errno.h
. - Отображать
errno
имена в OSError
подклассы. Это можно сделать с помощью синтаксического анализа кода HTML, например, http://docs.python.org/release/3.8.2/library/exceptions.html
Но шаг 3 действительно очень интересен. Есть ли способ, которым я могу сделать этот шаг без разбора документации? Есть ли что-то, что я могу как-то проверить в Python, который сидит на моем локальном хосте?