在Python中整理可选导入

4 投票
1 回答
989 浏览
提问于 2025-04-18 09:03

我正在做一个Python 3的项目,主要是处理数据的写入。现在,我希望用户能够选择数据写入的格式,比如pickle、SQLite、PostgreSQL等等。

pickle和sqlite是Python自带的功能,所以这方面没什么好担心的。不过,其他的格式就需要导入额外的模块了。

这个项目的结构大致是这样的:有一个叫ProjectClass的类,它里面有readwrite等方法,可以把数据写入列,创建新列等等。用户在创建ProjectClass类型的对象时,可以选择使用哪个后端:

from project import ProjectClass
instance = ProjectClass(backend='MySQL')
instance.write(column_name='column1', data=some_data)

而这个后端会处理所有与数据库相关的事情(所以ProjectClass与具体的数据库无关)。readwrite和其他方法会调用backends.py里的函数,而它们调用的具体函数取决于用户在创建ProjectClass实例时选择的后端类型。

现在,我有两个问题不太明白:

  1. 如何让用户不需要为每种后端都安装所有的包(因为希望这个项目能不断发展,支持越来越多的数据库后端)
  2. 如何检查所需的包是否已经安装(比如PostgreSQL需要psycopg2

我是不是应该把每种数据库的后端分成不同的文件,当用户创建一个ProjectType实例时,尝试导入所需的文件(比如PostgreSQL用postgresqlbackend.py,MySQL用mysqlbackend.py等等),然后看看导入是否失败(因为缺少在<backendname>backend.py文件中导入的包)?

1 个回答

3

我应该把不同数据库类型的后端分成单独的文件吗?当用户创建一个ProjectType实例时,它会尝试导入必要的文件。

这个想法听起来不错。不过别忘了,你可以在任何地方导入模块(可以在一个函数里面导入,不一定要在文件的最上面)。然后你可以用一个try/except来包裹这个import语句,并提前给用户一个警告。

try:
    import non_existant_module
except ImportError as e:
    print e.message # prints "No module named non_existant_module"

在我看来,最好的方法是在你的程序第一次启动时,加载运行时配置,告诉用户将使用哪个模块/数据库类型。这样用户就能立刻得到通知。

撰写回答