为什么Python的str.partition会返回分隔符?

时间:2015-05-24 12:16:30

标签: python separator partition rationale

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

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

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

虽然我承认可以使用

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

我没有看到任何用例。

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

2 个答案:

答案 0 :(得分:3)

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

  

2.5版中的新功能。

查看该版本的what's new为这些方法提供了一些基本原理,其中"简化了常见用例"

  

find(S)()方法通常用于获取索引   用于切割字符串并获取之前和之后的片段   分隔符之后。 partition(sep)()将此模式浓缩为一个   单个方法调用,返回包含子字符串的3元组   在分隔符之前,分隔符本身和子字符串之后   分隔符。

在开发函数时查看the examples originally provided中的一些内容,例如替换:

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

使用:

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

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

答案 1 :(得分:2)

在jonrsharpe的带领下,我找到了Raymond Hettinger的this mail。它解释了基本原理并展示了许多用例。 中间值可以用作布尔标志,他们甚至接近调用它&#34;找到&#34;而不是&#34; sep&#34;。在几乎所有中间值都不被忽略的例子中,它确实被用作布尔标志(有时也被进一步使用)。 &#34;旧模式&#34;曾致电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)