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

What is the best way to use different versions of a function from a library in different scripts?

假设我编写了一个用于数据分析的 Python 脚本,其中包含一个函数 parse_csv,该函数可能 return 某种格式的数据框。然后我可以分析并绘制此输出等

一段时间后,使用相同格式的不同数据,我决定以不同的方式解析 csv 更好,所以我改进了函数,使其 return 的输出略有不同以稍微不同的方式绘制等。例如。现在包含列的日期时间对象的数据框,而不仅仅是作为字符串的日期和时间。

我还是想要所有的原剧本运行。我希望新旧脚本的所有功能都在项目的一个 python 库中。我不想返回并更改旧脚本的所有代码以使用新的和改进的功能。

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

  1. 有没有办法对 python 中的库进行版本控制? “导入 myLib 版本 0.1”。然后我可以为不同的脚本导入不同版本的库
  2. 我称函数为不同的东西,例如parse_csv_1parse_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。库版本控制:

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

2。称呼它不同的东西:

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

3。使用参数重定向

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

总结

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

如果你真的必须有一个单一的功能,你可以尝试应用 Strategy Pattern 来处理不同的数据格式化任务,传递一个策略函数并有一个与当前行为相匹配的默认值,但是我' d说的可能超出你现在的水平