Подавление обработки строки как повторяемой

ОБНОВИТЬ:

Идея сделать встроенные строки не повторяемыми былапредложено на python.org в 2006 году, Мой вопрос отличается тем, что я пытаюсь подавлять эти функции только время от времени; до сих пор вся эта тема весьма актуальна.

Вот критическиекомментарии Гвидо кто реализовал не повторяемый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() если бы я хотел, чтобы его объект рассматривался как итеративный. Тогда всякий раз, когда мне нужен строковый литерал, я вместо этого создаю объект этого класса.

Вот некоторые вопросы, связанные по касательной:

Как я могу определить, является ли переменная python строкой или списком?

как сказать переменная итеративна, но не строка

Ответы на вопрос(5)

Ваш ответ на вопрос