Je suis tombé sur une fonction intégrée compile
aujourd'hui. Bien que j'ai lu la documentation, mais je ne comprends toujours pas son utilisation ou son application. S'il vous plaît quelqu'un peut-il expliquer par exemple l'utilisation de cette fonction. J'apprécierai vraiment les exemples.
Dans la documentation, la fonction prend certains paramètres comme indiqué ci-dessous.
compile(source, filename, mode[, flags[, dont_inherit]])
Ce n'est pas communément utilisé. Il est utilisé lorsque vous avez Python code source sous forme de chaîne, et que vous souhaitez en faire un Python code objet que vous pouvez conserver et utiliser. Voici un exemple trivial:
>>> codeobj = compile('x = 2\nprint "X is", x', 'fakemodule', 'exec')
>>> exec(codeobj)
X is 2
Fondamentalement, l'objet code convertit une chaîne en un objet que vous pourrez ensuite appeler exec
pour exécuter le code source dans la chaîne. (Ceci est pour le mode "exec"; le mode "eval" permet l'utilisation de eval
à la place, si la chaîne contient du code pour une seule expression.) Ce n'est pas une tâche courante, c'est pourquoi vous ne pouvez jamais exécuter à travers un besoin pour cela.
Son utilisation principale est dans les situations de métaprogrammation ou d'intégration. Par exemple, si vous avez un programme Python qui permet aux utilisateurs de scripter son comportement avec un code personnalisé Python, vous pouvez utiliser compile
et exec
pour stocker et exécuter ces scripts définis par l'utilisateur.
Une autre raison pour laquelle compile
est rarement utilisée est que, comme exec
, eval
et leurs semblables, compile
est un trou de sécurité potentiel. Si vous prenez le code utilisateur sous forme de chaîne et le compilez puis l'exécutez, vous pourriez exécuter du code non sécurisé. (Par exemple, imaginez que dans mon exemple ci-dessus, le code était formatYourHardDrive()
au lieu de print x
.)
compile
est une version de niveau inférieur de exec
et eval
. Il n'exécute ni n'évalue vos instructions ou expressions, mais renvoie un objet de code qui peut le faire. Les modes sont les suivants:
compile(string, '', 'eval')
renvoie l'objet de code qui aurait été exécuté si vous aviez fait eval(string)
. Notez que vous ne pouvez pas utiliser des instructions dans ce mode; seule une expression (unique) est valide. Utilisé pour une seule expression.compile(string, '', 'exec')
renvoie l'objet de code qui aurait été exécuté si vous aviez fait exec(string)
. Vous pouvez utiliser n'importe quel nombre de déclarations ici. Utilisé pour un module entier.compile(string, '', 'single')
est comme le mode exec
, mais il ignorera tout sauf la première instruction. Notez qu'une instruction if
/else
avec ses résultats est considérée comme une instruction unique. Utilisé pour une seule instruction.Jetez un oeil que la documentation . Il y a aussi une explication impressionnante (enfin, abrutie) à http://joequery.me/code/python-builtin-functions/#compile avec un excellent exemple d'utilisation.
Qu'est-ce que vous ne comprenez pas précisément? La documentation explique qu'elle va:
Compilez la source dans un code ou AST. Les objets de code peuvent être exécutés par un
exec
ou évaluée par un appel àeval()
. La source peut être une chaîne Unicode, une chaîne codée en Latin-1 ou une = AST object. Reportez-vous à la documentation du moduleast
pour savoir comment travailler avec AST objets.
Il faut donc python code, et retourne sur ces deux choses