• [^] # Re: Retour sur cpython ?

    Posté par . 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.

    In [31]: class StrictTyped(object):
     ...: def __init__(self, t):
     ...: self.__dict__["type"] = t
     ...: def __setattr__(self, name, value):
     ...: if type(value) is self.type:
     ...: self.__dict__[name] = self.type(value)
     ...: else:
     ...: raise TypeError("'{0}' must be of {1}".format(name,self.type))
     ...: 
    In [32]: SInt = StrictTyped(int)
    In [33]: SInt.a = 1
    In [34]: SInt.a = 1.4
    ---------------------------------------------------------------------------
    TypeError Traceback (most recent call last)
    <ipython-input-34-56644a32470c> in <module>()
    ----> 1 SInt.a = 1.4
    <ipython-input-31-dbe3445a022c> in __setattr__(self, name, value)
     6 self.__dict__[name] = self.type(value)
     7 else:
    ----> 8 raise TypeError("'{0}' must be of {1}".format(name,self.type))
     9 
    TypeError: 'a' must be of <type 'int'>