何时输入 - 检查函数的参数?

时间:2014-10-05 15:30:15

标签: python

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

  1. 炸掉整个东西。
  2. 返回意外结果
  3. 什么都不返回
  4. 例如,下面的函数要求参数name是一个字符串。它会为没有startswith方法的所有其他类型抛出异常。

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

    如果执行没有进行类型检查,则还有其他情况下函数可能会停止或导致系统损坏。每当有许多带有大量参数的函数或函数时,类型检查都很繁琐,并且使代码不可读。那么,有这样做的标准吗?至于“如何键入检查” - stackexchange上有很多例子,但我找不到任何关于它的适当位置。

    另一个例子是:

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

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

    那么,什么时候我们应该输入 - 检查一个参数,不应该吗?

2 个答案:

答案 0 :(得分:0)

我头脑中的答案是:它取决于输入的来源。

如果函数是内部调用的类方法或类似的东西,你可以假设输入是有效的,因为你写了它!

例如

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函数中,我可以检查参数+x是否有y运算符。但是由于我编写了multiply函数,并且这是唯一使用add的函数,因此可以安全地假设输入为int,因为我是如何编写它的。现在,这个论点对于大型代码库来说是不稳定的,在那里你(希望)有共享代码,所以你不能确定人们不会滥用你的功能。但这就是为什么你很好地评论它们来描述正确使用所述功能的原因。

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

答案 1 :(得分:-1)

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

我有时检查类型的唯一情况是我希望我的函数根据参数的类型而表现不同。但是,虽然我有时觉得有必要这样做,但我认为这不是一个好习惯。

大多数情况下,当我的函数迭代一个字符串列表并且我担心(或者想要)我可能会意外地将一个字符串传递给它时,会发生这种情况 - 这不会立即引发错误,因为不幸的是字符串是也是可迭代的。