当前位置: 首页 > 面试题库 >

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

范稳
2023-03-14
问题内容

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

就像是:

@checkArguments(types = ['int', 'float'])
def myFunction(thisVarIsAnInt, thisVarIsAFloat)
    ''' Here my code '''
    pass

旁注:

  1. 类型检查只是在这里显示一个示例
  2. 我正在使用Python 2.7,但是Python 3.0也会很有趣

问题答案:

从装饰器的功能和方法:

Python 2

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

在Python 3中func_code已更改为,__code__并且func_name已更改为__name__

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

用法:

@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 可以是intfloat



 类似资料:
  • 主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面

  • 本文向大家介绍python通过装饰器检查函数参数数据类型的方法,包括了python通过装饰器检查函数参数数据类型的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python通过装饰器检查函数参数数据类型的方法。分享给大家供大家参考。具体分析如下: 这段代码定义了一个python装饰器,通过此装饰器可以用来检查指定函数的参数是否是指定的类型,在定义函数时加入此装饰器可以非常清晰的检测函

  • 问题内容: 我在装饰器传递变量时遇到问题。我可以通过以下装饰器语句来做到这一点: 但不幸的是,该声明不起作用。也许也许有更好的方法来解决此问题。 问题答案: 带参数的装饰器的语法有些不同-带参数的装饰器应返回一个函数,该函数将接受一个函数并返回另一个函数。因此,它实际上应该返回一个普通的装饰器。有点混乱吧?我的意思是: 在这里,你可以阅读有关该主题的更多信息-也可以使用可调用对象来实现此目的,这也

  • 问题内容: 假设我有以下几点: 我想测试该功能,而无需经历建立连接的麻烦(或装饰者所做的任何事情)。 给定,我如何从中剥离装饰器并获得基础的“未装饰”功能? 问题答案: 在一般情况下,您不能这样做,因为 相当于 这意味着“原始”垃圾邮件甚至可能不再存在。一个(不太漂亮的)hack是这样的:

  • 问题内容: 我想制作一个可以使用或不使用参数的装饰器: 在我的代码中,只有使用带参数的decorator才有效:如何使两者同时起作用(带有和不带有参数)? 问题答案: 我找到一个示例,您可以使用或:不错!

  • 问题内容: 我想创建一个可以与参数一起使用的Python装饰器: 或不使用它们(例如,默认情况下将输出重定向到stderr): 那有可能吗? 请注意,我并不是在寻找重定向输出问题的其他解决方案,这只是我想要实现的语法的一个示例。 问题答案: 我知道这个问题很旧,但是有些评论是新的,尽管所有可行的解决方案本质上都是相同的,但大多数解决方案都不是很干净也不易于阅读。 就像thobe的回答所说,处理这两