Achten Sie beim Benennen von Variablen in Python nicht nur auf reservierte Wörter, sondern auch auf Konflikte mit integrierten Funktionen.

Es wird oft gesagt, dass Python nur wenige reservierte Wörter hat. Es ist kein Fehler,

>>> __import__('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']

Ab Version 3.3.4 sind dies 33. Aber das reservierte Wort ist

Ein lexikalisches Element, das nicht als Bezeichner verwendet werden kann, obwohl es die Regeln für lexikalische Bezeichner (Variablennamen, Funktionsnamen, Klassennamen usw.) in Programmiersprachen erfüllt.

Es gibt jedoch noch einige weitere "Zeichenfolgen, die als Bezeichner verwendet werden können, aber nicht verwendet werden sollten".

Übrigens ist es streng genommen eine Lüge, "viele Perl-reservierte Wörter" im Kontext von "weniger Python-reservierten Wörtern" zu sagen (Referenz: Gibt es ein reserviertes Wort in Perl? - Das Leben ist sehr kurz //d.hatena.ne.jp/syohex/20110914/1316010018)) gibt es nur viele "Zeichenfolgen, die als Bezeichner verwendet werden können, aber nicht verwendet werden sollten".

Ein typisches Beispiel für "eine Zeichenfolge, die als Bezeichner verwendet werden kann, aber nicht verwendet werden sollte", ist der Funktionsname der integrierten Funktion.

>>> list(set([1,2,3,4,3,2,1]))
[1, 2, 3, 4]
>>> list = [1,2,3]
>>> list(set([1,2,3,4,3,2,1]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

Wenn Sie es unachtsam verwenden, besteht die Gefahr, dass die integrierte Funktion überschrieben wird. Die Liste der integrierten Funktionen lautet wie folgt.

>>> 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', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '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']

Es gibt 149! Es ist wahrscheinlich 72 nach Bauchmuskeln, die Sie wirklich interessieren, aber es ist immer noch über 100, wenn es mit reservierten Wörtern kombiniert wird. Auch wenn der Code aufgrund eines Konflikts nicht hängen bleibt, ist dies eine Quelle der Verwirrung für den Leser. Vermeiden Sie es daher, diese so oft wie möglich in Variablennamen zu verwenden.

Erstens haben Variablen, die mit dem Unterstrich (_) beginnen, eine besondere Bedeutung, und es ist besser, vorsichtig zu sein PEP8-Namensregel. Es ist sorgfältig in pep-0008.ja.html # id23) geschrieben, also beziehen Sie sich bitte darauf.

Hier,

Verwenden Sie immer self als erstes Argument der Instanzmethode. Verwenden Sie immer cls als erstes Argument für Klassenmethoden.

Da so etwas geschrieben ist, sind self und cls auch "Zeichenketten, die als Bezeichner verwendet werden können, aber nicht verwendet werden sollten (außer für bestimmte Zwecke)". (Warum sind dies dann keine reservierten Wörter? [Japanische Übersetzung, warum schreiben Sie sich explizit in das Methodenargument von Python?) -zu bleiben /) Bitte beziehen Sie sich auf

Darüber hinaus führt PEP8 eine Methode zum Hinzufügen einer _ _ like like list_ ein, um den Namen zu ändern, wenn er mit dem Schlüsselwort in Konflikt steht, wie im Beispiel der Liste am Anfang (_ Eingeführt als Verwendung von `). Beeinträchtigen Sie die Lesbarkeit nicht, indem Sie etwas wie lst weglassen. Ich versuche, die Lesbarkeit zu verbessern, indem ich sie so konkret wie möglich mache, wie "name_list" usw.

Recommended Posts

Achten Sie beim Benennen von Variablen in Python nicht nur auf reservierte Wörter, sondern auch auf Konflikte mit integrierten Funktionen.
Achten Sie beim Drucken von Japanisch mit Python 3 auf LANG für UnicodeEncodeError
Hier finden Sie eine Zusammenfassung der Dinge, die beim Umgang mit komplexen Zahlen in Python hilfreich sein können
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Seien Sie vorsichtig, wenn Sie den Standardargumentwert in der Python 3-Serie angeben