在功能启动时检查类型功能

时间:2014-10-20 22:58:39

标签: python python-2.7 typechecking

我正在编写一组内部使用的python模块。我正在让用户传递所需的微妙不同参数类型的问题。

例如,如果某些东西需要列表列表,并且给出了一个元组列表,它可能大部分时间都可以工作,直到函数尝试分配给它希望成为列表的元素。

我遇到的问题是,有时需要很长时间才能使功能达到事情开始出错的程度,并且当它们完成所有操作时,必须从头开始重新启动。

我如何测试以查看x[0][0]=nullx.myfunc(a,b)之类的内容是否有效

  1. 很贵
  2. 有副作用,如上所述
  3. 让它快速失败(如果失败)。

    请注意,我希望保留代码的鸭子类型,因此isinstance()和代码不起作用(或者至少我不知道如何)

1 个答案:

答案 0 :(得分:0)

鸭子打字并不一定意味着如果它像鸭子一样走路,就像鸭子一样对待它,然后检查它是否嘎嘎叫。这样做通常很好,但在你的情况下不会以足够快的速度失败。

如果你写了foo,那么也写foo_check,它接受​​与foo相同的参数,但只检查参数,做的很少,并试图保持不变。尝试使其如果foo崩溃,那么foo_check也会崩溃。让foo_check执行以下操作:

temp = x[0][0]
x[0][0] = temp
x[0].append('xxx')
x[0].pop()

基本上,无论foo在语法上如何处理参数,foo_check都应该执行一次(如果合适,再次撤消)。您可能需要检查对象是字符串还是列表。要做到这一点,做任何foo如果给出错误的类型会崩溃。

如果您的foo拨打了bar,请foo_check拨打bar_check。将foo重命名为foo_optimized,并为您的用户提供新的foo,只需拨打foo_checkfoo_optimized

输入您的文档,例如"您的对象x应该有一个方法myfunc采用两个参数,当被称为x.myfunc(-1, [])时,它们将无误地运行但不执行任何操作。"尝试选择null参数,以便大多数用户可以自然地提供以这种方式工作的函数。然后,您的foo_check可以调用x.myfunc(-1, []),这样您至少可以知道x.myfunc在使用两个参数调用时是否可以编译。