每个Python函数(或方法)是否应检查其参数的有效性?
不仅类型,而且值在有效范围内,尺寸是否符合预期等?
或者仅仅具有可以期望其他函数,程序员等“成人式”行为良好的函数?只需在文档字符串中提及期望的内容,然后简单地在面向用户的函数中检查用户输入参数的有效性?
对于“私有”方法,在我看来我们不需要检查有效性,但是其他方法/功能呢?
如果我们对此过于严格并且检查所有内容,那么代码会不会充满无聊的装饰器类型代码?可以吗?
答案 0 :(得分:1)
Python鼓励使用鸭嘴式打字或“更容易要求宽恕而不是允许”(EAFP),这意味着您应该假设自己的论点是正确的,如果不正确,则应适当处理这种情况。
我们假设“如果它走路和说话像鸭子一样,那么它一定是鸭子”。看这里:
class Duck:
def quack(self):
return 'quack!'
class Person:
def quack(self):
return 'Hey there!'
d = Duck()
p = Person()
def make_it_quack(duck):
return duck.quack()
print(make_it_quack(d))
print(make_it_quack(p))
如您所见,这两种类型都可以工作。这是故意的行为。如果遇到未定义该方法的内容,则会得到预期的AttributeError
。解决此问题的方法是使用异常处理:
try:
print(make_it_quack(d))
print(make_it_quack(p))
print(make_it_quack('hello world'))
except AttributeError:
print('object must have a "quack" method')
说了这么多,我个人就不会一直坚持下去。例如,如果我不能保证对象的类型,那么我将使用if isinstance(x, Y)
之类的东西来正确地定向代码。如果不是,则返回到try except
。
由您自行决定选择哪种代码可以使代码更整洁并适合情况。对此有一些建议,例如“始终使用try / IOError除外”(这是背后的原因)。
答案 1 :(得分:0)
我见过很多不同的方法。最极端的是文档字符串包含参数类型和范围的正式声明(还包括返回值)。应用程序会在运行时根据这些文档字符串检查参数,如果它们出了问题,则会引发异常。这是使用元编程实现的,可以在生产运行中禁用。
它不再是真正的Python,也不可能进行鸭嘴打字。它更像是没有帮助编译器的静态类型语言。您仍然必须等到它在运行时中断。
我还看到了不进行任何检查而仅运行全面的单元测试的应用程序。如果通过,则假定参数也可以。
我个人还涉及单元测试的大部分内容,但在关键部分中,我使用断言。我还会特别注意从用户那里接收输入的方法。
希望有帮助
答案 2 :(得分:0)
我认为这可以普遍应用,而不仅限于Python,我认识的所有人始终遵循这样的理念:如果可能发生的最糟糕的情况是错误消息,则假定输入将是正确的。 br /> 除非您的代码正在运行一个任务,即使您已尽可能安全地编写了该任务,它仍然可以破坏某些内容,在这种情况下,请务必进行检查。