2017-09-19 1 views
1

Supposons que vous ayez une classe personnalisée avec des arguments obligatoires (pour lesquels vous ne pouvez pas fournir de valeur par défaut) et que vous souhaitiez qu'une erreur personnalisée soit déclenchée lorsque ces arguments requis ne sont pas à condition de.Python3: façon correcte de définir une erreur d'initialisation personnalisée

Quelle est la bonne façon pythonique de faire cela?

En ce moment, j'ai quelque chose comme ceci:

class MyClassInitError(Exception): 
    def __init__(self, missing_kwargs): 
     self.message = "Some required key word arguments were not present {missing}".format(missing=missing_kwargs) 

class MyClass(): 
    # required arguments for this class that can not have pre-defined values 
    _required_kwargs = ["arg1", "arg2", "arg3",...] 
    # required arugments for this class that can have pre-defined values 
    _predef_kwargs = {"pre_arg1":1, "pre_arg2":2, ...} 
    def __init__(self, **kwargs): 
     try: 
      # leverage set class to get keys of required args not in the passed kwargs 
      missing_kwargs = list(set(self._required_kwargs)-set(kwargs.keys())) 
      if missing_kwargs: 
       raise MyClassInitError(missing_kwargs) 

      # set defaults for defaults not provided 
      for k, w in self._predef_kwargs.items(): 
       if k not in kwargs.keys(): 
        kwargs[k] = w 
+0

Et est il y a un * problème * avec ça? Si vous voulez des suggestions sur l'amélioration ** du code de travail **, voir [codereview.se]. – jonrsharpe

+0

@jonrsharpe Je ne suis pas habitué à définir mes propres exceptions en python et je ne vois pas comment cela ajouterait autre chose que de simplement déplacer l'instruction print là où j'élève l'erreur et retourner None après ... Je vais vérifier Code Review – SumNeuron

Répondre

3

PEP 3102 syntaxe pour objet d'exiger des arguments de mots clés, donc il n'y a pas besoin d'écrire votre propre code pour faire la validation:

def __init__(self, *, arg1, arg2, arg3, pre_arg1=1, pre_arg2=2): 
    pass # TODO: use the args, no need to check them