Я пытаюсь создать функцию на Python, которая делает эквивалент compile(), но также позволяет мне вернуть исходную строку. Давайте назовем эти две функции comp() и decomp() для устранения неоднозначности. То есть,
a = comp("2 * (3 + x)", "", "eval")
eval(a, dict(x=3)) # => 12
decomp(a) # => "2 * (3 + x)"
Возвращаемая строка не обязательно должна быть идентичной ("2*(3+x)" будет приемлемо), но она должна быть в основном одинаковой ("2 * x + 6" не будет ).
Вот что я пробовал, но не работает:
- Установка атрибута объекта кода, возвращаемого компиляцией. Вы не можете установить настраиваемые атрибуты для объектов кода.
- Код подкласса, чтобы я мог добавить атрибут. код не может быть подклассом.
- Настройка сопоставления объектов кода WeakKeyDictionary с исходными строками. объекты кода не могут иметь слабую ссылку.
Вот что работает с проблемами:
- Передача исходной строки кода для имени файла в compile(). Однако я теряю возможность фактически хранить там имя файла, что я тоже хотел бы сделать.
- Сохранение реального словаря, отображающего объекты кода в строки. Это приводит к утечке памяти, хотя, поскольку компиляция выполняется редко, это приемлемо для моего текущего варианта использования. Вероятно, я мог бы периодически запускать ключи через gc.get_referrers и убивать мертвые, если бы мне пришлось.