Lorsque vous nommez des variables en Python, faites attention non seulement aux mots réservés, mais également aux conflits avec les fonctions intégrées.

On dit souvent que Python a peu de mots réservés. Ce n'est pas une erreur

>>> __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']

Depuis la version 3.3.4, ce sont 33. Mais le mot réservé est

Un élément lexical qui ne peut pas être utilisé comme identifiant même s'il répond aux règles des identifiants lexicaux (noms de variables, noms de fonctions, noms de classes, etc.) dans les langages de programmation.

Cependant, il existe quelques "chaînes de caractères supplémentaires qui peuvent être utilisées comme identificateurs mais ne doivent pas l'être".

Au fait, c'est strictement un mensonge de dire "beaucoup de mots réservés Perl" dans le contexte de "moins de mots réservés Python" (Référence: Y a-t-il un mot réservé en Perl? - La vie est très courte //d.hatena.ne.jp/syohex/20110914/1316010018)), il n'y a que beaucoup de "chaînes de caractères qui peuvent être utilisées comme identifiants mais ne doivent pas être utilisées".

Un exemple typique de «chaîne de caractères qui peut être utilisée comme identificateur mais ne doit pas être utilisée» est le nom de fonction de la fonction intégrée.

>>> 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

Si vous l'utilisez négligemment, il y a un risque d'écraser la fonction intégrée. La liste des fonctions intégrées est la suivante.

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

Il y en a 149! C'est probablement 72 après les abdominaux que vous vous souciez vraiment, mais c'est toujours plus de 100 lorsqu'il est combiné avec des mots réservés. Même si le code ne reste pas bloqué en raison d'un conflit, c'est une source de confusion pour le lecteur, évitez donc autant que possible de les utiliser dans les noms de variables.

En premier lieu, les variables commençant par un trait de soulignement (_) ont une signification particulière, et il vaut mieux faire attention [règle de dénomination PEP8](https://dl.dropboxusercontent.com/u/555254/ Il est écrit soigneusement dans pep-0008.ja.html # id23), veuillez donc vous y référer.

ici,

Utilisez toujours self comme premier argument de la méthode d'instance. Utilisez toujours cls comme premier argument des méthodes de classe.

Puisque quelque chose comme ceci est écrit, self et cls seront également "des chaînes de caractères qui peuvent être utilisées comme identificateurs mais ne doivent pas être utilisées (sauf à certaines fins)". (Alors pourquoi ce ne sont pas des mots réservés traduction japonaise pourquoi écrire explicitement self dans l'argument méthode de Python -to-stay /) Veuillez vous référer à

De plus, PEP8 introduit une méthode pour ajouter une _ like list_ pour savoir comment changer le nom lorsqu'il entre en conflit avec le mot-clé, comme dans l'exemple de list au début (_ Présenté comme comment utiliser). N'altérez pas la lisibilité en omettant quelque chose comme lst. J'essaye d'améliorer la lisibilité en la rendant plus concrète comme name_list etc. autant que possible.

Recommended Posts

Lorsque vous nommez des variables en Python, faites attention non seulement aux mots réservés, mais également aux conflits avec les fonctions intégrées.
Faites attention à LANG pour UnicodeEncodeError lors de l'impression du japonais avec Python 3
Voici un résumé des choses qui pourraient être utiles pour traiter des nombres complexes en Python
Comment ne pas échapper au japonais en traitant avec JSON en Python
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3