EDIT: (edit parce que le sujet de la question a été changé) , je ne recommanderais pas convertir le type de paramètres au moment de l'initialisation. Par exemple:
class PassPredictData:
def __init__(self, rating, name, lat, long, elev):
self.rating = int(rating)
self.name = str(name)
...
À mon avis, Ce type de conversion Implicite est dangereux pour plusieurs raisons.
-
Implicitement convertit le type de paramètre à un autre, sans donner d'avertissement est très trompeur
- Il ne soulève aucune des exceptions si les utilisateurs passent dans les indésirables de type. Cela va de pair avec la conversion implicite. Cela pourrait être évité par l'utilisation explicite de la vérification de type.
- Silencieusement convertir type viole en tapant duck
Au lieu de convertir le type de paramètres, il est préférable de vérifier le type de paramètre au moment de l'initialisation. Cette approche permettrait d'éviter les trois points. Pour ce faire, vous pouvez utiliser le type de vérification à partir d' typedecorator je l'aime parce qu'il est simple et très lisible
Pour Python2 [edit: cette comme une référence en tant que OP demandé]
from typedecorator import params, returns, setup_typecheck, void, typed
class PassPredictData:
@void
@params(self=object, rating = int, name = str, lat = float, long = float, elev = float)
def __init__(self, rating, name, lat, long, elev):
self.rating = rating
self.name = name
self.lat = lat
self.long = long
self.elev = elev
setup_typecheck()
x = PassPredictData(1, "derp" , 6.8 , 9.8, 7.6) #works fine
x1 = PassPredictData(1.8, "derp" , 6.8 , 9.8, 7.6) #TypeError: argument rating = 1.8 doesn't match signature int
x2 = PassPredictData(1, "derp" , "gagaga" , 9.8, 7.6) #TypeError: argument lat = 'gagaga' doesn't match signature float
x3 = PassPredictData(1, 5 , 6.8 , 9.8, 7.6) #TypeError: argument name = 5 doesn't match signature str
Pour Python3 vous pouvez utiliser l' annotation de la syntaxe:
class PassPredictData1:
@typed
def __init__(self : object, rating : int, name : str, lat : float, long : float, elev : float):
self.rating = rating
setup_typecheck()
x = PassPredictData1(1, 5, 4, 9.8, 7.6)
renvoie une erreur:
TypeError: l'argument name = 5 ne correspond pas à la signature str