2 votes

D'où puis-je accéder à __name__ après l'avoir supprimé ?

Dans mon shell Python, la suppression de __name__ le fait devenir 'builtins' . Bien que, en vérifiant avec globals confirme que je ne fais pas référence à __name__ à partir d'une variable globale.

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> __name__
'__main__'
>>> del __name__
>>> __name__
'builtins'
>>> globals()[__name__]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'builtins'

Je pense que nous l'utilisons depuis une certaine fermeture. Comment ce comportement se manifeste-t-il ?

5voto

Alex Hall Points 20790

Tous les noms sont d'abord recherchés dans les variables locales, puis les variables globales, puis __builtins__ qui est disponible partout. C'est là que se trouvent toutes les fonctions intégrées.

In[6]: __builtins__
Out[6]: <module 'builtins' (built-in)>
In[7]: __builtins__.__name__
Out[7]: 'builtins'
In[8]: __builtins__.len
Out[8]: <function len>

4voto

Aran-Fey Points 20414

Comme vous pouvez probablement le deviner à partir du __name__ vous accédez au nom de l'objet de l'enquête. builtins module .

Lorsque vous accédez à une variable et que cette variable n'est pas trouvée dans une fermeture, dans la portée locale ou dans la portée globale, la recherche se fait dans les builtins. C'est pourquoi vous pouvez accéder à des choses comme min o max o type même s'il ne s'agit pas de variables globales :

>>> 'min' in globals()                                                                   
False
>>> min
<built-in function min>      
>>> __builtins__.min
<built-in function min>                                                    

La même chose se produit avec __name__ . Au départ, il y a un __name__ définie dans la portée globale :

>>> globals()['__name__']
'__main__'

Mais une fois que ce nom est supprimé avec del __name__ la recherche dans les globales échoue et se reporte sur les builtins - vous vous retrouvez donc avec le nom de l'objet de l'utilisateur. builtins module.

>>> del __name__
>>> __name__
'builtins'
>>> __builtins__.__name__
'builtins'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X