又是一个话题,但我不太明白...... 我有一个应用程序(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)
所以我的问题是为什么我仍然收到此错误?
您的
constants
模块没有理由导入任何其他模块AFAICT。通过导入 functions
(它本身依赖于 constants
中定义的常量来定义它提供的某些函数的默认值),最终会创建一个循环导入。
如果
constants
模块被制作成包中的叶模块(由其他模块导入,但本身不从包中的其他模块导入任何内容),那么您的问题应该消失。您仍然会涉及一些循环导入(例如,api
导入functions
,反之亦然),但只要它们都不需要它们在导入时导入的模块中的任何内容,就应该没问题。