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

ОБНОВЛЕНИЕ:

Идея сделать встроенные строки не повторяемыми была предложена на 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 строкой или списком?

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

14
задан Community 23 May 2017 в 12:26
поделиться