如何解决 python 中的循环导入问题?
How to solve circular import problem in python?
我遇到了一个重要的循环问题,我能想到的唯一解决方法是将导入语句从模块顶部移动到需要它的地方,如下所示:
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 是一个常规语句,可以在任何允许语句的地方使用,包括 def
和 class
正文。它在全局、函数和 class 范围内具有相同的行为:必要时加载模块,并将请求的名称绑定在当前范围内。
这也意味着在正常情况下,一个模块只会加载一次。使用 import
语句重复调用函数不会每次都重新加载模块,而是使用之前加载的模块实例。
唯一的限制是函数和 class 范围内不允许动态名称绑定。因此,不允许 *
导入。这保证在 运行 代码之前被拒绝。
The wild card form of import — from module import *
— is only allowed at the module level. Attempting to use it in class or function definitions will raise a SyntaxError
.
我遇到了一个重要的循环问题,我能想到的唯一解决方法是将导入语句从模块顶部移动到需要它的地方,如下所示:
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 是一个常规语句,可以在任何允许语句的地方使用,包括 def
和 class
正文。它在全局、函数和 class 范围内具有相同的行为:必要时加载模块,并将请求的名称绑定在当前范围内。
这也意味着在正常情况下,一个模块只会加载一次。使用 import
语句重复调用函数不会每次都重新加载模块,而是使用之前加载的模块实例。
唯一的限制是函数和 class 范围内不允许动态名称绑定。因此,不允许 *
导入。这保证在 运行 代码之前被拒绝。
The wild card form of import —
from module import *
— is only allowed at the module level. Attempting to use it in class or function definitions will raise aSyntaxError
.