关于python:何时键入检查函数的参数?

When to type-check a function's arguments?

我在问一些情况,如果将错误类型的参数传递给函数,它可以:

  • 把整件事都炸了。
  • 返回意外结果
  • 无回报
  • 例如,下面的函数期望参数name是一个字符串。它将为所有其他没有startswith方法的类型抛出异常。

    1
    2
    3
    def fruits(name):
        if name.startswith('O'):
            print('Is it Orange?')

    在其他情况下,如果在没有类型检查的情况下执行,函数可能会停止或导致系统损坏。每当有很多函数或带有大量参数的函数时,类型检查就很繁琐,并且使代码不可读。那么,是否有这样做的标准?关于"如何键入检查"-StackExchange上有很多示例,但我找不到适合这样做的任何地方。

    另一个例子是:

    1
    2
    3
    4
    5
    def fruits(names):
        with open('important_file.txt', 'r+') as fil:
            for name in names:
                if name in fil:
                    # Edit the file

    如果名称是字符串,则其中的每个字符都将影响文件的编辑。如果它是任何其他iterable,它提供的每个元素都会影响编辑。这两种方法都可能产生不同的结果。

    那么,我们什么时候应该输入检查参数,而不是?


    我的答案是:这取决于输入来自哪里。

    如果函数是内部调用的类方法或类似的方法,则可以假定输入是有效的,因为您编写了它!

    例如

    1
    2
    3
    4
    5
    6
    7
    8
    def add(x,y):
        return x + y

    def multiply(a,b):
        product = 0
        for i in range(a):
            product = add(product, b)
        return product

    在我的add函数中,我可以检查参数xy是否有+操作符。但是,因为我编写了multiply函数,这是唯一使用add的函数,所以可以安全地假设输入将是int,因为我就是这样编写的。现在,对于您(希望)已经共享了代码的大型代码库,这个论点站在不稳固的基础上,所以您不能确定人们不会滥用您的函数。但这就是为什么你对它们进行了很好的评价来描述所述函数的正确使用。

    如果必须读取文件、获取用户输入等,那么您可能需要先进行一些验证。


    我几乎从不在python中进行类型检查。根据pythonic的哲学,我假设我和其他程序员都是成年人,能够阅读(或者至少是文档)并正确地使用代码。我假设我们在让代码破坏重要的东西之前先测试代码。毕竟,在大多数情况下,如果你做错了什么,你只会看到一个错误,而Python的错误消息在大多数情况下都是非常有用的。

    我有时检查类型的唯一情况是希望函数根据参数的类型表现不同。但尽管有时我觉得必须这样做,但我不认为这是一个好的做法。

    最常见的情况是,当我的函数迭代一个字符串列表时,我担心(或想要)我会意外地得到一个字符串传递给它——这不会一次抛出错误,因为不幸的是,字符串也是一个可重写的。