219 votes

Lors de l'utilisation de "lever NotImplementedError'?

Est-ce pour se souvenir de vous et de votre équipe pour mettre en œuvre la classe correctement? Je ne suis pas entièrement d'obtenir l'utilisation d'une classe abstraite comme ceci:

class RectangularRoom(object):
    def __init__(self, width, height):
        raise NotImplementedError

    def cleanTileAtPosition(self, pos):
        raise NotImplementedError

    def isTileCleaned(self, m, n):
        raise NotImplementedError

161voto

Uriel Points 10724

Comme les états de documentation [docs],

Définis par l'utilisateur de la base de classes, de méthodes abstraites devrait soulever cette exception lorsqu'elles ont besoin de classes dérivées pour remplacer la méthode, ou alors que la classe est en train d'être développés pour indiquer que la véritable mise en œuvre doit encore être ajoutés.

Notez que bien que le principal déclaré de cas d'utilisation de cette erreur est l'indication des méthodes abstraites qui doivent être mises en œuvre sur les classes héritées, vous pouvez l'utiliser de toute façon vous le souhaitez, comme pour l'indication d'un TODO marqueur.

86voto

Jérôme Points 4207

Comme Uriel dit, il est destiné pour une méthode dans une classe abstraite qui doit être mis en œuvre dans la classe enfant, mais peut être utilisé pour indiquer des choses à faire aussi bien.

Il est une alternative pour le premier cas d'utilisation: les Classes de Base Abstraites. Ces aider à la création de classes abstraites.

Voici un Python 3 exemple:

class C(abc.ABC):
    @abstractmethod
    def my_abstract_method(self, ...):
    ...

Lors de l'instanciation C, vous obtiendrez une erreur, car my_abstract_method est abstrait. Vous avez besoin pour mettre en œuvre dans une classe enfant.

TypeError: Can't instantiate abstract class C with abstract methods my_abstract_method

Sous-classe C et de mettre en oeuvre my_abstract_method.

class D(C):
    def my_abstract_method(self, ...):
    ...

Maintenant, vous pouvez instancier D.

C.my_abstract_method ne doit pas être vide. Il peut être appelé à partir d' D l'aide super().

Un avantage de cela plus de NotImplementedError est que vous obtenez un explicite Exception lors de l'instanciation du temps, pas à l'appel de la méthode du temps.

38voto

TemporalWolf Points 4899

Considérez si c'était plutôt:

class RectangularRoom(object):
    def __init__(self, width, height):
        pass

    def cleanTileAtPosition(self, pos):
        pass

    def isTileCleaned(self, m, n):
        pass

et vous sous-classe et d'oublier de le dire combien de isTileCleaned() ou, peut-être plus probable, faute de frappe comme isTileCLeaned(). Ensuite, dans votre code, vous obtiendrez un None quand vous l'appelez.

  • Vous obtenez les substituée la fonction que vous vouliez? Certainement pas.
  • Est - None valable de sortie? Qui sait.
  • C'est que l'intention de comportement? Presque certainement pas.
  • Vous obtenez un message d'erreur? Il dépend.

raise NotImplmentedError des forces à mettre en œuvre, car il va générer une exception lorsque vous essayez de l'exécuter jusqu'à ce que vous le faites. Cela enlève beaucoup de silence erreurs. Il est similaire à la pourquoi un nu à l'exception de est presque jamais une bonne idée: parce que les gens font des erreurs et cela permet de s'assurer qu'ils ne sont pas balayés sous le tapis.

Remarque: l'Utilisation d'une classe de base abstraite, comme d'autres réponses ont mentionné, est encore mieux, car les erreurs sont en préalimentation et le programme ne fonctionnera pas jusqu'à ce que vous les mettre en œuvre (avec NotImplementedError, il suffira de lever une exception si les appelle en fait).

-4voto

Simeon Aleksov Points 760

Vous pourriez vous utilisez l' @property décorateur,

>>> class Foo():
...     @property
...     def todo(self):
...             raise NotImplementedError("To be implemented")
... 
>>> f = Foo()
>>> f.todo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in todo
NotImplementedError: To be implemented

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X