更新:
2006年在python.org上提出了使内置字符串不可迭代的想法.我的问题不同之处在于我试图偶尔禁止这个功能; 仍然这整个线程非常相关.
以下是Guido的批评意见,他们str在试验基础上实施了不可迭代的评论:
[...]我实现了这个(这很简单)然后发现我必须修复大量遍布字符串的地方.例如:
sre解析器和编译器使用set("0123456789")之类的东西,并迭代输入regexp的字符来解析它.
difflib有两个字符串列表定义的API(文件的典型逐行差异),或两个字符串(典型的行内差异),甚至两个任何列表(对于广义序列差异) .
optparse.py,textwrap.py,string.py中的小变化.
而且我甚至还没有在regrtest.py框架工作的地方(由于difflib问题).
我放弃了这个项目; 补丁是SF补丁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
Run Code Online (Sandbox Code Playgroud)
除了isinstance(fields, …