可选导入的pythonic方式

Leg*_*ack 4 python import

我有一个包,允许用户使用他们想要连接到数据库的 4 个包中的任何一个。它工作得很好,但我对我导入东西的方式不满意。

我可以简单地导入所有包,但我不想这样做,以防特定用户永远不需要使用turbodbc,例如:

import pyodbc
import pymssql
import turbodbc
from ibmdbpy.base import IdaDataBase
Run Code Online (Sandbox Code Playgroud)

目前,我有以下情况。我尝试导入所有这些,但那些不导入的,没问题,我的程序只是假设它们不会被调用,如果它们是错误的:

# some envs may not have all these packages installed so we try each:

try:
    import pyodbc
except:
    pass

try:
    import pymssql
except:
    pass

try:
    import turbodbc
except:
    pass

try:
    from ibmdbpy.base import IdaDataBase
except:
    pass
Run Code Online (Sandbox Code Playgroud)

这感觉不是pythonic。所以我知道有诸如holoviews或tensorflow之类的软件包可以让您指定后端。它们当然比我的复杂几个数量级,但它们必须处理相同的模式。

我怎样才能使这个代码正确?它在技术上有问题,因为如果他们打算使用pyodbc但没有安装它,我的程序不会警告他们,它会在运行时出错。所以这真的超越了美学或哲学;这是技术上容易出错的代码。

你会如何处理这种情况?

仅供参考,这是如何调用代码的示例:

connect('Playground', package='pymssql')
Run Code Online (Sandbox Code Playgroud)

Sam*_*man 8

try: 
    import pyodbc
except ImportError: 
    pyodbc = None
Run Code Online (Sandbox Code Playgroud)

后来:

if pyodbc is None and user_wants_to_use_pyodbc:
    print_warning()
    raise SomeConfigurationErrorOrSuch()
Run Code Online (Sandbox Code Playgroud)

这种方法适用于少数选项。如果您有足够的选项需要抽象出这种方法,那么您可以使用该importlib模块在程序的控制下导入模块。