如何解决python中的循环导入问题?

问题描述

我遇到了一个重要的循环问题,我唯一能解决方法是将import语句从模块顶部移到需要这样的位置:

def serialize_message(message):
    from chat.serializers import MessageSerializer

    serializer = MessageSerializer(
        {
            'pk': message.id,'when': message.created_at,'conversation': message.conversation.id,'object': message
        }
    )

    return serializer.data

这工作正常,但我想知道这是否安全吗?

解决方法

import statement是常规语句,可在允许使用语句的任何地方使用,包括defclass正文。它在全局,函数和类范围内具有相同的行为:如有必要,将加载模块,并且所请求的名称将绑定在当前范围内。

这也意味着在正常情况下,一个模块只能加载一次。重复使用import语句调用函数不会每次都重新加载模块,而是使用先前加载的模块实例。


唯一的限制是在函数和类范围内不允许动态名称绑定。因此,不允许导入*。确保在运行代码之前将其拒绝。

仅在模块级别允许使用通配符导入形式from module import *。尝试在类或函数定义中使用它会引发SyntaxError