Complément - niveau avancé¶
Ces noms qui viennent de nulle part¶
Nous avons vu déjà un certain nombre de fonctions built-in comme par exemple
open, len, zip(<function _io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)>,
<function len(obj, /)>,
zip)Ces noms font partie du module builtins. Il est cependant particulier puisque tout se passe comme si on avait fait avant toute chose :
from builtins import *sauf que cet import est implicite.
On peut réaffecter un nom built-in¶
Quoique ce soit une pratique déconseillée, il est tout à fait possible de redéfinir ces noms ; on peut faire par exemple
# on réaffecte le nom open à un nouvel objet fonction
def open(encoding='utf-8', *args):
print("ma fonction open")
passqui est naturellement très vivement déconseillé. Notez, cependant, que la coloration syntaxique vous montre clairement que le nom que vous utilisez est un built-in (en vert dans un notebook).
On ne peut pas réaffecter un mot clé¶
À titre de digression, rappelons que les noms prédéfinis dans le module builtins sont, à cet égard aussi, très différents des mots-clés comme if, def, with et autres for qui eux, ne peuvent pas être modifiés en aucune manière :
>>> lambda = 1
File "<stdin>", line 1
lambda = 1
^
SyntaxError: invalid syntaxRetrouver un objet built-in¶
Il faut éviter de redéfinir un nom prédéfini dans le module builtins ; un bon éditeur de texte vous signalera les fonctions built-in avec une coloration syntaxique spécifique. Cependant, on peut vouloir redéfinir un nom built-in pour changer un comportement par défaut, puis vouloir revenir au comportement original.
Sachez que vous pouvez toujours “retrouver” alors la fonction built-in en l’important explicitement du module builtins. Par exemple, pour réaliser notre ouverture de fichier, nous pouvons toujours faire :
# nous ne pouvons pas utiliser open puisque
open()ma fonction open
# pour être sûr d'utiliser la bonne fonction open
import builtins
with builtins.open("builtins.txt", "w", encoding="utf-8") as f:
f.write("quelque chose")Ou encore, de manière équivalente :
from builtins import open as builtins_open
with builtins_open("builtins.txt", "r", encoding="utf-8") as f:
print(f.read())quelque chose
Liste des fonctions prédéfinies¶
Vous pouvez trouver la liste des fonctions prédéfinies ou built-in avec la fonction dir sur le module builtins comme ci-dessous (qui vous montre aussi les exceptions prédéfinies, qui commencent par une majuscule), ou dans la documentation sur les fonctions prédéfinies :
dir(builtins)['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'BaseExceptionGroup',
'BlockingIOError',
'BrokenPipeError',
'BufferError',
'BytesWarning',
'ChildProcessError',
'ConnectionAbortedError',
'ConnectionError',
'ConnectionRefusedError',
'ConnectionResetError',
'DeprecationWarning',
'EOFError',
'Ellipsis',
'EncodingWarning',
'EnvironmentError',
'Exception',
'ExceptionGroup',
'False',
'FileExistsError',
'FileNotFoundError',
'FloatingPointError',
'FutureWarning',
'GeneratorExit',
'IOError',
'ImportError',
'ImportWarning',
'IndentationError',
'IndexError',
'InterruptedError',
'IsADirectoryError',
'KeyError',
'KeyboardInterrupt',
'LookupError',
'MemoryError',
'ModuleNotFoundError',
'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',
'__IPYTHON__',
'__build_class__',
'__debug__',
'__doc__',
'__import__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'abs',
'aiter',
'all',
'anext',
'any',
'ascii',
'bin',
'bool',
'breakpoint',
'bytearray',
'bytes',
'callable',
'chr',
'classmethod',
'compile',
'complex',
'copyright',
'credits',
'delattr',
'dict',
'dir',
'display',
'divmod',
'enumerate',
'eval',
'exec',
'execfile',
'filter',
'float',
'format',
'frozenset',
'get_ipython',
'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',
'range',
'repr',
'reversed',
'round',
'runfile',
'set',
'setattr',
'slice',
'sorted',
'staticmethod',
'str',
'sum',
'super',
'tuple',
'type',
'vars',
'zip']Vous remarquez que les exceptions (les symboles qui commencent par des majuscules) représentent à elles seules une proportion substantielle de cet espace de noms.