2014-04-20 12 views
5

Tak więc w Pythonie 2 było jasne. Ale w Pythonie 3 jestem nieco zdezorientowany.Czy są prawdziwe, fałszywe, brak słów kluczowych lub wbudowane w Pythonie 3?

>>> 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', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', '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'] 
>>> import keyword 
>>> dir(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'] 

Prawdziwego, Fałsz i Żaden są obecne zarówno w module builtins i kluczowych modułu. Więc jak mam je traktować? Jako wbudowane klasy lub jako słowa kluczowe?

Odpowiedz

6

Są to zastrzeżone słowa i wartości wbudowane. Od Python 3 What's New:

True, False i None są zarezerwowane słowa. (2.6 częściowo wymusił ograniczenia na None).

Oznacza to, że nie można ich używać jako nazwy, przypisując im inną wartość. Zapobiega to przypadkowemu maskowania wbudowanej wartości pojedynczych:

>>> True = False 
    File "<stdin>", line 1 
SyntaxError: can't assign to keyword 

zobaczyć również Guido van Rossum's history lesson on None, True and False:

Nadal zapomniał odpowiedzieć czy None/Prawda/Fałsz są literały lub słowa kluczowe. Moja odpowiedź jest taka, że ​​obie są. Są to słowa kluczowe, ponieważ rozpoznają je w parserze. Są to literały, ponieważ to jest ich rola w wyrażeniach i dlatego, że oznaczają one stałe wartości.

Z True, False i None sklasyfikowany jako słów kluczowych, kompilator Pythona może faktycznie optymalizacji ich wykorzystania, ponieważ nie można (bezpośrednio) ponownie powiązać te nazwy Python można wyszukać je jako stałe zamiast globalnych, które jest szybsze.

Do wersji Python 3.4 były jeszcze przypadki, w których kompilator wystawiłby globalne wyszukiwanie dla tych obiektów, patrz issue 16619. Począwszy od wersji Python 3.4, parser Pythona został rozszerzony, aby wytworzyć nowy węzeł AST NameConstant, aby zapewnić, że są one traktowane jako stałe wszędzie.

+0

Ale jeśli 'None',' True' i 'False' są teraz słowami kluczowymi w języku Python, dlaczego należy je przechowywać w module * builtins *? – ostrokach

+2

@ostrokach: * nazwy * mogą być słowami kluczowymi, ale nadal muszą odnosić się do rzeczywistych obiektów. Kiedy używasz nazwy, nadal chcesz, aby ta nazwa została rozwiązana dla obiektu. I po co łamać dowolny kod, który używał 'builtins.False' lub' builtins.True' by ominąć lokalne cieniowanie? –

Powiązane problemy