我在代码中以三种方式使用Python str.partition
:
before, __, after = string.partition(sep)
before = string.partition(sep)[0]
after = string.partition(sep)[2]
虽然我经常使用str.partition
,但我总是想知道为什么它会返回分隔符。第一行肯定会受益于不返回分隔符,在我看来,第三行也会变得更直观。
虽然我承认可以使用
重新构建字符串"".join(string.partition(sep))
我没有看到任何用例。
那么,在返回的元组中包含分隔符的理由是什么?
答案 0 :(得分:3)
每the documentation,str.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。它解释了基本原理并展示了许多用例。 中间值可以用作布尔标志,他们甚至接近调用它"找到"而不是" 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)