不带重复语句的依赖关系修饰符

2024-05-28 21:16:11 发布

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

在下面的代码中,我编写了depends decorator,它只是将一些函数作为参数,并在调用修饰函数之前调用它们。因此,当我使用这个脚本时,我可以输出:

using f
using g
using f
using h

但现在我的问题来了。如何做到不重复依赖?所以当我使用h()时,f()只会被调用一次?我试图删除functs中的重复项,但例如对于h(),它包含wapper和f()。我应该用其他方式收集吗?在

^{pr2}$

Tags: 函数代码脚本参数方式decoratorusingdepends
3条回答

您需要全局记住已处理的依赖关系,例如在类变量中,请参见depends.done此处:

class depends(object):
    done = []
    def __init__(self, *f):
        self.functs = f

    def __call__(self, fun):
        def wrapper():
            for i in self.functs:
                if i not in depends.done:
                    i() 
                    depends.done.append(i)

            return fun()
        return wrapper

def f():
    print 'using f'

@depends(f)
def g():
    print 'using g'

@depends(g, f)
def h():
    print 'using h'

h()

您需要检查是否有任何依赖函数是以这种方式修饰的,并从当前修饰函数的依赖项中排除它们的依赖项。在

此检查需要递归执行。在

如果你同时使用其他的装饰器,这会变得更加困难。在

我真的很想知道为什么以及如何使用这个结构。在

Python已经在其super调用机制中内置了类似这样的东西。但是,要利用super,必须将依赖项转换为基类:

def depends(*deps):
    def deco(func):
        def __new__(self):
            super(Dependency, self).__new__(self)
            return func()
        Dependency = type('Dependency', deps, {'__new__': __new__})
        return Dependency
    return deco


@depends(object)
def f():
    print 'using f'


@depends(f)
def g():
    print 'using g'


@depends(g, f)
def h():
    print 'using h'

h()
# using f
# using g
# using h

相关问题 更多 >

    热门问题