Ich habe heute programmiert und etwas bemerkt. Wenn ich eine neue Dolmetschersitzung (IDLE) öffne und überprüfe, was mit der dir
Funktion definiert ist, erhalte ich Folgendes :
$ 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
Bitte beachten Sie die letzte Zeile.
Meine Frage lautet also:
Ist irgendein Alias des anderen?
Planen die Python-Leute, eines davon loszuwerden?
Was soll ich für meine eigenen Programme verwenden?
Was ist mit Python 3?
Jede Information ist wertvoll!
Wichtig:
Ich verwende Python 2.7.2+ unter Ubuntu.
python
python-3.x
python-2.7
language-design
python-module
Santiagobasulto
quelle
quelle
import builtins
Sehen Sie sich dies als Beispiel an: ( stackoverflow.com/questions/61084916/… )Antworten:
Direkt aus der Python-Dokumentation: http://docs.python.org/reference/executionmodel.html
Beachten Sie, dass das Modul in Python3
__builtin__
umbenannt wurdebuiltins
, um diese Verwirrung zu vermeiden.quelle
__builtin__
Modul in "Builtins" (ohne Unterstriche) umbenannt wird. docs.python.org/dev/reference/executionmodel.htmlSie sollten es
__builtin__
in Ihren Programmen verwenden (in den seltenen Fällen, in denen Sie es benötigen), da__builtins__
es sich um ein Implementierungsdetail von CPython handelt. Es kann je nach Kontext entweder identisch mit__builtin__
oder mit sein__builtin__.__dict__
. Wie die Dokumentation sagt:In Python 3
__builtin__
wurde in umbenanntbuiltins
und__builtins__
bleibt gleich (daher sollten Sie es nurbuiltins
in Python 3 verwenden).Guido wollte sich vereinen
__builtin__
und__builtins__
, wie Sie hier sehen können ("Haben__builtins__
und__builtin__
beides ist eindeutig eine schlechte Idee."), Aber anscheinend kam nichts dabei heraus.Anscheinend dient die Verwendung von der
__builtins__
Leistung - sie bietet direkten Zugriff auf die__builtin__.__dict__
Verwendung in einem Nicht-Hauptmodul und entfernt daher eine Indirektionsebene.quelle
builtins
?__builtin__
gibt mir einen Fehler :NameError: name '__builtin__' is not defined
. Was ist der richtige Weg, um darauf zuzugreifen, der nicht kaputt geht?__builtin__
ist ein Modul, das die integrierten Funktionen und Typen enthält. Die Tatsache, dass ein Name__builtins__
verfügbar ist, der dieselben Dinge enthält, ist ein Implementierungsdetail. Mit anderen Worten, wenn Sie eines davon verwenden müssen, tun Sie esimport __builtin__
und verwenden Sie es dann__builtin__
. Siehe die Dokumentation .quelle
import builtins
zB diesen Code stackoverflow.com/a/61085162/3167448Sie können diese wie den folgenden Code verstehen. Wenn cpython gestartet wird, lädt cpython
__builtin__
Module in den globalen Namespaceimportieren
__builtin__
als__builtins__
quelle