Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Python Decorator在导入时不运行_Python - Fatal编程技术网

如何使Python Decorator在导入时不运行

如何使Python Decorator在导入时不运行,python,Python,我用Python修饰了一个方法。当我导入包含该方法的模块时,decorator将自动运行 我意识到这就是装饰器的制作方法,但是有没有办法让装饰器不这样做呢?使用 if __name__ == "__main__": #code 在文件中,代码都在方法或类(导入时运行)之外。听起来您要做的是选择在运行时应用什么装饰程序。类似的方法可能会奏效: to_decorate = [] def decorate_later(func): to_decorate.append(func)

我用Python修饰了一个方法。当我导入包含该方法的模块时,decorator将自动运行

我意识到这就是装饰器的制作方法,但是有没有办法让装饰器不这样做呢?

使用

 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
所做的任何事情都将不可用。您可以将其放入函数中,使其可用。如果可以选择重写模块,则可以删除装饰器。