web-dev-qa-db-fra.com

Python fonction intégrée "compiler". A quoi sert-elle?

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]])
35
demo.b

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.)

52
BrenBarn

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:

  1. 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.
  2. 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.
  3. 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.

15
Alex Thornton

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 module ast pour savoir comment travailler avec AST objets.

Il faut donc python code, et retourne sur ces deux choses

  • exec exécutera le code python
  • eval évaluera une expression, moins fonctionnelle que exec
  • ast vous permet de naviguer dans l'arborescence de syntaxe abstraite générée par le code
6
Jonathon Reinhart