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