Примечание. Этот вопрос предназначен только для информационных целей. Мне интересно посмотреть, как глубоко внутри Python можно с этим справиться.
Не так давно в рамках некоторого вопроса началось обсуждение вопроса о том, могут ли быть изменены строки, переданные для операторов печати после/во время вызова print
. Например, рассмотрим функцию:
def print_something():
print('This cat was scared.')
Теперь, когда print
выполняется, тогда вывод на терминал должен отображаться:
This dog was scared.
Обратите внимание, что слово "кошка" было заменено словом "собака". Что-то где-то каким-то образом удалось изменить эти внутренние буферы, чтобы изменить то, что было напечатано. Предположим, что это сделано без явного разрешения автора исходного кода (следовательно, взлома/угона).
Этот комментарий от мудрых @abarnert, в частности, заставил меня думать:
Есть несколько способов сделать это, но они все очень уродливые и никогда не должны делаться. Наименее уродливым способом является, вероятно, заменить объект
code
внутри функции одним с другим спискомco_consts
. Следующее, вероятно, входит в C API для доступа к внутреннему буферу str. [...]
Таким образом, похоже, что это действительно возможно.
Здесь мой наивный способ приблизиться к этой проблеме:
>>> import inspect
>>> exec(inspect.getsource(print_something).replace('cat', 'dog'))
>>> print_something()
This dog was scared.
Конечно, exec
плохой, но на самом деле это не отвечает на вопрос, потому что он фактически ничего не изменяет во время вызова/после print
.
Как это можно сделать, поскольку @abarnert объяснил это?