免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2402 | 回复: 0
打印 上一主题 下一主题

Python函数的类型检查 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-14 03:37 |只看该作者 |倒序浏览
    Python是一种非常动态的语言,函数定义中完全没有类型约束。这一点很多来自强约束语言,比如Java的朋友都很不适应。其实个人觉得这件事好坏并不绝对。但是,如果非要给Python的函数也加上参数类型约束,并非不可能——最多付出一些性能上的代价,没有免费的午餐嘛。
    这个方法并不神秘,只是利用了Python的函数修饰。也未必有多大意义——对于我个人,需要强类型约束的话,我可能更倾向于写一个C++扩展。只是一个小小的技巧练习:
class ArgsChecker(object):    "Decorator for function arguments's type checker"    def __init__(self, *types):        self.args_types = types
    def __call__(self, fun):        def foo(*args):            if len(args) != len(self.args_types):                raise TypeError("The function need %s arguments."%len(self.args_types))            for arg, ty in zip(args, self.args_types):                if type(arg) != ty and (not issubclass(type(arg), ty)):                    raise TypeError("The argument must be %s."%ty)            return fun(*args)        return foo使用起来很简单:
>>> pfoo("abc")abc>>> pfoo(23)Traceback (most recent call last):  File "", line 1, in     pfoo(23)  File "F:\source\tools\Utils.py", line 14, in foo    raise TypeError("The argument must be %s."%ty)TypeError: The argument must be .
    甚至,int和Long也是不兼容的:
>>> @ArgsChecker(int, int)def add(x, y):    return x + y
>>> add(12432, 23)12455>>> add(123L, 23)Traceback (most recent call last):  File "", line 1, in     add(123L, 23)  File "F:\source\tools\Utils.py", line 14, in foo    raise TypeError("The argument must be %s."%ty)TypeError: The argument must be .
    当然,如果要将其用在实际应用,还有很多可以扩展的地方,比如设定错误和警告级别(例如上例中的Long与Int之间的兼容),可选类型,可变参数列等,这就有待于有兴趣的朋友发掘了。据说Python的后继版本将会引入类型约束。不知道会是什么样子。在我看来,Python的动态能力是非常可贵的,类型约束应该尽可能以不影响动态能力为前提,个人认为Haskell的类型约束就做得很漂亮。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/29309/showart_231691.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP