Скажите необработанную строку (r '') из обычной строки ('')? - PullRequest
9 голосов
/ 06 мая 2011

В настоящее время я создаю инструмент, который должен сопоставлять имена файлов с шаблоном. Для удобства я намереваюсь обеспечить как ленивое сопоставление (в стиле глобуса), так и сопоставление регулярным выражением. Например, следующие два фрагмента в конечном итоге будут иметь одинаковые эффекты:

@mylib.rule('static/*.html')
def myfunc():
    pass

@mylib.rule(r'^static/([^/]+)\.html')
def myfunc():
    pass

AFAIK r'' полезен только для анализатора Python и фактически создает стандартный экземпляр str после синтаксического анализа (единственное отличие состоит в том, что он сохраняет \).

Кто-нибудь знает способ отличить одно от другого?

Мне бы не хотелось предоставлять два альтернативных декоратора для одной и той же цели или, что еще хуже, вручную анализировать строку, чтобы определить, является ли это регулярным выражением или нет.

Ответы [ 3 ]

13 голосов
/ 06 мая 2011

Вы не можете отличить их друг от друга.Каждый необработанный строковый литерал также может быть записан как стандартный строковый литерал (возможно, требующий большего количества кавычек) и наоборот.Помимо этого, я бы определенно дал разные имена двум декораторам.Они не делают одно и то же, они делают разные вещи.

Пример (CPython):

>>> a = r'^static/([^/]+)\.html'; b = '^static/([^/]+)\.html'
>>> a is b
True

Так что в этом конкретном примере необработанный строковый литерал и стандартный строковый литерал дажерезультат в том же строковом объекте.

11 голосов
/ 06 мая 2011

Вы не можете сказать, была ли строка определена как необработанная строка после факта. Лично я на самом деле использовал бы отдельный декоратор, но если вы не хотите, вы можете использовать именованный параметр (например, @rule(glob="*.txt") для глобусов и @rule(re=r".+\.txt") для регулярных выражений).

В качестве альтернативы, требуется, чтобы пользователи предоставили скомпилированный объект регулярного выражения, если они хотят использовать регулярное выражение, например, @rule(re.compile(r".+\.txt")) - это легко обнаружить, потому что его тип отличается.

1 голос
/ 07 мая 2011

Термин «необработанная строка» сбивает с толку, потому что звучит так, как будто это особый тип строки - хотя на самом деле это просто специальный синтаксис для литералов, который указывает компилятору не интерпретировать '\' символы в строке. К сожалению, этот термин был придуман для описания этого поведения во время компиляции, но многие новички предполагают, что он обладает некоторыми особыми характеристиками времени выполнения.

Я предпочитаю называть их "необработанными строковыми литералами" , чтобы подчеркнуть, что именно их определение строкового литерала с использованием синтаксиса "не интерпретировать-обратная косая черта" делает их "необработанными". И необработанные строковые литералы, и обычные строковые литералы создают строки (или str s), а результирующие переменные являются строками, как и любые другие. Строка, созданная необработанным строковым литералом, во всех отношениях эквивалентна той же строке, определенной не необработанным образом с использованием экранированных обратных косых черт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...