Есть ли способ получить исходный код внутри диспетчера контекста в виде строки?

Исходный код функции может быть получен с inspect.getsourcelines(func) . Есть ли способ сделать это для диспетчера контекста?

 with test(): print('123') # How to get "print('123')" as line here? 

Что вы думаете об этом решении?

 import traceback class ContextManagerContent(object): def __enter__(self): return def __exit__(self, _type, value, _traceback): stack = traceback.extract_stack() f, last_line = self._get_origin_info(stack) with open(f) as fin: lines = list(fin) search = 'with {cls_name}'.format(cls_name=self.__class__.__name__) for i, x in enumerate(lines[:last_line + 1][::-1]): if search in x: first_line = len(lines) - i break selected_lines = lines[first_line:last_line + 1] print ''.join(selected_lines) def _get_origin_info(self, stack): origin = None for i, x in enumerate(stack[::-1]): if x[2] == '__exit__': origin = stack[::-1][i + 1] break return origin[0], origin[1] - 1 with ContextManagerContent(): print '123' print '456' print '789' 

Если вы сохраните это в .py файле и запустите его, вы увидите, что печатаются цифры 123, 456 и 789, после чего вы можете увидеть блок менеджера контекста.

Обратите внимание, что я не справился с исключениями или форматированием вывода, и некоторые части могут быть улучшены, но я думаю, что это хорошая отправная точка.