使用已弃用的模块 'string

16 投票
3 回答
6841 浏览
提问于 2025-04-16 00:46

我刚刚在我的代码上运行了 pylint,它给我显示了这个信息:

使用了一个已弃用的模块 'string'

我主要是用 string 模块来做连接和分割。

>>> names = ['Pulp', 'Fiction']
>>> import string
>>> fullname = string.join(names)
>>> print fullname
Pulp Fiction

上面是一个例子。在我的代码中,我需要经常使用 splitjoin,所以我一直在用 string 模块。

这个模块被弃用了是吗?如果是的话,在 Python 2.6 中我该怎么处理分割和连接呢?我试着搜索了一下,但没找到清楚的答案,所以我在这里问。

3 个回答

0

我以前一直把 splitjoinstrip 当作字符串对象的方法来用,直到有一天我想让一个脚本运行得更快。

通过使用 cProfile 进行性能分析,我发现很多时间都花在了调用这些方法上。性能优化建议让我考虑在我的作用域内“复制”这些方法,以避免这样的问题:

split = str.split
join = str.join
for _ in xrange(1000000):
    print join("_", split("Pulp Fiction"))

如果我没记错的话,这个小技巧确实让我程序的运行速度提高了。

不过,如果我在多个函数中都需要这些字符串处理函数,我会在程序的“全局作用域”中创建这些复制(我不确定这样说是否正确)。这时 pylint 就会提醒我,变量命名不符合规范:

Invalid name "split" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

所以我最后只能用大写字母来命名它们:

SPLIT = str.split
JOIN = str.join

def main():
    for _ in xrange(1000000):
        print JOIN("_", SPLIT("Pulp Fiction"))

不过这样看起来有点丑。

有时候我会忘记可以复制和导入的方法:

from string import split, join

然后我就会收到 Uses of a deprecated module 'string' 的警告。

1

并不是所有来自“字符串”的函数都被淘汰了。如果你想使用一个没有被淘汰的字符串函数,那就把 pylint 配置中的过时模块设置里去掉那个字符串。

[IMPORTS]
deprecated-modules=string
17

和你的代码等价的写法是:

' '.join(names)

string 这个东西并没有被淘汰,淘汰的是一些和 str 方法重复的函数。对于 split,你也可以使用:

>>> 'Pulp Fiction'.split()
['Pulp', 'Fiction']

在文档中有一个 完整的淘汰函数列表和推荐的替代方法

撰写回答