问题与好的和坏的做法有关:
从C编程我习惯在函数的开头检查传递的参数,从而在出现错误时返回错误代码(例如NULL
指针)。
在Python中,会自动引发异常,例如,当传递的Queue
对象为None
或类型错误时,会尝试对此无效队列对象进行操作。像
def foo(queue):
if issubclass(Queue, arg):
raise ...
# ...
或者应该将错误处理留作调用函数的任务,因为那里出了问题?我很想以第一种方式做到这一点,但觉得它可能是错误的。
答案 0 :(得分:1)
选择哪种方式取决于具体情况,应该是所谓合同的一部分,如“按合同设计”。
上面提到的设计方法使用了一个描述函数满足其合同的隐喻。如果调用者传递某些参数,则该函数必须执行并完全返回该约定中指定的内容。
如果调用者没有根据合同传递值,那么返回调用者意外的值或以任何方式失败都不是函数的错(当然,它不能隐藏任何问题)。
创建软件时,其中一项任务是选择正确的“合同”。可以总结与您的问题相对应的两种方法:
1)合同说:尽力而为。这是通常的方式。该功能更小,更快,更通用,因为它可用于未事先计划的情况。它充分利用了Python的鸭子打字。
2)合同规定:不承担任何风险,采取防御措施,验证投入等,因为有充分的理由这样做。
良好的编码实践很简单:知道你的函数的契约,相应的代码,相应地写(至少)文档字符串。
只有了解合同,您才能确信自己已经完成了良好的编程工作。 (这不包括担心可能的“改进”)