Résolue

Comment Python fait la différence ...( vidéo temps 1:07 mn )

# Fonctions # Modules

...Entre l'appel au module pprint et l'appel à la fonction pprint, lors du test callable print(callable(pprint)) puisque dans les deux cas, c'est le même nom entre le module et la fonction.
Dans un cas, on importe que le module (import pprint) et dans l'autre la fonction du module (from pprint import pprint).
Alors ce serait avec cette différence d'import que Python ferait la distinction entre les deux "homonyme" si je puis dire ?

Salut Étienne,

C'est effectivement juste l'import qui permet de faire la différence.

Si tu ne fais aucun import, tu auras un NameError car pprint ne sera pas trouvé.

Quand tu fais un import, tu importe soit le module, soit la fonction. Et comme il ne peut pas y avoir 2 noms identiques dans le même espace, si tu importes le module puis la fonction, le dernier import remplacera la premier, exemple :

>>> pprint
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'pprint' is not defined. Did you mean: 'print'? Or did you forget to import 'pprint'?
>>> import pprint
>>> pprint
<module pprint="">
>>> from pprint import pprint
>>> pprint
<function pprint="">

Tu peux voir tous les noms disponibles dans l'espace local avec la fonction locals (et globals pour l'espace global).

Tu vois ainsi bien l'association dans un dictionnaire entre le nom et ce à quoi il est associé :

>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.builtinimporter'="">, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'="" (built-in)="">,
'pprint': <function pprint="">}

Tu voisi ici pprint qui correspond bien à la fonction (car c'est le dernier import qu'on a fait).

Si maintenant on assigne une autre valeur à pprint, elle remplacera la fonction :

>>> pprint = 5
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.builtinimporter'="">, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'="" (built-in)="">,
'pprint': 5}

C'est pour cette raison qu'on dit qu'il est "dangereux" d'utiliser l'import *, parce que tu surcharge ton espace global de plein de noms qui pourraient te causer des problèmes.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.