python-3.x - 如果版本更改会破坏代码,则支持一个包的多个版本
问题描述
我有一个使用Biopython
包的 Python3 项目。它的一个模块在最新版本中被删除了,所以我必须更改一小段代码来支持这个更改。另一方面,这种更改会破坏我对所有“旧”版本的 Biopython(在生产系统上大量使用)的代码。
我的问题:
处理这个问题的正确方法是什么?
如果这是有道理的:我如何同时支持新旧软件包版本?我是否执行运行时检查以查看我有哪个版本然后运行不同的代码?或者这是一个坏主意?如果您认为这是要走的路:是否有标准的方法来做到这一点?
解决方案
确保特定版本存在的最简单方法是将该版本固定在您的requirements.txt
文件(或其他依赖项规范)中。有很多系统依赖于旧版本的软件包,特别是对于没有任何安全隐患的软件包,这是完全合理的。
如果支持多个版本是您的目标,您可以在包导入过程中、在__init__.py
文件或其他地方执行一些基本检查。这种模式有些常见,特别适用于 Python 2 和 3 之间的版本兼容性:
def foo_function():
return
try:
import biopython.foo as foo
except (ImportError, AttributeError):
foo = foo_function
foo()
我已经在 GitHub 上无数次地看到了这个——当然,现在我试图找到一个我找不到的例子——但是当我这样做时,我会用一个例子来更新这个答案。
编辑:如果它对 Numpy 来说足够好,它可能对我们其他人来说已经足够好了。numpy_base.pyi L7-13
推荐阅读
- c++ - imgui 和 sdl 绘制的排序
- javascript - 如何将随机生成的数字保存到txt?
- php - 控制器:没有使用 axios api-call 的用户 ID?
- swift - 单击一次时如何阻止 SKSpriteNodes 移动
- reactjs - 检查 Firebase 登录是否成功 React.js
- python - 用于将日志文件从 S3 发送到 Elasticsearch 的 Python 2.7 与 3.8 Lambda
- android - 我如何在 android 设备上获得 TxPower 蓝牙 LE
- python-3.x - 如何在烧瓶单元测试的发布请求中传递 html 表单?
- qt - 在 GridView 中的委托顶部绘制突出显示组件
- sqoop - Sqoop import failed "java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils"