85 votes

Python: Quelle est la différence entre __builtin__ et __builtins__?

J'ai été codage aujourd'hui et a remarqué quelque chose. Si j'ouvre un nouvel interprète session (IDLE) et de vérifier ce qui est défini avec l' dir fonction j'obtiens ceci:

$ python
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
>>> import __builtin__
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
>>> dir(__builtin__) == dir(__builtins__) # They seem to have the same things
True

Veuillez noter que la dernière ligne.

Donc, ma question est:

  • Est tout un alias de l'autre?

  • Sont le Python gars de planification pour se débarrasser de l'un de ces?

  • Que dois-je utiliser pour mes propres programmes?

  • Qu'en Python 3?

  • Toute information est utile,!

Important:

Je suis à l'aide de Python 2.7.2+ sur Ubuntu.

76voto

akent Points 2230

Directement à partir de la documentation python: http://docs.python.org/reference/executionmodel.html

Par défaut, lorsque dans l' __main__ module __builtins__ est le intégré dans le module __builtin__ (note: pas de 's'); dans toutes les autres module, __builtins__ est un alias pour le dictionnaire de l' __builtin__ module lui-même.

__builtins__ peut être définie par l'utilisateur dictionnaire créé pour créer un la faiblesse de la forme d'exécution restreint.

Disponible détail de l'implémentation: les Utilisateurs ne doivent pas touch __builtins__; il est strictement un détail d'implémentation. Les utilisateurs envie de remplacer des valeurs dans les fonctions internes telles espace de noms doit import l' __builtin__ (pas de "s"), de module et de modifier ses attributs de façon appropriée. L'espace de noms pour un module est automatiquement créé la la première fois qu'un module est importé.

Notez que dans Python3, le module __builtin__ a été renommé builtins afin d'éviter une partie de cette confusion.

25voto

interjay Points 51000

Vous devez utiliser __builtin__ dans vos programmes (dans les rares cas où vous en avez besoin), car __builtins__ est un détail d'implémentation de Disponible. Il peut être soit identiques à __builtin__, ou d' __builtin__.__dict__, selon le contexte. Comme la documentation dit:

La plupart des modules ont le nom __builtins__ (notez le "s") mis à disposition dans le cadre de leur globals. La valeur de __builtins__ est généralement ce module ou de la valeur de ce module est __dict__ d'attribut. Puisque c'est un détail d'implémentation, il ne peut pas être utilisé par d'autres implémentations de Python.

En Python 3, __builtin__ a été renommé builtins, et __builtins__ reste le même (donc vous ne devez utiliser builtins en Python 3).

Guido voulu unir __builtin__ et __builtins__, comme vous pouvez le voir ici ("Ayant __builtins__ et __builtin__ les deux est clairement une mauvaise idée.") mais apparemment , il n'en fut rien.

Apparemment, l'utilisation de l' __builtins__ est pour la performance - il donne un accès direct à l' __builtin__.__dict__ dans le cas de non-module principal, et donc supprime un niveau d'indirection.

9voto

BrenBarn Points 63718

__builtin__ est un module contenant les fonctions et les types intégrés. Le fait qu'un nom __builtins__ soit disponible contenant les mêmes choses est un détail d'implémentation. En d'autres termes, si vous devez utiliser l'un d'eux, faites import __builtin__ puis utilisez __builtin__ . Voir la documentation .

2voto

lslab Points 321

Vous pouvez les comprendre comme le code suivant. lorsque cpython est démarré, cpython charge __builtin__ modules dans un espace de noms global

importer __builtin__ as __builtins__

0voto

Markus Gattol Points 1313

Levon, la plupart des réponses à votre question ont déjà été mentionnées. Il y a quelque temps, j'ai écrit quelques lignes à propos de builtins vs __builtins__ vs __builtin__ http://www.markus-gattol.name/ws/python.html# construit

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X