如何在python中轻松处理动态装饰器?

2024-10-03 06:31:16 发布

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

假设我有以下设置(简化):

^{1}$

我现在想将这两个函数test_connectOnetest_ConnectTwo移动到单独的模块中。我在考虑为每个模块创建两个类,并使函数保持静态,如下所示:

^{pr2}$

但是我遇到了麻烦。我现在必须以某种方式将socketio对象放入类中(例如,通过一个简单的setter和一个静态变量相结合)。但是我想注释socketio.on()将在模块ModuleOne导入到其他地方时触发,然后我才能设置任何变量。在

我怎样才能解决这个问题?(我也愿意接受完全不同方向的解决方案。)


Tags: 模块对象函数teston地方方式静态
1条回答
网友
1楼 · 发布于 2024-10-03 06:31:16

您有两种选择:

  1. socketio对象导入到放置视图的单独模块中。只要在创建socketio对象之后导入该模块。因此,在你的main模块中,你有:

    from flask import Flask
    from flask.ext.socketio import SocketIO, emit, send
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
    import socket_views
    
    if __name__ == '__main__':
        socketio.run(app)
    

    socket_views.py中,你有:

    ^{pr2}$

    请参阅烧瓶文档的Larger Application一章;特别是循环导入部分。

  2. “手动”应用@socketio.on()修饰符;@expression语法只是将可调用应用于函数的语法糖。由于@socketio.on()decorator only注册,您可以简单地将视图作为常规的、未修饰的函数放入单独的模块中,然后在导入后注册它们:

    from socket_views import test_connectOne, test_connectTwo
    
    socketio.on('connect', namespace='/namespaceOne')(test_connectOne)
    socketio.on('connect', namespace='/namespaceTwo')(test_connectTwo)
    

相关问题 更多 >