2015-10-08 16 views
5

Rõ ràng cú pháp ur"" đã bị tắt trong Python 3. Tuy nhiên, tôi cần nó! "Tại sao?", bạn có thể yêu cầu. Vâng, tôi cần tiền tố u vì nó là một chuỗi unicode và mã của tôi cần phải làm việc trên Python 2. Đối với tiền tố r, có thể không cần thiết, nhưng định dạng đánh dấu tôi đang sử dụng yêu cầu nhiều dấu gạch chéo ngược và giúp tránh những sai lầm.Chữ unicode thô hợp lệ trong Python 2 và Python 3?

Dưới đây là một ví dụ mà làm những gì tôi muốn trong Python 2 nhưng là bất hợp pháp bằng Python 3:

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

Sau khi xem qua vấn đề này, tôi thấy http://bugs.python.org/issue15096 và nhận thấy câu nói này:

Thật dễ dàng để vượt qua giới hạn.

Có ai quan tâm để cung cấp ý tưởng về cách thức không?

liên quan: What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

Trả lời

9

Tại sao bạn không chỉ cần sử dụng liệu chuỗi chữ (r'....'), bạn không cần phải chỉ định u vì trong Python 3, chuỗi là chuỗi 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' 

Để làm cho nó cũng làm việc bằng Python 2.x, Thêm the following Future import statement vào đầu rất của mã nguồn của bạn, do đó trong xâu trong mã nguồn trở thành unicode.

from __future__ import unicode_literals 
-1

chuỗi Unicode là mặc định trong Python 3.x, vì vậy sử dụng r mình sẽ sản xuất giống như ur bằng Python 2.

+0

-1; điều này bỏ lỡ các điểm của câu hỏi, đó là làm thế nào để viết một nguyên unicode literal đó là đồng thời hợp lệ trong * cả hai * Python 2 và Python 3. –

1

Cách ưa thích là thả u'' tiền tố và sử dụng from __future__ import unicode_literals như @falsetru suggested. Nhưng trong trường hợp cụ thể của bạn, bạn có thể lạm dụng thực tế là "ascii-only string" % unicode trả về 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

Về Python3: tất cả các chuỗi luôn là Unicode theo mặc định. Tiền tố u đã mất chức năng và đã bị xóa khỏi ngôn ngữ.

Tuy nhiên bắt đầu với phiên bản 3.3, các u được chấp nhận một lần nữa (và bỏ qua) chỉ để làm cho việc chuyển từ Python2 dễ dàng hơn.

Vì vậy, một cách để làm cho chuỗi của bạn tương thích Python3 và Python2 là yêu cầu phiên bản 3.3+ được phát hành cách đây 3 năm.

+0

-1; câu hỏi này là về 'ur'-prefixed strings cụ thể, không chỉ là' u'-prefixed strings, và 'ur' là * not * được hỗ trợ trong Python 3.3+. –

+0

@MarkAmery: cảm ơn nhận xét của bạn và xin lỗi vì đã đưa ra một câu trả lời không hữu ích. – VPfB

Các vấn đề liên quan