【问题标题】:Python circular reference : How do I go about this specific case?Python 循环参考:我该如何处理这个具体案例?
【发布时间】:2015-09-23 08:43:49
【问题描述】:

我正在使用 tornado 和 websockets(sockjs) 并且在处理传入消息时遇到了麻烦,解决了这种特定情况,即循环类引用的情况。这个问题与 websocket 本身无关,而本质上是周期性。

这是定义类Socket 用于处理传入消息的文件,它还定义了需要类Socket 的类Asyncon_message 在收到来自客户端的消息时触发:

from logicmodule import Logic

class Async(object):

    def notify_user(self, *args):
        print("Notifying user!")
        Socket.send_message("ASYNC CALLBACK: notify_user ARGS: {:}\n".format(args))

async = Async()
logic = Logic(async)

class Socket(SockJSConnection):

    clients = set()

    def on_open(self, request):

        print("Opened Connection...")
        self.clients.add(self)

    def send_message(self, message, operation):

        return self.send(json.dumps({
            'operation': operation,
            'data': message,
        }))

    def on_message(self, msg):
        data = json.loads(msg)
        projectData = logic.create_project(data['project_info'])
        self.send_message(projectData, data['operation'])

编辑: 逻辑类实现了一个方法create_project,将async 类作为参数,其方法notify_usercreate_project 方法中被调用。 notify_user 需要 Socket 类的实例,该实例只能在 on_open 方法中的传入消息上创建。该实例将是一个持久连接,消息将通过该连接以notify_user 方法发送回用户。

这可能是一个简单的 hack,但我是 python 新手。如何在必须事先提供给logic 的传入消息上向Async 提供一个Socket 实例?请帮忙,谢谢!

【问题讨论】:

  • 您已经在解决方案中提供了它,有什么问题?
  • @hspandher 他有循环依赖;文件 A 导入 B,文件 B 导入 A
  • 这里的A、B两个模块是什么?我的意思是你还没有描述你在哪里遇到循环依赖问题。
  • Async 是否需要 SocketSocket 的实例?在示例中Socket.send_message() 似乎没有意义,因为send_message() 不是静态/类方法。
  • @dhke 它需要实例,但只能在传入消息上创建实例。我不确定如何在 on_mesage 中实例化 Socket,然后将其交给逻辑。

标签: python circular-dependency


【解决方案1】:

作为避免循环依赖的一般规则,如果文件A 需要来自文件BC,而文件B 需要来自文件AD,则可能属于CD一起放在其他文件中。

虽然,如果A 需要BB 需要A 是这种情况,那么AB 可能都属于同一个模块。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多