如何使Python Decorator在导入时不运行
我用Python修饰了一个方法。当我导入包含该方法的模块时,decorator将自动运行 我意识到这就是装饰器的制作方法,但是有没有办法让装饰器不这样做呢?使用如何使Python Decorator在导入时不运行,python,Python,我用Python修饰了一个方法。当我导入包含该方法的模块时,decorator将自动运行 我意识到这就是装饰器的制作方法,但是有没有办法让装饰器不这样做呢?使用 if __name__ == "__main__": #code 在文件中,代码都在方法或类(导入时运行)之外。听起来您要做的是选择在运行时应用什么装饰程序。类似的方法可能会奏效: to_decorate = [] def decorate_later(func): to_decorate.append(func)
if __name__ == "__main__":
#code
在文件中,代码都在方法或类(导入时运行)之外。听起来您要做的是选择在运行时应用什么装饰程序。类似的方法可能会奏效:
to_decorate = []
def decorate_later(func):
to_decorate.append(func)
return func
@decorate_later
def do_stuff(*args, **kw):
print('I am doing stuff')
@decorate_later
def do_more_stuff(*args, **kw):
print('Even more stuff')
def apply_decorator(decorator):
for func in to_decorate:
globals()[func.func_name] = decorator(func)
然后您可以导入模块,所有功能都将被定义为正常decoration_later
返回未修改的原始函数。您可以调用apply_decorator()
将指定的decorator应用于模块中以后由@decorator\u注册的所有函数
这正是库所做的;您可以根据装饰器的API定义装饰器,但实际行为不会触发,直到您对包含的模块或包进行“扫描”
你甚至不需要一个全局应用程序对象来使用金星装饰器;您可以将app对象作为扫描的一部分传入,并将其传递给decorator实现。因此,例如,只需进行一次以上的扫描,就可以在多个所有者之间使用一个装饰器共享相同的功能
这是Pyramid web框架用于事件注册的功能,因此仅导入模块并不需要应用程序实例。一个很好的例子是它们的。否。第一次导入模块时,模块中的代码将被执行-句号。一些代码如何?您试图解决的问题是什么?如果在导入模块之前定义了decorator,您可以对decorator进行修补,以使用identity函数替换它,这可能会导致不运行decorator
decorator=lambda f:f
;你能告诉我们你真正的问题是什么吗?这不是真正的问题。我正在制作一个API,我希望我的所有函数都围绕着另一个函数包装,这个函数是我API中所有函数的处理程序。最终,它看起来更好。但请注意,当您导入模块时,#code
所做的任何事情都将不可用。您可以将其放入函数中,使其可用。如果可以选择重写模块,则可以删除装饰器。