在Python中,如何使用参数获得传递给decorator的函数名?

2024-06-09 17:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个decorator,它将验证参数是否存在,并检索被修饰的方法的名称

我可以在函数的第二层访问方法的名称,但不能访问第一层

例如,我有一个装饰师

def p_decorate(name, *a, **k):
    print(name + ' is at object: ')
    print a #I would like to get the method object here
    def fn(*a, **k)
        print a #object prints here instead
    return fn
return p_decorate

我有这个班我想装饰一下

class Person(object):
    @p_decorate('John')
    def get_fullnameobject(self):
        return self.name

我希望它能打印:

John is at object: (<function get_fullnameobject at 0x000000003745A588>,)
(<function get_fullnameobject at 0x000000003745A588>,)

但结果是:

John is at object: ()
(<function get_fullnameobject at 0x000000003745A588>,)

Tags: 方法name名称getreturnhereobjectis
2条回答

您需要另一个嵌套函数来定义接受参数的装饰器

def p_decorate(name):
    def _(f):
        print(name + ' is at object: ')
        print f
        def fn(*a, **k):
            # Do something, but ultimately you probably want to call f
            ...
        return fn
    return _

p_decorate("John")返回实际的decorator,它将get_fullnameobject作为其f参数,并返回要绑定到get_fullnameobject的新fn对象。如果没有decorator语法,用法如下

def get_fullnameobject(self):
    return self.name

get_fullnameobject = p_decorate("John")(get_fullnameobject)

函数p_decorate正被调用,只有参数John*a**k都是空的),因此您将得到a的空元组

需要注意的是,返回的fn可调用函数随后将与get_fullnameobject可调用函数一起调用

更重要的是,您当前的实现是不完整的,因为您永远无法调用需要另一个闭包才能真正实现的方法

相关问题 更多 >