【问题标题】:How to shorten similar Python imports using (say) importlib magic methods?如何使用(比如说)importlib 魔术方法来缩短类似的 Python 导入?
【发布时间】:2022-11-11 11:26:10
【问题描述】:

我有一个用于 Python 中的 Digital-Assistant 程序的重型个人软件包。
为了在同一个库的其他子包中使用多个文件,我必须在 import 语句中导入许多具有相同初始路径的文件,这看起来很多余。

例如。

from mylibs.master_lib.digital_assistant.web_bots.google_bot import searchGoogle
from mylibs.master_lib.digital_assistant.web_bots.social_media_connect import wa_pag
from mylibs.master_lib.digital_assistant.languages import access_dictionary
from mylibs.master_lib.digital_assistant.digital_assistant import speech_to_text
from mylibs.master_lib.digital_assistant.user_interface import *
from mylibs.master_lib.digital_assistant.web_bots.social_media_connect import *
from mylibs.master_lib.data_science.data_analytics import *
from mylibs.master_lib.digital_assistant.webAppsOC import *
from mylibs.master_lib.digital_assistant.device_controller import *
from mylibs.master_lib.digital_assistant.computer_graphics import *
from mylibs.master_lib.digital_assistant.desktopAppsFiles import *

如果你看到,声明'mylibs.master_lib.digital_assistant' 在许多导入之间很常见,当我们从大型库中导入东西时也是如此姜戈,张量流, ETC。

我想知道是否有一种方法可以为那些相同的大路径取一个替代的小名称。

我想给库起短名称不是一种选择,因为很明显所有重包都遵循详细的命名法。

解决方案可能在 importlib 函数中。

【问题讨论】:

  • 拥有如此深度嵌套的包树在 Python 中并不常见。我希望digital_assistant 是一个顶级包。
  • 其实这里的场景不一样,包里面也有AI的东西,是AI数字助手项目的一部分,digital_assistant子包只是其中的一部分

标签: python python-3.x import


【解决方案1】:

根据COCOMO Model,这些情况发生在Semi-DetachedEmbedded等大型项目类型的项目中

方法一

利用exec函数、f-stringsfor loop来实现

这种方法在大量导入且不希望保持可读性的情况下很有用

for module in ["web_bots.google_bot import searchgoogle", "web_bots.social_media_connect import wa_pag", "languages import access_dictionary", "digital_assistant import speech_to_text","user_interface import *", "web_bots.social_media_connect import *", "webappsopenclose import *"]:
    exec(f"from mylibs.master_lib.digital_assistant.{module}")

for module in [".data_science.data_analytics import *", ".device_controller import *", ".artificial_intelligence.cv.computer_graphics import *"]:
    exec(f"from mylibs.master_lib.{module}")

方法二

如果您想保持程序的可读性 使用exec 函数和f-strings 来改变大导入的长度

MM, DA = "from mylibs.master_lib", "digital_assistant"
exec(f"{MM}.{DA}.web_bots.google_bot import searchgoogle")
exec(f"{MM}.{DA}.web_bots.social_media_connect import wa_pag")
exec(f"{MM}.{DA}.languages import access_dictionary")
exec(f"{MM}.{DA}.digital_assistant import speech_to_text")
exec(f"{MM}.{DA}.user_interface import *")
exec(f"{MM}.{DA}.web_bots.social_media_connect import *")
exec(f"{MM}.{DA}.webappsopenclose import *")
exec(f"{MM}.data_science.data_analytics import *")
exec(f"{MM}.device_controller import *")
exec(f"{MM}.artificial_intelligence.cv.computer_graphics import *")

方法三

您也可以使用importlib

import importlib
importlib.import_module(".Add_Ons", "MyLibs.GrandCollection.DS.Strings")

但是这种方法在导入模块而不是直接导入函数或常量时是可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 2018-03-10
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多