我是Python的新手。我有一个用例,其中需要对用Python编写的函数进行版本控制(例如ML模型的Feature计算)。
说Function1有两个副本,一个是version1,第二个是version2,并且您都希望这两个副本都可以使用,即可以通过指定函数名称和版本来调用该函数的任何副本(当然,两个版本与彼此)
问题:
我们可以在一个应用程序中提供同一Python函数的多个版本吗?最好的方法是什么?
假设某人添加了新功能Function2,是否需要重新启动Python应用程序,以便也可以使用Function2? (在Java世界中,您将重新启动应用程序以在RAM中重新加载最新的jar)
谢谢
答案 0 :(得分:1)
我们可以在一个应用程序中提供同一Python函数的多个版本吗?
是的,可以,但是没有单一的“标准”方式可以做到这一点-您可以自己滚动。
实现它的最好方法是什么?
从理论上讲,一种合理的清洁方法是利用Python的打包和entry points系统。
将函数的每个实现包装到单独的程序包中(例如featureextractor_A
,featureextractor_B
)。在打算提供(通常一个或多个)实现的任何程序包的setup.py
中,具有以下形式的入口点规范:
entry_points="""
[my.feature.extractor]
feature_1=featureextractor_A:function_A
feature_2=featureextractor_A:function_B
""",
然后您可以从所有程序包中列出系统中当前可用的所有“功能提取器”,如下所示:
from pkg_resources import iter_entry_points
for entry_point in iter_entry_points(group='my.feature.provider', name=None):
... do something with entry_point ...
再次注意,这不是管理此类功能注册表的唯一方法。例如,您也可以在特定于应用程序的配置文件或数据库表中列出“可插入”功能,从而避开pkg_resources
子系统(可以slow down the startup time of your app considerably)。
您是否需要重新启动Python应用程序,以便也可以使用Function2
这取决于您如何实现整个系统。在上述建议的基于入口点的解决方案中,所有可用入口点的列表都是在pkg_resources
首次在应用程序启动时导入时构造的,因此您需要重新启动或强制重新启动以某种方式扫描以使用新安装的软件包而无需重新启动。
但是,通常,每当您将新软件包安装到Python的系统路径时,都无需重新启动即可使用它们。因此,如果您维护自己的注册表,则可以决定是要定期对其进行“重新扫描”,还是每次需要调用“可插拔”功能时始终引用某个持久状态(此处的缺点是每次调用都有一个数据库请求。)