在不同脚本中使用库中不同版本函数的最佳方法是什么?

时间:2021-06-28 11:44:56

标签: python function versioning

假设我编写了一个用于数据分析的 Python 脚本,其中包含一个函数 parse_csv,它可能会返回特定格式的数据帧。然后我可以分析和绘制这个输出等。

一段时间后,处理相同格式的不同数据时,我决定最好以不同的方式解析 csv,因此我改进了该函数,使其返回稍有不同的输出以进行绘制等。方式略有不同。例如。一个数据框,现在包含列的日期时间对象,而不仅仅是字符串形式的日期和时间。

我仍然希望运行所有原始脚本。我希望旧脚本和新脚本的所有函数都在项目的一个 Python 库中。我不想返回并更改旧脚本的所有代码以使用新的和改进的功能。

对我的函数进行版本控制的最佳方法是什么?我可以想到几个选项,但我想知道是否遗漏了什么:

  1. 有没有办法在 python 中对库进行版本控制?,例如“导入 myLib 版本 0.1”。然后我可以为不同的脚本导入不同版本的库
  2. 我将这些功能称为不同的东西,例如parse_csv_1, parse_csv_2
  3. 我有一个函数参数可以重定向到函数内部的不同函数,例如:
def parse_csv(csv, version=1):
    if version == 1:
        return parse_csv_1(csv)
    elif version == 2:
        return parse_csv_2(csv)

有没有办法使用第一个选项来实现我想要的,因为它对我来说似乎更清晰,并且可以改进跨脚本的多个功能?还是我需要以不同的方式执行此操作?

我已经看到 this question 指的是导入特定版本的库,但我无法看到如何同时安装多个版本。

1 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题。让我们一一解决它们:

1。库版本控制:

如果您要将库发布到 PyPi 或任何其他存储库,您可以拥有不同的版本,并使用 pip 安装特定版本。但是,您不能拥有同一个库的多个版本

2.称其为不同的东西:

这将是首选方法。但是,我不建议将其命名为 _1_2。您应该以描述性的方式命名它,以便您了解不同功能之间的区别。因此,根据您的描述,您将有 parse_csvparse_csv_date_as_datetime

3.使用参数重定向

总的来说,这不是一个好主意。参数不应从根本上改变函数的行为方式。这可能会导致意外行为。参数应该是您执行计算的数据。

总结

我建议只创建第二个函数。在你过去的代码中使用原始代码,在新代码中使用新代码。

如果你真的必须有一个函数,你可以尝试应用 Strategy Pattern 来处理不同的数据格式化任务,传入一个策略函数并有一个与当前行为匹配的默认值,但是我会说可能超出了您目前的水平。

相关问题