python - 参数化导入语句

标签 python

我维护了一个 Python 模块,它包装并公开了 DLL 的功能(也是由我维护的)。与 DLL 的接口(interface)使用 ctypes。

感谢 ctypes 的奇迹,这一切都非常有效。但是,由于我绝不是 Python 专家,所以我觉得 Python 的某些部分不是地道的

特别是我向模块的用户提供了对 DLL 位置的控制。 DLL 在导入模块期间加载。我这样做是因为我想根据 DLL 的功能切换行为,并且我需要加载 DLL 以查询其行为。

默认情况下,DLL 加载依赖于 DLL 搜索路径来定位 DLL。我希望能够允许用户指定 DLL 的完整路径,如果他们希望选择特定版本的话。

目前我通过使用环境变量来执行此操作,但我认识到这是一种相当奇怪的方法。我正在寻找的是一种规范惯用 Python 方式,供模块导入器将一些信息传递给模块,这些信息可以在模块导入时访问。

最佳答案

您应该将 DLL 的加载延迟到实际第一次使用的位置,并提供一个可选的函数初始化:

_initialized=False
def initialize(path=None):
  if _initialized:
    if path:
      raise ValueError, "initialize called after first use"
    return
  if path is None:
    path = default_path
  load_dll(path)
  determine_features()

然后,在您提供的所有 API 中调用 initialized()。这使用户有机会覆盖它,但如果他们不这样做,它将继续像今天一样工作(您甚至可以保留对环境变量的支持)。

如果您愿意更改 API,请使用类:

class DLLAPI:
  def __init__(self, path=None):
    ...

用户必须创建一个 DLLAPI 实例,并且可能会也可能不会传递 DLL 路径。这应该允许同时使用不同的 DLL。

关于python - 参数化导入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4767160/

相关文章:

python - 通过 ctypes 从 Python 调用 C 代码,使用 python 对象列表

python - 如何运行 bottle + tornado + ssl (https) + spdy

python - 用 Python 为非数据库代码编写事务

python - 如何在比较同一数据帧的两个版本后获取修改的行

python - 在 python luigi 上安排非常大量的工作

python - csv2rec 和 polyfit 的问题

python - Reviewboard tests.py 如何运行它

python - Pandas loc : Multiindexing and selecting rows with specific index values

python - conda 和 pip 根本不工作

python - 使用 python 2.7 导入 hashlib 而不是 2.6 时出错