2009-08-26 44 views
14

Tôi đã không thể tìm thấy một ví dụ tốt về subclassing string.Template trong Python, mặc dù tôi đã nhìn thấy nhiều tham chiếu để làm như vậy trong tài liệu.Ví dụ về subclassing string.Template bằng Python?

Có bất kỳ ví dụ nào về điều này trên web không?

Tôi muốn thay đổi $ thành một ký tự khác và có thể thay đổi regex cho số nhận dạng.

+0

Một lưu ý là bạn không nên cố gắng thực hiện việc này trong Cython. Nó không hoạt động. Tôi không chắc lý do. –

Trả lời

22

Từ trăn docs:

sử dụng nâng cao: bạn có thể lấy được lớp con của Mẫu để tùy chỉnh cú pháp giữ chỗ, delimiter nhân vật, hoặc toàn bộ đều đặn biểu hiện sử dụng để phân tích mẫu chuỗi. Để làm điều này, bạn có thể ghi đè lên những lớp thuộc tính:

  • delimiter - Đây là chuỗi chữ mô tả một placeholder giới thiệu delimiter. Giá trị mặc định $. Lưu ý rằng đây không nên là cụm từ thông dụng, vì triển khai sẽ gọi re.escape() trên chuỗi này nếu cần.

  • idpattern - Đây là biểu hiện thường xuyên mô tả mô hình cho placeholders không chuẩn bị tinh thần (các niềng răng sẽ được tự động thêm vào như thích hợp). Giá trị mặc định là cụm từ thông dụng [_a-z] [_ a-z0-9] *.

Ví dụ:

from string import Template 

class MyTemplate(Template): 
    delimiter = '#' 
    idpattern = r'[a-z][_a-z0-9]*' 

>>> s = MyTemplate('#who likes $what') 
>>> s.substitute(who='tim', what='kung pao') 
'tim likes $what' 

Trong python 3:

mới trong phiên bản 3.2.

Hoặc, bạn có thể cung cấp toàn bộ mẫu biểu thức chính quy bằng cách ghi đè mẫu thuộc tính lớp. Nếu bạn làm điều này, giá trị phải là đối tượng cụm từ thông dụng với bốn nhóm chụp được đặt tên. Các nhóm chụp tương ứng với các quy tắc nêu trên, cùng với quy tắc giữ chỗ không hợp lệ:

  • thoát - Nhóm này phù hợp với dãy thoát, ví dụ $$, trong mẫu mặc định.
  • có tên - Nhóm này khớp với tên trình giữ chỗ không có chỗ đứng; nó không nên bao gồm dấu phân cách trong nhóm chụp.
  • giằng co - Nhóm này khớp với tên trình giữ chỗ có ngoặc nhọn; nó không nên bao gồm dấu phân cách hoặc dấu ngoặc ôm trong nhóm chụp .
  • không hợp lệ - Nhóm này khớp với bất kỳ mẫu dấu phân tách nào khác (thường là dấu phân cách đơn) và sẽ xuất hiện cuối cùng trong biểu thức thông thường.

Ví dụ:

from string import Template 
import re 

class TemplateClone(Template): 
    delimiter = '$' 
    pattern = r''' 
    \$(?: 
     (?P<escaped>\$) | # Escape sequence of two delimiters 
     (?P<named>[_a-z][_a-z0-9]*)  | # delimiter and a Python identifier 
     {(?P<braced>[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier 
     (?P<invalid>)    # Other ill-formed delimiter exprs 
    ) 
    ''' 

class TemplateAlternative(Template): 
    delimiter = '[-' 
    pattern = r''' 
    \[-(?: 
     (?P<escaped>-) |   # Expression [-- will become [- 
     (?P<named>[^\[\]\n-]+)-\] | # -, [, ], and \n can't be used in names 
     \b\B(?P<braced>) |   # Braced names disabled 
     (?P<invalid>)    # 
    ) 
    ''' 

>>> t = TemplateClone("$hi sir") 
>>> t.substitute({"hi": "hello"}) 
'hello sir' 

>>> ta = TemplateAlternative("[-hi-] sir") 
>>> ta.substitute({"hi": "have a nice day"}) 
'have a nice day sir' 
>>> ta = TemplateAlternative("[--[-hi-]-]") 
>>> ta.substitute({"hi": "have a nice day"}) 
'[-have a nice day-]' 

Rõ ràng nó cũng có thể chỉ cần bỏ qua bất kỳ nhóm regex escaped, named, braced hoặc invalid để vô hiệu hóa nó.

+0

bạn có biết điều này xảy ra như thế nào trong nền không? nói cách khác, delimeter được thay thế bằng '#' như thế nào? – slopeofhope