更新:
2006 年在 python.org 上提出了使内置字符串不可迭代的想法。我的问题有所不同,因为我只是偶尔尝试抑制此功能;整个线程仍然非常相关。
以下是Guido 的批评意见,str
他在试验的基础上实施了不可迭代:
[...] 我实现了这个(做起来真的很简单),但后来发现我必须修复大量迭代字符串的地方。例如:
sre 解析器和编译器使用 set("0123456789") 之类的东西,并遍历输入正则表达式的字符来解析它。
difflib 具有为两个字符串列表(文件的典型逐行差异)或两个字符串(典型的行内差异)或什至两个任何列表(对于通用序列差异)定义的 API .
optparse.py、textwrap.py、string.py 中的小改动。
而且我什至还没有到 regrtest.py 框架甚至可以工作的地步(由于 difflib 问题)。
我要放弃这个项目;补丁是SF patch 1471291。我不再赞成这个想法;这是不切实际的,而且我在 sre 和 difflib 中发现的用例驳斥了迭代字符串的充分理由的前提。
原始问题:
虽然字符串是可迭代的,这是语言的一个简洁特性,但当与鸭子类型结合使用时,它可能会导致灾难:
# record has to support [] operation to set/retrieve values
# fields has to be an iterable that contains the fields to be set
def set_fields(record, fields, value):
for f in fields:
record[f] = value
set_fields(weapon1, ('Name', 'ShortName'), 'Dagger')
set_fields(weapon2, ('Name',), 'Katana')
set_fields(weapon3, 'Name', 'Wand') # I was tired and forgot to put parentheses
不会引发异常,除了isinstance(fields, str)
在无数地方进行测试外,没有简单的方法可以捕捉到这一点。在某些情况下,这个错误需要很长时间才能找到。
我想在我的项目中完全禁止字符串被视为可迭代。这是个好主意吗?可以轻松安全地完成吗?
也许我可以继承内置的子类,这样如果我希望它的对象被视为可迭代对象str
,我需要显式调用。get_iter()
然后,每当我需要一个字符串文字时,我都会创建一个此类的对象。
以下是一些切向相关的问题: