J'ai construit un décorateur de vérification de type (avec enveloppes):Python: vérification de type décorateur
def accepts_func(*types):
"""
top-level decoration, consumes parameters
"""
def decorator(func):
"""
actual decorator function, consumes the input function
"""
@wraps(func)
def check_accepts(*args):
"""
actual wrapper which does some magic type-checking
"""
# check if length of args matches length of specified types
assert len(args) == len(types), "{} arguments were passed to func '{}', but only {} " \
"types were passed to decorator '@accepts_func'" \
.format(len(args), func.__name__, len(types))
# check types of arguments
for i, arg, typecheck in izip(range(1, len(args)+1), args, types):
assert isinstance(arg, typecheck), "type checking: argument #{} was expected to be '{}' but is '{}'" \
.format(i, typecheck, type(arg))
return func(*args)
return check_accepts
return decorator
Vous pouvez passer autant de types que vous voulez et il vérifie si les types des paramètres passés à func
correspondance ceux qui ont été « codées en dur » dans @accepts_func(param_type1, param_type2, ...)
:
@accepts_func(int, str)
sample_func(arg1, arg2):
...does something...
Il fonctionne sans aucun problème jusqu'à présent.
Cependant, comme je ne suis pas un « gourou » Python Je voudrais savoir si ma solution est appropriée pour les projets « plus gros »?
Y a-t-il des inconvénients dans ma solution? E.g. comme les problèmes de performance, les erreurs non interceptées dans les cas de bord, et d'autres choses?
Existe-t-il un moyen d'améliorer ma solution? Faire mieux, plus de solutions "pythoniques" existent?
Note: Je ne vérifie pas toutes les fonctions de mon projet, seulement celles qui me semblent avoir vraiment besoin de sécurité. Le projet s'exécute sur un serveur, par conséquent, les erreurs lancées apparaissent dans les journaux et ne sont pas visibles pour l'utilisateur.
N'utilisez pas d'assertions pour du code réel, si votre script est lancé avec python -O, les assertions seront ignorées. Utilisez-les uniquement dans les tests. – user312016
Merci! Que suggérez-vous d'utiliser à la place? Comme la meilleure pratique? – daniel451
Utilisez simplement les instructions if – user312016