为实现未决但未计划抽象的方法引发NotImplementedError是常规的吗?


34

我喜欢为NotImplementedError我想实现的任何方法提出一个,但是我还没有去做。我可能已经有了部分实现,但是raise NotImplementedError()由于我还不喜欢它而在它前面加上了它。另一方面,我也喜欢遵守约定,因为这将使其他人更容易维护我的代码,并且约定可能存在是有充分理由的。

但是,NotImplementedError的Python文档指出:

此异常派生自RuntimeError。在用户定义的基类中,抽象方法要求派生类重写该方法时,应引发此异常。

这是比我描述的更为具体的正式用例。提出一个NotImplementedError简单的方法来简单地指出API的这一部分是否还在进行中,这是一种很好的传统样式吗?如果不是,是否有另一种标准化的方式表明这一点?


“适当”是什么意思?
罗伯特·哈维2014年

1
@RobertHarvey我想我的意思是遵循常规用法。我现在改过我的问题。
格里特

1
我们主要在这里使用C#,但是这种异常抛出在这里是惯用的,我希望在其他地方也可以。尽早休息并大声休息是快速识别潜在问题的良好指南(阅读:便宜)。
Telastyn 2014年

通常,如果我要创建一个类,我只是将TODO注释放入未实现的方法中,直到我开始实现该功能为止。如果要在该类发生之前将该类发布到生产环境中,我将考虑引发异常。

5
对于它的价值,这是当您使用IDE“实现接口”时,Microsoft Visual Studio默认情况下所做的事情。在罗伯特·哈维(Robert Harvey)说时,结果是众所周知的。
catfood

Answers:


34

值得注意的是,尽管Python文档为该异常提供了一个用例(可能是规范的用例),但并未特别排除在其他情况下的使用。

如果您尚未在基类中重写方法(以满足“接口”),我认为引发NotImplementedError异常是适当的。

粗略检查一下Google,如果您以这种方式使用异常,人们会理解您的意思。我知道没有任何副作用或意外后果;如果该方法被调用,它将简单地引发一个异常,并且它将引发一个每个人都容易理解的异常。


Python 3 的文档反映了这种确切用法:

在用户定义的基类中,当抽象方法要求派生类覆盖该方法时,或者在开发该类以指示仍需要添加实际实现时,应引发此异常。[增加重点]


+1,但我还要补充一点,对于这种约定,少量的文档可以大有帮助。就像开发Wiki中的单行注释,回购自述文件或样式指南(类似的东西)一样,解释了此异常的用途。
Ben Lee

8

可以理解,无论您是否这样做,都应取决于当地(团队或公司)的惯例。请注意,在TDD的上下文中它意义不大,因为TEST应该是确定未实现该方法的原因。

简短的版本是:如果您和您的团队认为合适,请使用。


5
FWIW,如果出于某种原因需要强制执行该行为,则引发异常应该是使测试失败的好方法。(例如,作为方法定义智能感知存根的一部分很有用。)
DougM 2014年

1

似乎NotImplementedError通常是针对Python功能开发本身提出的,如下所示:

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

记录

fromkeys(可迭代)

计数器对象未实现此类方法。

资源

Collections.Counter.fromkeys

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.