本文实例讲述了python通过装饰器检查函数参数数据类型的方法。分享给大家供大家参考。具体分析如下:
这段代码定义了一个python装饰器,通过此装饰器可以用来检查指定函数的参数是否是指定的类型,在定义函数时加入此装饰器可以非常清晰的检测函数参数的类型,非常方便
def accepts(exception,**types): def check_accepts(f): assert len(types) == f.func_code.co_argcount, \ 'accept number of arguments not equal with function number of arguments in "%s"' % f.func_name def new_f(*args, **kwds): for i,v in enumerate(args): if types.has_key(f.func_code.co_varnames[i]) and \ not isinstance(v, types[f.func_code.co_varnames[i]]): raise exception("arg '%s'=%r does not match %s" % \ (f.func_code.co_varnames[i],v,types[f.func_code.co_varnames[i]])) del types[f.func_code.co_varnames[i]] for k,v in kwds.iteritems(): if types.has_key(k) and not isinstance(v, types[k]): raise exception("arg '%s'=%r does not match %s" % \ (k,v,types[k])) return f(*args, **kwds) new_f.func_name = f.func_name return new_f return check_accepts def exmaple(): @accepts(Exception,a=int,b=list,c=(str,unicode)) def test(a,b=None,c=None) print 'ok' test(13,c=[],b='df')
希望本文所述对大家的Python程序设计有所帮助。
问题内容: 我想定义一些通用装饰器,以在调用某些函数之前检查参数。 就像是: 旁注: 类型检查只是在这里显示一个示例 我正在使用Python 2.7,但是Python 3.0也会很有趣 问题答案: 从装饰器的功能和方法: Python 2 Python 3 在Python 3中已更改为,并且已更改为。 用法: 可以是或
问题内容: 我已经看到许多Python装饰器的示例,它们是: 函数样式修饰符(包装函数) 类风格装饰(实施,和) 不带参数的装饰器 带参数的装饰器 “方法友好”的装饰器(即可以装饰类中的方法) “功能友好”的装饰器(可以装饰普通功能 可以装饰方法和功能的装饰器 但是我从未见过一个可以完成上述所有操作的示例,而且我无法从各种答案到特定问题,这个或这个上看到过,如何结合以上所有内容。 我想要的是一个
主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面
问题 作为某种编程规约,你想在对函数参数进行强制类型检查。 解决方案 在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: >>> @typeassert(int, int) ... def add(x, y): ... return x + y ... >>> >>> add(2, 3) 5 >>> add(2, 'hello') Traceback (most
问题内容: 我在装饰器传递变量时遇到问题。我可以通过以下装饰器语句来做到这一点: 但不幸的是,该声明不起作用。也许也许有更好的方法来解决此问题。 问题答案: 带参数的装饰器的语法有些不同-带参数的装饰器应返回一个函数,该函数将接受一个函数并返回另一个函数。因此,它实际上应该返回一个普通的装饰器。有点混乱吧?我的意思是: 在这里,你可以阅读有关该主题的更多信息-也可以使用可调用对象来实现此目的,这也
问题内容: 我知道,在Python中通常不赞成使用类型检查函数参数,但我认为这样做很有意义。 在我的项目中,我有一个抽象基类和一个子类,该子类具有更多功能,例如旋转,幅度变化等。数字的列表和元组也将返回True,因为我也有许多接受这些Coord类型作为参数的函数和方法。 。我已经设置了装饰器来检查这些方法的参数。这是一个简化的版本: 这个版本非常简单,仍然有一些错误。只是为了说明这一点。它的用法如