首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python装饰器检查函数参数?

如何使用Python装饰器检查函数参数?
EN

Stack Overflow用户
提问于 2013-03-08 17:29:50
回答 10查看 49.4K关注 0票数 48

在调用某些函数之前,我想定义一些泛型装饰器来检查参数。

类似于:

代码语言:javascript
复制
@checkArguments(types = ['int', 'float'])
def myFunction(thisVarIsAnInt, thisVarIsAFloat)
    ''' Here my code '''
    pass

边注:

  1. 类型检查只是为了给出一个例子
  2. 我正在使用Python2.7,但是Python3.0也可能很有趣

编辑2021:有趣的是,类型检查并没有从长远来看与类型暗示形象化合作。

EN

Stack Overflow用户

回答已采纳

发布于 2013-03-08 17:49:24

来自函数和方法的装饰器

Python 2

代码语言:javascript
复制
def accepts(*types):
    def check_accepts(f):
        assert len(types) == f.func_code.co_argcount
        def new_f(*args, **kwds):
            for (a, t) in zip(args, types):
                assert isinstance(a, t), \
                       "arg %r does not match %s" % (a,t)
            return f(*args, **kwds)
        new_f.func_name = f.func_name
        return new_f
    return check_accepts

Python 3

在Python3中,func_code已改为__code__func_name已更改为__name__

代码语言:javascript
复制
def accepts(*types):
    def check_accepts(f):
        assert len(types) == f.__code__.co_argcount
        def new_f(*args, **kwds):
            for (a, t) in zip(args, types):
                assert isinstance(a, t), \
                       "arg %r does not match %s" % (a,t)
            return f(*args, **kwds)
        new_f.__name__ = f.__name__
        return new_f
    return check_accepts

用法:

代码语言:javascript
复制
@accepts(int, (int,float))
def func(arg1, arg2):
    return arg1 * arg2

func(3, 2) # -> 6
func('3', 2) # -> AssertionError: arg '3' does not match <type 'int'>

arg2可以是int,也可以是float

票数 53
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15299878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档