假设我编写了一个用于数据分析的 Python 脚本,其中包含一个函数 parse_csv
,它可能会返回特定格式的数据帧。然后我可以分析和绘制这个输出等。
一段时间后,处理相同格式的不同数据时,我决定最好以不同的方式解析 csv,因此我改进了该函数,使其返回稍有不同的输出以进行绘制等。方式略有不同。例如。一个数据框,现在包含列的日期时间对象,而不仅仅是字符串形式的日期和时间。
我仍然希望运行所有原始脚本。我希望旧脚本和新脚本的所有函数都在项目的一个 Python 库中。我不想返回并更改旧脚本的所有代码以使用新的和改进的功能。
对我的函数进行版本控制的最佳方法是什么?我可以想到几个选项,但我想知道是否遗漏了什么:
parse_csv_1
, parse_csv_2
def parse_csv(csv, version=1):
if version == 1:
return parse_csv_1(csv)
elif version == 2:
return parse_csv_2(csv)
有没有办法使用第一个选项来实现我想要的,因为它对我来说似乎更清晰,并且可以改进跨脚本的多个功能?还是我需要以不同的方式执行此操作?
我已经看到 this question 指的是导入特定版本的库,但我无法看到如何同时安装多个版本。
答案 0 :(得分:1)
这是一个非常有趣的问题。让我们一一解决它们:
如果您要将库发布到 PyPi 或任何其他存储库,您可以拥有不同的版本,并使用 pip
安装特定版本。但是,您不能拥有同一个库的多个版本
这将是首选方法。但是,我不建议将其命名为 _1
、_2
。您应该以描述性的方式命名它,以便您了解不同功能之间的区别。因此,根据您的描述,您将有 parse_csv
和 parse_csv_date_as_datetime
。
总的来说,这不是一个好主意。参数不应从根本上改变函数的行为方式。这可能会导致意外行为。参数应该是您执行计算的数据。
我建议只创建第二个函数。在你过去的代码中使用原始代码,在新代码中使用新代码。
如果你真的必须有一个函数,你可以尝试应用 Strategy Pattern 来处理不同的数据格式化任务,传入一个策略函数并有一个与当前行为匹配的默认值,但是我会说可能超出了您目前的水平。