在另一个python之后调用一个函数,包装?

时间:2015-08-03 23:13:03

标签: python function wrapper

我有两个功能“a”和“b”。当用户上传文件时,会调用“b”。 “b”重命名文件并返回新文件名。之后,该文件应该被编辑。像这样:

def a():
    edits file
def b():
    renames file  
    return file

因此,如果b发生并结束,则应该发生。一旦“b”返回文件,该功能就结束了,之后没有任何反应。正是在这一点上,我希望“a”发生,这怎么可能?现在我用计时器叫“a”

t=Timer(1.0,a)
t.start() 

但这不是一个好的解决方案。我尝试使用全局变量,但它不起作用。我也试过return file, a()因为我认为可能会开始。最后包装它:

def b():
    global filename
    renames filename
    def a():
         edits filename  
    return filename

有类似if b(): a()的内容吗?

有人提出建议吗?

3 个答案:

答案 0 :(得分:1)

这样做:

def a():
    #your code

def b():
    #your code
    a()

示例:

def first():
    print 'first'

def second():
    print 'second'
    first()

>>> second()
second
first

答案 1 :(得分:1)

听起来你正在寻找由decorators添加的PEP 0318。一些(复杂)示例位于Decorator Library

Data

这将def a(): edits file def call_a_after(f): def decorate(*args, **kwargs): ret = f(*args, **kwargs) a() return ret return decorate @call_a_after def b(): renames file return file 包裹在b()中(装饰器是call_a_after()的语法糖),让你重新装饰或装饰b = call_a_after(b)的内容。

答案 2 :(得分:0)

我找到了类似问题here的解决方案。

使用这种方式,我想您可能想要这样的东西:

def run_before(lastfunc, *args1, **kwargs1):
    def run(func):
        def wrapped_func(*args, **kwargs):
            try:
                result = func(*args, **kwargs)
            except:
                result = None
            finally:
                lastfunc(*args1, **kwargs1)
                return result
        return wrapped_func
    return run

def a():
    edits file

@run_before(a)
def b():
    renames file  
    return file

b()

我认为您希望b在a之前之前运行,这进一步混淆了这个问题。为了获得更合理的流程,我建议在可能的情况下进行切换。

原始解决方案的所有功劳归于agf