UPDATE:抑制治疗作为迭代
的想法,使内置的字符串非迭代是proposed on python.org in 2006。我的问题有所不同,因为我试图仅在一段时间内抑制这些功能;仍然这整个线程是非常相关的。
这里是谁试行实施非迭代str
关键comments by Guido:
[...]我实现了这个(这是非常简单的 做),但后来发现,我不得不修复吨的地方迭代 字符串。例如:
对SRE解析器和编译器使用的东西等集(“”),并且还遍历输入的regexp的字符来解析它。
difflib具有用于串中的任两个列表中定义的API(典型的行由行DIFF的文件),或者两个串(一个典型 帧内线差异),或任何事物甚至两个列表(对于一般化的 序列差异)。
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
没有例外会发生,除了在无数地方测试isinstance(fields, str)
之外,没有简单的方法来解决这个问题。在某些情况下,这个错误需要很长时间才能找到。
我想禁用字符串作为完全在我的项目中被迭代处理。这是个好主意吗?它可以轻松安全地完成吗?
也许我可以继承内置的str
,这样我需要明确地调用get_iter()
如果我希望它的对象被当作一个迭代对待。然后,无论何时我需要一个字符串文字,我都会创建这个类的一个对象。
这里有一些切向相关的问题:
How can I tell if a python variable is a string or a list?
how to tell a variable is iterable but not a string
我想你基本上已经回答了你自己的问题。如果你必须这样做,你的两种方法是最好的方法,但最好的答案是确保它不会发生。 – 2012-02-06 23:35:11
我只是坚持'isinstance(fields,str)'检查 - 你不可能永远需要能够让你自己的类型像一个字符串一样嘎嘎。或者,将'fields'作为最后的可变参数。 (尽管如果你感到疲惫,这样做不会起作用,忘记你是否应该在其周围放置圆括号。) – millimoose 2012-02-06 23:52:12
任何将字符串定义为字符通用列表的库/语言都会遇到这个问题。它看起来不像Python的东西。 – Apalala 2012-02-12 21:49:32