2015-10-08 15 views
5

Wygląda na to, że składnia ur"" została wyłączona w Pythonie 3. Potrzebuję tego! "Dlaczego?", możesz zapytać. Potrzebuję prefiksu u, ponieważ jest to ciąg znaków Unicode, a mój kod musi działać w Pythonie 2. Jeśli chodzi o prefiks r, to może nie jest to konieczne, ale format znaczników, którego używam, wymaga wielu odwrotnych ukośników i pomóż uniknąć błędów.Dosłowne wyrażenie w formacie unicode, które jest poprawne w Pythonie 2 i Pythonie 3?

Oto przykład, że robi to, co chcę w Pythonie 2, ale jest nielegalne w Pythonie 3:

tamil_letter_ma = u"\u0bae" 
marked_text = ur"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma 

Po napotykając ten problem, znalazłem http://bugs.python.org/issue15096 i zauważyłem, że ten cytat:

Łatwo jest przezwyciężyć to ograniczenie.

Czy ktoś chciałby przedstawić pomysł na temat?

pokrewne: What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

Odpowiedz

9

Dlaczego nie można po prostu użyć surowego string literal (r'....'), nie trzeba określać u, ponieważ w Pythonie 3 ciągi są ciągami znaków Unicode.

>>> tamil_letter_ma = "\u0bae" 
>>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma 
>>> marked_text 
'\\aம\\bthe Tamil\\cletter\\dMa\\e' 

Żeby było również pracować w Pythonie 2.x, Dodaj the following Future import statement na samym początku kodu źródłowego, tak że w napisowych w kod źródłowy stać Unicode.

from __future__ import unicode_literals 
-1

ciągi Unicode są domyślne w Pythonie 3.x, więc korzystanie r sam będzie produkować takie same jak ur w Pythonie 2.

+0

-1; to nie trafia w sedno pytania, czyli w jaki sposób napisać surowy dosłowny kod Unicode, który jest jednocześnie ważny w * obu * Pythonie 2 i Pythonie 3. –

1

Preferowanym sposobem jest spadek u'' prefiks i używać from __future__ import unicode_literals jak @falsetru suggested. Ale w konkretnym przypadku można nadużywać faktu, że "ascii-only string" % unicode powraca Unicode:

>>> tamil_letter_ma = u"\u0bae" 
>>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma 
>>> marked_text 
u'\\a\u0bae\\bthe Tamil\\cletter\\dMa\\e' 
-1

chodzi Python3: wszystkie ciągi są zawsze Unicode domyślnie. Prefiks u stracił swoją funkcję i został usunięty z języka.

Jednak począwszy od wersji 3.3, u jest ponownie akceptowany (i ignorowany), aby ułatwić portowanie z Python2.

Jednym ze sposobów na zapewnienie zgodności łańcuchów Python3 i Python2 jest wymaganie wersji 3.3+, która została wydana 3 lata temu.

+0

-1; to pytanie dotyczyło w szczególności łańcuchów 'ur'-prefiksowanych, a nie tylko' u' -strojonych, a 'ur' is * not * supported w języku Python 3.3+. –

+0

@MarkAmery: dziękuję za komentarz i przepraszam za udzielenie niezbyt pomocnej odpowiedzi. – VPfB