代码之家  ›  专栏  ›  技术社区  ›  Dave Vogt

检查两个python函数(或方法)的兼容性

  •  2
  • Dave Vogt  · 技术社区  · 15 年前

    是否有可能检查两个python函数是否可以互换?例如,如果我有

    def foo(a, b):
        pass
    def bar(x, y):
        pass
    def baz(x,y,z):
        pass
    

    我想要个函数 is_compatible(a,b) 当通过foo和bar时返回true,当通过bar和baz时返回false,所以我可以在实际调用它们之前检查它们是否可以互换。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Georg Schölly Crazy Developer    15 年前

    看一看 inspect.getargspec() :

    inspect.getargspec(func)

    得到名字 和函数的默认值 争论。四件事的三元组是 返回: (args、varargs、varkw, 默认值) . args是 参数名(它可以包含嵌套的 列表)。varargs和varkw是 *和**参数的名称或 一个也没有。默认值是默认值的元组 参数值,如果存在 没有默认参数;如果此元组 有n个元素,它们对应于 args中列出的最后n个元素。

    在版本2.6中更改:返回 命名的tuple argspec(args,varargs, 关键字,默认值)。

        2
  •  4
  •   balpha    15 年前

    您将基于什么建立兼容性?参数的数目?python有可变长度的参数列表,所以您永远不知道这两个函数在这个意义上是否兼容。数据类型?python使用duck类型,因此在函数内部使用isInstance测试或类似测试之前,兼容性测试可以基于的数据类型没有约束。

    所以简而言之:不。

    您应该编写好的docstrings,这样您的API的任何用户都知道他给您的函数必须做什么,然后您应该相信您得到的函数的行为是正确的。任何“兼容性”检查要么排除可能有效的函数,要么给您一种错误的感觉,即“一切都是正常的”。

    暴露API的方法是:编写好的文档,这样人们就知道他们需要知道什么,并且相信他们做了正确的事情。在关键位置你仍然可以使用 try: except: 但是,任何人如果因为不喜欢阅读文档而误用了您的API,都不应该被给予错误的安全感。如果有人读过你的文档,并且想以一种完全可以接受的方式使用它,不应该因为他们声明了一个函数的方式而拒绝使用它。