在Python中整理可选导入
我正在做一个Python 3的项目,主要是处理数据的写入。现在,我希望用户能够选择数据写入的格式,比如pickle、SQLite、PostgreSQL等等。
pickle和sqlite是Python自带的功能,所以这方面没什么好担心的。不过,其他的格式就需要导入额外的模块了。
这个项目的结构大致是这样的:有一个叫ProjectClass
的类,它里面有read
、write
等方法,可以把数据写入列,创建新列等等。用户在创建ProjectClass
类型的对象时,可以选择使用哪个后端:
from project import ProjectClass
instance = ProjectClass(backend='MySQL')
instance.write(column_name='column1', data=some_data)
而这个后端会处理所有与数据库相关的事情(所以ProjectClass
与具体的数据库无关)。read
、write
和其他方法会调用backends.py
里的函数,而它们调用的具体函数取决于用户在创建ProjectClass
实例时选择的后端类型。
现在,我有两个问题不太明白:
- 如何让用户不需要为每种后端都安装所有的包(因为希望这个项目能不断发展,支持越来越多的数据库后端)
- 如何检查所需的包是否已经安装(比如PostgreSQL需要
psycopg2
)
我是不是应该把每种数据库的后端分成不同的文件,当用户创建一个ProjectType
实例时,尝试导入所需的文件(比如PostgreSQL用postgresqlbackend.py
,MySQL用mysqlbackend.py
等等),然后看看导入是否失败(因为缺少在<backendname>backend.py
文件中导入的包)?
1 个回答
我应该把不同数据库类型的后端分成单独的文件吗?当用户创建一个ProjectType实例时,它会尝试导入必要的文件。
这个想法听起来不错。不过别忘了,你可以在任何地方导入模块(可以在一个函数里面导入,不一定要在文件的最上面)。然后你可以用一个try/except
来包裹这个import
语句,并提前给用户一个警告。
try:
import non_existant_module
except ImportError as e:
print e.message # prints "No module named non_existant_module"
在我看来,最好的方法是在你的程序第一次启动时,加载运行时配置,告诉用户将使用哪个模块/数据库类型。这样用户就能立刻得到通知。