В общем, вы не можете. Например, 2 + 2
является выражением, но если вы передаете его какой-либо функции или методу, передаваемый аргумент - это просто номер 4
, не способ восстановить то, из какого выражения он был вычислен. Исходный код функции иногда может быть восстановлен (хотя и не для lambda
), но «выражение без кавычек Python» получает , оцененный, поэтому вы получаете только объект, который является значением выражения.
В чем проблема, которую вы пытаетесь решить? Могут быть и другие, жизнеспособные подходы.
Редактировать: tx to OP для уточнения. Там нет никакого способа сделать это для lambda
или некоторых других случаев угловых, но, как я уже функция исходного кода иногда может быть восстановлен ...:
import ast
import inspect
def f():
return 23
tree = ast.parse(inspect.getsource(f))
print ast.dump(tree)
inspect.getsource
поднимает IOError
, если он не может получить исходный код для любого объект, которым вы его передаете. Я предлагаю вам обернуть разбор и запрос источника в вспомогательную функцию, которая может принимать строку (и просто анализирует ее) ИЛИ функцию (и пытается получить источник на ней, возможно, давая лучшие ошибки в случае IOError
).
@Ants Aasma предложение было ближе всего к тому, что я надеялся, хотя, кажется, намного сложнее, чем я ожидал, и я думаю, более хрупкие WRT различные версии Python (если изменения байт-кода). GeniuSQL также выглядит многообещающим. Выключить, чтобы провести некоторое тестирование! – Chris
Кроме того, вы нашли это: http://code.activestate.com/recipes/442447/ – Chris