我有一个包,允许用户使用他们想要连接到数据库的 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)
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模块在程序的控制下导入模块。