Python中函数参数的有效性检查:每个函数都应该这样做吗?

2024-05-16 02:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

每个Python函数(或方法)都应该检查其参数的有效性吗?在

不仅是类型,而且如果值在有效范围内,尺寸是否符合预期,等等?在

或者只是简单地期望其他函数、程序员等的“成人式”良好行为的函数?只需在docstring中提到预期的内容,并在面向用户的函数中检查用户输入参数的有效性?在

在“private”方法的情况下,我觉得我们不需要检查有效性,但是其他方法/函数呢?在

如果我们对这一点过于严格,并且检查了所有的东西,那么代码中难道不会充满了枯燥的decorator类型的代码吗?可以吗?在


Tags: 方法函数代码类型内容参数尺寸检查用户
3条回答

我见过很多不同的方法。最极端的一个是docstring包含参数类型和范围的正式声明(也包括返回值)。应用程序在运行时根据这些docstring检查参数,如果参数有问题则抛出异常。这是使用元编程实现的,可以在生产运行时禁用。在

它不再是真正的Python,ducktyping也不可能。它更像是一种没有辅助编译器的静态类型语言。你仍然需要等到它在运行时中断。在

我也看到过不做任何检查,只运行全面的单元测试的应用程序。如果他们通过了,我们假设参数也没问题。在

就我个人而言,我也用单元测试来涵盖大多数事情,但在关键部分我使用断言。我还特别注意接收用户输入的方法。在

希望有帮助

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))

如您所见,这两种类型都有效。这是故意的行为。如果遇到了一些没有定义该方法的东西,您将得到^{cd1>}的期望值。解决这一问题的方法是使用异常处理:

^{pr2}$

我个人说了这些,可不总是坚持下去。例如,如果我不能保证对象的类型,那么我将使用^{{cd2>}之类的东西来正确地指导代码。如果不是,那么它将返回^{{cd3>}。

选择哪一个使代码更干净,并适合情况,这取决于您的自由裁量。有一些建议,例如“始终使用try/除了IOErrors”(这一个原因是有原因的)。

我认为这可以应用于一般情况下,而不仅仅是Python,但是我认识的所有人都遵循这样的理念:如果最坏的情况是错误消息,那么假设输入是正确的。
除非您的代码正在运行一个任务,即使您已经尽可能安全地编写它,它仍然可以销毁某些东西,在这种情况下,请始终检查。在

相关问题 更多 >