在Python中组织可选导入的方法

4
我正在开发一个Python 3项目,涉及到数据的写入。现在,我希望用户能够选择数据写入的格式 - pickle、SQLite、PostgreSQL等。好在Python已经内置了pickle和sqlite支持,所以不用担心。但是其他的需要导入其他模块。
该项目包括以下内容(不必赘述): 一个名为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. 不要求用户为每个后端安装每个包(因为希望项目会越来越多地支持各种DB后端)
  2. 检查是否安装了必要的包(例如PostgreSQL需要psycopg2等)

我应该将后端分成每个数据库类型的单独文件,当用户创建ProjectType实例时,尝试导入必要的文件(例如,对于PostgreSQL,导入postgresqlbackend.py,对于MySQL,导入mysqlbackend.py等),并查看导入是否失败(由于缺少<backendname>backend.py文件中导入的包)?


你提出的解决方案听起来不错。但我无法确定你是否需要更多的答案,而不仅仅是肯定或否定。 - BrenBarn
这或许是一个是/否问题,但我并不确定我的解决方案是否是最佳选择,因此我开放听取其他建议。 - George Oblapenko
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"

我认为最好的方法是,在程序加载运行时配置并指定将要使用的模块/数据库类型后,打印此错误。这样用户会立刻得到通知。


你也可以在函数外部使用try/except - BrenBarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接