ОБНОВЛЕНИЕ:
Идея сделать встроенные строки не повторяемыми была предложена на python.org в 2006 году .Мой вопрос отличается тем, что я пытаюсь подавить эти функции только время от времени; тем не менее, вся эта ветка весьма актуальна.
Вот критические комментарии Гвидо , который реализовал не повторяющуюся str
на пробной основе:
[...] Я реализовал это (очень просто делать), но потом обнаружил, что мне нужно исправить кучу мест, которые повторяются струны. Например:
Парсер и компилятор sre используют такие вещи, как set ("0123456789"), а также перебирают символы входящего регулярного выражения для его анализа.
difflib имеет API, определенный либо для двух списков строк (типичное построчное сравнение файла), либо для двух строк (типичное внутристрочный diff) или даже два списка чего угодно (для обобщенного последовательность разницы).
небольшие изменения в optparse.py, textwrap.py, string.py.
И я даже не в том месте, где фреймворк regrtest.py даже работает (из-за проблемы с дифлибом).
Я отказываюсь от этого проекта; патч 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 ()
, если бы я хотел, чтобы его объект обрабатывался как итеративный. Затем всякий раз, когда мне нужен строковый литерал, я вместо этого создаю объект этого класса.
Вот несколько косвенно связанных вопросов:
Как я могу определить, является ли переменная python строкой или списком?
как определить, является ли переменная повторяемой, но не строкой