Ist die Liste der von Python reservierten Wörter und eingebauten Elemente in einer Bibliothek verfügbar?

135

Ist die Liste der von Python reservierten Wörter und eingebauten Elemente in einer Bibliothek verfügbar? Ich möchte so etwas tun wie:

 from x.y import reserved_words_and_builtins

 if x in reserved_words_and_builtins:
     x += '_'
Neil G.
quelle
Mögliches Duplikat der Liste der Python-Schlüsselwörter
Abhijit
3
@Abhijit: Der Hauptunterschied ist, dass ich nach allen reservierten Wörtern einschließlich eingebauter Wörter gefragt habe.
Neil G
Bearbeiten: Anscheinend verwenden viele Leute "reserviertes Wort" als Synonym für Schlüsselwort. Ich habe die Frage entsprechend bearbeitet.
Neil G
@NeilG Ich bin mir ziemlich sicher, dass sie Synonyme in Python sind. Builtins sind definitiv keine reservierten Wörter, da sie neu zugewiesen werden können, z print = None.
wjandrea

Antworten:

198

Um zu überprüfen, ob eine Zeichenfolge ein Schlüsselwort ist, können Sie Folgendes verwenden keyword.iskeyword: Um die Liste der reservierten Schlüsselwörter zu erhalten, können Sie Folgendes verwenden keyword.kwlist:

>>> import keyword
>>> keyword.iskeyword('break')
True
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 
 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 
 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 
 'while', 'with', 'yield']

Wenn Sie auch integrierte Namen einfügen möchten (Python 3), überprüfen Sie das builtinsModul :

>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError',
 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError',
 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError',
 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError',
 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError',
 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning',
 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError',
 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError',
 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_',
 '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__',
 '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool',
 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex',
 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr',
 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int',
 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map',
 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set',
 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple',
 'type', 'vars', 'zip']

Für Python 2 müssen Sie das __builtin__Modul verwenden

>>> import __builtin__
>>> dir(__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', 'WindowsError', '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']
Ashwini Chaudhary
quelle
11
Beachten Sie, dass in python2.6 <= xy <3.0 Noneist nicht formal ein Schlüsselwort (nach kwlistund iskeyword) , aber es ist eigentlich ein Schlüsselwort (weil None = 1mit einem nicht SyntaxError), obwohl sie als Einbau in zusammen mit aufgeführt ist Trueund False.
Bakuriu
3
Was ist aus Neugier die philosophische Rechtfertigung für die Unterscheidung zwischen Schlüsselwörtern und Builtins? Sollten sie nicht alle reserviert sein?
verwirrend
11
@notconfusing: Schlüsselwörter sind Teil der Grammatik der Sprache. Builtins tun so, als hätten Sie es getan from builtins import *; Sie können überschrieben werden.
Neil G
2
@notconfusing: Insbesondere das Minimieren von Schlüsselwörtern bedeutet, dass gebräuchliche Wörter in sicheren Szenarien nicht unnötig nicht verfügbar sind . Sicher, das Zuweisen set = 1ist eine schreckliche Idee, aber eine Klasse mit einer Methode oder einem Attribut namens set(daher wird immer darauf verwiesen instance.set, nicht so einfach set) ist nicht unbedingt schrecklich. Es gibt durchaus legitime Fälle für die Benennung einer Methode set. Wenn setes ein Schlüsselwort wäre, könnten Sie das nicht tun.
ShadowRanger
1
@wwii Die speziellen Methodennamen sind nicht global wie eingebaute Elemente oder Teil der Syntax wie Schlüsselwörter definiert. __len__allein bedeutet nichts. Du musst sagen str.__len__oder list.__len__. Sie müssen sich also keine Sorgen machen, dass Ihre Variablennamen mit ihnen kollidieren.
Nick S