包是否在init.py中“看到”自己?

2024-05-23 17:28:43 发布

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

我有一个flask应用程序,其根文件夹名为project_folder。你知道吗

project_folder包的__init__.py文件中的代码段:

@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return project_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

from project_folder.Controller.root import root
from project_folder.Controller import auth_controller
from project_folder.Controller import item_controller

现在有趣的是,project_folder包本身自然有其他更小的包,我正在导入这些包以使用它们(本例中的REST资源)。这是最后3行,到目前为止没有任何错误。你知道吗

但是,如果您看一下带注释的函数(在本例中,它总是在使用某种JWT令牌之前运行),我将返回一些内部包的函数。现在,当逻辑真正运行此部分时,代码将中断:

PROJECT_ROUTE\project_folder\__init__.py", line 38, in check_if_token_in_blacklist
    return project_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)
NameError: name 'project_folder' is not defined

想了想,似乎可以理解。从project_folder导入会从包的__init__.py文件导入,该文件是解释器当前的实际文件。所以从

return project_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)

return Model.RevokedTokenModel.is_jti_blacklisted(jti)

不再抛出错误。你知道吗

问题是:为什么这只是回调函数内部的问题,而不是最后3个导入的问题?你知道吗


Tags: 文件infrompyprojecttokenmodelreturn
1条回答
网友
1楼 · 发布于 2024-05-23 17:28:43

这与python中的循环导入有关。循环导入是循环依赖的一种形式,在模块导入级别创建。你知道吗

工作原理:

当您启动应用程序时,python会保存一个寄存器(一种表),在其中记录所有导入的模块。当您在代码中的某个地方调用模块时,python将在其注册表中看到它是否已经注册,并从那里加载它。您可以通过sys.module访问这个注册表,它实际上是一个dictionary,包含自Python启动以来导入的所有模块。你知道吗

使用示例:

>>> import sys
>>> print('\n'.join(sys.modules.keys()))

因此,由于Python是一种解释语言,所以代码的读取和执行是从上到下逐行进行的。你知道吗

在代码中,将导入放在__init__.py文件的底部。你知道吗

在浏览时,当python到达第return project_folder.Model.RevokedTokenModel.is_jti_blacklisted(jti)行时,它将查看模块是否存在于其寄存器中。这显然还不是事实。这就是他提出NameError: name 'project_folder' is not defined异常的原因。你知道吗

相关问题 更多 >