我有两个功能“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()
的内容吗?
有人提出建议吗?
答案 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。