Я должен предисловие к этому, сказав следующее: я знаю, что эта функциональность не поддерживается по умолчанию - то, что я пытаюсь, является хакерским обходным решением, которое имеет очень мало практического применения и является полная практика психической мастурбации в результате скуки и любопытства. Тем не менее, я пытаюсь сделать следующее:Получение имени локальной переменной во время выполнения в Python
Основываясь на следующем коде Python,
with BuildFile('mybuild.build') as buildfile:
objdir = 'obj'
Я хотел бы создать файл, mybuild.build
с содержимым:
objdir = obj
В идеале я хотел бы связать имя переменной в точке создания, так что, если бы я должен был установить точку останова сразу после objdir = 'obj'
, я хотел бы иметь возможность сделать следующее:
>>> print repr(objdir)
'objdir = obj'
Это было бы невозможно со встроенной функциональностью, так как невозможно переопределить тип, выводимый из синтаксиса. Я могу в конечном итоге взломать обходной путь в методе BuildFile.__enter__
, который использует ctypes
для патча обезьяны tp_new
или tp_dict
полей в базовой структуре PyTypeObject
(и впоследствии возвратит это переопределение при выходе), но для простоты давайте просто предположим, что я не связывая имя переменной до тех пор, пока не достигнет метода BuildFile.__exit__
.
Что мне интересно, о является следующее:
Есть ли встроенные функциональные возможности Python для остановки выполнения, прослеживая назад в кадре, в котором была объявлена локальная переменная, и получить локальное имя, связанное с переменной?
Что вы подразумеваете под «прекращением исполнения»? Отладчик может остановить выполнение скрипта, но если сценарий останавливает выполнение ... он больше не работает, поэтому он ничего не может сделать. – abarnert
Да, «прекращение исполнения» было очень плохим (и неправильным) выбором слов. Я хотел сказать, что это «ориентир нынешней структуры» с целью установления того, где искать относительно этой позиции. –
ОК, да, это именно то, что делает 'sys._getframe()'. Вы даже можете сохранить объект фрейма позже и использовать его извне фрейма (хотя обычно за счет создания множества круговых ссылок для GC для очистки позже). Например, '[sys._getframe() для _ в диапазоне (1)] [0] .f_code' позволяет вам получить скрытую функцию внутри CPython listcomps, и я не могу придумать более чистый способ сделать это. – abarnert