2017-10-11 55 views
0

这个问题涉及到好的和坏的做法: 从C编程中,我习惯于在函数的开始处检查传递的参数,从而在出现错误时返回错误代码(例如NULL指针)。Python何时会出现错误?

在Python中,当允许通过的Queue对象是None或错误类型,并且试图对此无效队列对象进行操作时,会自动引发异常。它是很好的做法,检查数据类型提前像

def foo(queue): 
    if issubclass(Queue, arg): 
     raise ... 
    # ... 

还是应该错误处理,而被留下来作为呼叫功能的任务,因为事情是错的呢?我很想用第一种方式去做,但是觉得它可能是错误的。

+1

我认为所有好的功能和模块应该有内置的错误处理方法。 – ShreyasG

+1

除了别的,鸭子打字的重点在于你**不应**测试某物是任何特定类型的子类。如果你需要检查任何东西,你会检查它是否有你需要调用的属性或方法。 –

+1

我认为提早失败对于任何语言都是很好的做法。 – khelwood

回答

1

选择哪种方式取决于具体情况,应该是“设计合同”中所述合同的一部分。

提到的设计方法使用了一个隐喻,表示函数满足其合同。如果调用者通过某些参数,则该函数有义务返回该合同中指定的内容。

如果调用者没有根据契约传递值,那么返回调用者意外的值或以任何方式失败(当然,它不能隐藏任何问题)并不是函数的错误。

创建软件时,其中一项任务是选择正确的“合同”。与你的问题相对应的两种方法可以总结为:

1)合同说:尽你所能。这是通常的方式。该功能更小,更快,更通用,因为它可能适用于未提前计划的情况。它充分利用了Python的鸭子打字功能。

2)合同说:不冒险,防守,验证投入等,因为有充足的理由这样做。

良好的编码习惯很简单:知道你的函数的契约,相应的代码,相应地编写(至少)文档字符串。

只有了解合同的知识,您才能确信自己已经完成了一项好的编程工作。 (这icludes不担心可能的“改进”)

相关问题