Oui, effectivement, tu ne peux pas empêcher python de n'évaluer le code que lors de l'exécution du code en question, donc vu que la ligne Int.a="toto" ne sera jamais évaluée, cela ne va jamais poser de problème (à condition de remplacer false par False :) )
Ce code ne fait rien d'autre que de créer un objet contenant un nombre arbitraire d'attributs dont le type est vérifié à chaque création/modification.
À noter que self.dict["name"]=value est strictement équivalent à self.name=value. On est juste obligé de passer explicitement par le dict pour éviter les appels récursifs de setattr ...
En bonus, une version améliorée qui ne caste pas, mais teste juste le type (et lève une exception correcte dans tout les cas), et est donc plus stricte.
In[31]:classStrictTyped(object):...:def__init__(self,t):...:self.__dict__["type"]=t...:def__setattr__(self,name,value):...:iftype(value)isself.type:...:self.__dict__[name]=self.type(value)...:else:...:raiseTypeError("'{0}' must be of {1}".format(name,self.type))...:In[32]:SInt=StrictTyped(int)In[33]:SInt.a=1In[34]:SInt.a=1.4---------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)<ipython-input-34-56644a32470c>in<module>()---->1SInt.a=1.4<ipython-input-31-dbe3445a022c>in__setattr__(self,name,value)6self.__dict__[name]=self.type(value)7else:---->8raiseTypeError("'{0}' must be of {1}".format(name,self.type))9TypeError:'a'mustbeof<type'int'>
[^] # Re: Retour sur cpython ?
Posté par THE_ALF_ . En réponse à la dépêche Numba 0.14. Évalué à 2.
Oui, effectivement, tu ne peux pas empêcher python de n'évaluer le code que lors de l'exécution du code en question, donc vu que la ligne Int.a="toto" ne sera jamais évaluée, cela ne va jamais poser de problème (à condition de remplacer false par False :) )
Ce code ne fait rien d'autre que de créer un objet contenant un nombre arbitraire d'attributs dont le type est vérifié à chaque création/modification.
À noter que self.dict["name"]=value est strictement équivalent à self.name=value. On est juste obligé de passer explicitement par le dict pour éviter les appels récursifs de setattr ...
En bonus, une version améliorée qui ne caste pas, mais teste juste le type (et lève une exception correcte dans tout les cas), et est donc plus stricte.