为什么 Python 的 str.partition return 是分隔符?

Why does Python's str.partition return the separator?

我在我的代码中以三种方式使用 Python 的 str.partition

before, __, after = string.partition(sep)
before = string.partition(sep)[0]
after = string.partition(sep)[2]

虽然我经常使用 str.partition,但我一直想知道为什么它是 returns 作为分隔符。第一行肯定会从中受益 not 返回分隔符,在我看来,第三行也会变得更直观。

虽然我承认可以用

重新构建字符串
"".join(string.partition(sep))

我没有看到任何用例。

那么,在返回的元组中包含分隔符的基本原理是什么?

根据 the documentationstr.partition 和关联的 str.rpartition 是:

New in version 2.5.

查看该版本的 what's new 为这些方法提供了一些基本原理,"simplify a common use case":

The find(S)() method is often used to get an index which is then used to slice the string and obtain the pieces that are before and after the separator. partition(sep)() condenses this pattern into a single method call that returns a 3-tuple containing the substring before the separator, the separator itself, and the substring after the separator.


查看功能开发时的一些 the examples originally provided,例如替换:

i = host.find(':')
if i >= 0:
    port = host[i+1:]
    ...

与:

_, sep, port = host.partition(':')
if sep:
    ...

在输出中包含 sep 可以很容易地检查它是否在字符串中找到。有各种示例仅使用三个返回值中的两个,但它们不需要的情况各不相同!

在 jonrsharpe 的带领下,我找到了来自 Raymond Hettinger 的 this mail。它解释了基本原理并展示了许多用例。 中间值可以用作布尔标志,他们甚至接近称其为“found”而不是“sep”。在他的几乎所有中间值都没有被忽略的示例中,它确实被用作布尔标志(有时也被进一步使用)。 “旧模式”是调用 find、检查 < 0>= 0,然后有条件地提取部分。新的 partition 函数很好地替代了该模式。典型例子:

旧:

i = p.find('=')
if i >= 0:
    name = p[:i]
    value = p[i+1:]
    (use name and value)

新:

name, found, value = p.partition('=')
if found:
    (use name and value)