En général, vous ne pouvez pas. Par exemple, 2 + 2
est une expression - mais si vous la passez à une fonction ou à une méthode quelconque, l'argument transmis est simplement le nombre 4
, aucun moyen de récupérer l'expression à partir de laquelle elle a été calculée. Le code source de fonction peut parfois être récupéré (mais pas pour lambda
), mais "une expression Python non protégée" obtient évalué donc ce que vous obtenez est juste l'objet qui est la valeur de l'expression.
Quel problème tentez-vous de résoudre? Il peut y avoir d'autres approches viables.
Modifier: tx à l'OP pour la clarification. Il n'y a aucun moyen de le faire pour lambda
ou d'autres cas d'angle, mais comme je mentionne le code source de la fonction peut parfois être récupéré ...:
import ast
import inspect
def f():
return 23
tree = ast.parse(inspect.getsource(f))
print ast.dump(tree)
inspect.getsource
soulève IOError
si elle ne peut pas obtenir le code source pour tout objet que vous le passez. Je suggère que vous enveloppiez l'appel d'analyse et getsource dans une fonction auxiliaire qui peut accepter une chaîne (et l'analyse juste) OU une fonction (et essaye getsource dessus, donnant probablement de meilleures erreurs dans le cas IOError
).
@Ants suggestion Aasma était plus proche de ce que j'espérais, bien qu'il semble être beaucoup plus impliqué que je ne pensais et j'imagine plus fragiles wrt différentes versions de Python (si des changements bytecode). GeniuSQL semble prometteur aussi. Désactivé pour faire des tests! – Chris
Aussi, juste trouvé ceci: http://code.activestate.com/recipes/442447/ – Chris