Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在python函数/方法上进行多少输入验证?_Python_Validation - Fatal编程技术网

我应该在python函数/方法上进行多少输入验证?

我应该在python函数/方法上进行多少输入验证?,python,validation,Python,Validation,我感兴趣的是人们在编写Python时做了多少前期验证 以下是一些简单函数的示例: def factorial(num): """Computes the factorial of num.""" def isPalindrome(inputStr): """Tests to see if inputStr is the same backwards and forwards.""" def sum(nums): """Same as the built-in sum(

我感兴趣的是人们在编写Python时做了多少前期验证

以下是一些简单函数的示例:

def factorial(num):
    """Computes the factorial of num."""

def isPalindrome(inputStr):
    """Tests to see if inputStr is the same backwards and forwards."""

def sum(nums):
    """Same as the built-in sum()... computes the sum of all the numbers passed in."""
在开始计算之前,您检查输入值的彻底程度如何?您如何进行检查?如果输入错误,是否会引发某种专有异常(例如,在同一模块中定义的BadInputException)?您是否刚开始计算,并认为如果传入错误数据(例如,“asd”到factorial),它会在某个时候抛出异常

当传入的值应该是一个容器时,您是否不仅检查容器,而且检查其中的所有值


对于factorial这样的情况,传入的内容可能会转换为int(例如浮点),但这样做时可能会失去精度?

我基本上会尝试将变量转换为它应该是的值,并在失败时向上传递或抛出相应的异常

def factorial(num):
    """Computes the factorial of num."""
    try:
        num = int(num)
    except ValueError, e:
        print e
    else:
        ...

这完全取决于我在写什么,以及输出是如何到达那里的。Python没有其他OO语言的公共/私有保护。取而代之的是一些惯例。例如,外部代码应该只调用不带下划线前缀的对象方法

因此,如果我正在编写一个模块,我将验证不是从我自己的代码生成的任何内容,即对公共可访问的方法/函数的任何调用。有时,如果我知道验证很昂贵,我会使用kwarg:

def publicly_accessible_function(arg1, validate=False):
  if validate:
    do_validation(arg1)
   do_work

内部方法可以通过语句进行验证,当代码退出开发并投入生产时,可以完全禁用该语句。

我试图编写docstring,说明预期和接受的参数类型,而不是在函数中显式检查它


如果有人想将我的函数用于任何其他类型,他有责任检查他的类型是否足够好地模仿我所接受的类型。也许您的阶乘可以与一些定制的长型类型一起使用,以获得您想不到的结果?或者你的和可以用来连接字符串?为什么要通过类型检查来禁止它?无论如何,它不是C。

I
assert
什么是绝对必要的

重要提示:什么是绝对必要的。有些人过度测试东西

def factorial(num):
    assert int(num)
    assert num > 0
这并不完全正确。长期也是一种法律上的可能性

def factorial(num):
    assert type(num) in ( int, long )
    assert num > 0
更好,但仍不完美。许多Python类型(如rational numbers或类似数字的对象)也可以在良好的阶乘函数中工作。很难断言一个对象具有基本的类似整数的属性,而不太具体,也不考虑将来未考虑的类

我从不为单个函数定义唯一的异常。我为一个重要的模块或包定义了一个唯一的异常。然而,通常只是一个
错误
类或类似的东西。这样,应用程序会显示
,除了somelibrary.Error,e:
,这就是您需要知道的全部内容。细粒度异常会变得繁琐和愚蠢

我从来没有这样做过,但我能看到可能需要这样做的地方

assert all( type(i) in (int,long) for i in someList ) 
但是,一般来说,普通的Python内置类型检查工作正常。他们发现几乎所有的例外情况,几乎所有的时间都很重要。当某个类型不正确时,Python会引发一个TypeError,它总是指向正确的代码行


顺便说一句,如果我绝对确定该功能将被滥用,我只在设计时添加断言。有时,当单元测试以一种模糊的方式失败时,我会添加断言。

对于sum、factorial等计算,python内置的类型检查就可以了。计算将结束对类型的upp调用addmul等,如果它们中断,它们仍将抛出正确的异常。通过强制执行您自己的检查,您可能会使其他工作输入无效。

我几乎从不强制执行任何类型的检查,除非我认为有人可能认为他们可以通过某个X,从而产生完全疯狂的结果


我检查的另一次是,当我为一个参数接受几种类型时,例如,接受列表的函数可能会接受任意对象并将其包装到列表中(如果它还不是列表)。因此,在这种情况下,我检查类型,而不是强制执行任何操作,只是因为我希望函数在使用方式上具有灵活性。

只需检查是否有一个失败的单元测试迫使您执行


也可以考虑“…”这是Python的方式

从另一种语言如何处理它的角度来看,可能会增加一些价值。对于Perl,我记得使用了这个模块,它从开发人员那里卸载了大量的参数验证。我在python中搜索类似的东西时遇到了这样一个问题:我还没有尝试过。但是我想,在整个代码库中验证参数的标准方法会导致在整个团队中预先设置参数验证期望

我不想打印任何东西。要么别管这个异常,要么提出其他问题。print让人困惑。>当某些类型不正确时,Python会引发一个类型错误,该错误总是指向正确的代码行。严格来说,这不是事实。如果您的函数正在对之前设置的某些实例数据执行操作,那么确定该值为什么为错误类型可能非常困难。为什么为错误类型与实际为错误类型不同。如果你的逻辑是扭曲和复杂的,你不能发现变量设置的地方,你需要重新思考你的算法。真正地赋值语句应该是显而易见的。它们有
=
,可以说它们是最重要的语句,因为它们改变了计算的状态。除非您在查找赋值语句时遇到困难,否则我不确定自己是否看到了挑战