尝试摆脱循环Python依赖

问题描述 投票:0回答:1

又是一个话题,但我不太明白...... 我有一个应用程序(telegram python bot),里面有很多常量,所以我在这里做了一些结构:

bot/
    api.py
    bot.py
    constants.py
    functions.py
    keyboards.py

主要执行文件为:

bot.py

以下是从这些文件中导入的内容:

# bot.py

import os, logging, re
import constants as c
from telegram import Update
from telegram.ext import filters, ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, ConversationHandler, CallbackQueryHandler
from keyboards import START_KEYBOARD, INFO_KEYBOARD, SETTINGS_KEYBOARD, PUNCH_KEYBOARD
import api as a
import functions as f
# api.py

import requests, openai
import constants as c
import functions as f
# constants.py

import os
import datetime as d
import functions as f
# functions.py

import api as a
import constants as c
from typing import Literal
from datetime import datetime
from telegram import Update
# keyboards.py

from telegram import ReplyKeyboardMarkup, InlineKeyboardMarkup, InlineKeyboardButton
import constants as c
bot_1  | Traceback (most recent call last):
bot_1  |   File "/opt/app/bot.py", line 2, in <module>
bot_1  |     import constants as c
bot_1  |   File "/opt/app/constants.py", line 3, in <module>
bot_1  |     import functions as f
bot_1  |   File "/opt/app/functions.py", line 1, in <module>
bot_1  |     import api as a
bot_1  |   File "/opt/app/api.py", line 58, in <module>
bot_1  |     def req_tes_headers(host=c.TES_OAUTH_HOST ,token=''):
bot_1  |                              ^^^^^^^^^^^^^^^^
bot_1  | AttributeError: partially initialized module 'constants' has no attribute 'TES_OAUTH_HOST' (most likely due to a circular import)

所以我的问题是为什么我仍然收到此错误?

python python-3.x circular-dependency
1个回答
0
投票

您的

constants
模块没有理由导入任何其他模块AFAICT。通过导入
functions
(它本身依赖于
constants
中定义的常量来定义它提供的某些函数的默认值),最终会创建一个循环导入。

如果

constants
模块被制作成包中的叶模块(由其他模块导入,但本身不从包中的其他模块导入任何内容),那么您的问题应该消失。您仍然会涉及一些循环导入(例如,api导入
functions
,反之亦然),但只要它们都不需要它们在导入时
导入的模块中的任何内容,就应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.