【发布时间】:2015-03-26 16:21:31
【问题描述】:
试图向朋友解释语义版本控制的重要性时,我遇到了以下困境。
假设我们有库libfoo,版本1.2.3,它公开了以下函数:
def foo(x, y):
"""
Compute the sum of the operands.
:param x: The first argument.
:param y: The second argument.
:returns: The sum of `x` and `y`.
"""
return x + y
现在假设此函数及其文档更改为:
def foo(a, b):
"""
Compute the sum of the operands.
:param a: The first argument.
:param b: The second argument.
:returns: The sum of `a` and `b`.
"""
return a + b
我的第一印象是说下一个版本是1.2.4,因为公共界面没有改变。例如,像这样调用函数的人根本不会注意到变化:
foo(3, 4)
但再想一想,这很可能是一个 API 中断,因为 Python 允许通过参数名称来指定参数。如果有人像这样调用我的函数:
foo(y=4, x=3)
这将不再适用于版本 1.2.4,违反语义版本控制合同。
另一方面,这样的变化似乎很小,以至于我会因为将版本增加到2.0.0而感到难过。
总而言之,这是否构成 API 中断?在这种情况下,下一个版本号应该是什么?
【问题讨论】:
-
换个角度想一想——鉴于您正在尝试维护版本控制合同,您是否会自行更改(可能会破坏)接口?或者您会推迟更改,直到您有足够的更改一起(或其他一些真正很好的理由)来证明新的整数版本是合理的?
-
@jonrsharpe:当然。但问题更多是关于“一个人可以在代码库中安全地做到这一点,还是他/她必须假设这是一个 API 中断?”正如您所说的那样“他/她应该将此类更改推迟到下一个版本吗?”
-
对你来说很小。我经常使用关键字参数,即使它们不是必需的(更明确地说,特别是当有 3 个以上参数时),所以这样的机会可能会破坏 我 使用您的库编写的代码。对我来说,这完全是一个向后不兼容的更改,就像将
def f(x, y)更改为def f(y, x)一样。 -
如果您要维护一个公共 API,我会说您应该考虑对接口进行任何更改,可能会影响任何代码(在合理范围内 - 访问按约定私有属性的代码有时会带来不便!)是 API 更改,因此很重要。如果您公开公开此接口,则您有额外的“注意义务”以避免任何不必要的更改(除非另有说明 - 如果您明确声明 “不要为此功能使用关键字” 那么可能没问题,但这似乎有点奇怪)。
-
@jonrsharpe 这一切都说得通。我想我只需要从别人那里读到同样的结论。谢谢 !请随意添加答案,以便我给予您适当的信任。
标签: python semantic-versioning