reprlib --- Triển khai repr() thay thế¶
Source code: Lib/reprlib.py
Mô-đun reprlib cung cấp phương tiện để tạo ra các biểu diễn đối tượng với các giới hạn về kích thước của chuỗi kết quả. Điều này được sử dụng trong trình gỡ lỗi Python và cũng có thể hữu ích trong các ngữ cảnh khác.
Mô-đun này cung cấp một lớp, một thể hiện và một hàm:
- class reprlib.Repr(*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)¶
Lớp cung cấp các dịch vụ định dạng hữu ích trong việc triển khai các chức năng tương tự như
repr()tích hợp sẵn; giới hạn kích thước cho các loại đối tượng khác nhau được thêm vào để tránh tạo ra các biểu diễn quá dài.Các đối số từ khóa của hàm tạo có thể được sử dụng làm lối tắt để đặt các thuộc tính của phiên bản
Repr. Điều đó có nghĩa là việc khởi tạo sau:aRepr = reprlib.Repr(maxlevel=3)
Tương đương với:
aRepr = reprlib.Repr() aRepr.maxlevel = 3
Xem phần Repr Objects để biết thêm thông tin về các thuộc tính
Repr.Thay đổi trong phiên bản 3.12: Cho phép đặt thuộc tính thông qua đối số từ khóa.
- reprlib.aRepr¶
Đây là một phiên bản của
Reprđược sử dụng để cung cấp chức năngrepr()được mô tả bên dưới. Việc thay đổi các thuộc tính của đối tượng này sẽ ảnh hưởng đến giới hạn kích thước được sử dụng bởirepr()và trình gỡ lỗi Python.
- reprlib.repr(obj)¶
Đây là phương pháp
repr()củaaRepr. Nó trả về một chuỗi tương tự như chuỗi được trả về bởi hàm tích hợp cùng tên, nhưng có giới hạn ở hầu hết các kích thước.
Ngoài các công cụ giới hạn kích thước, mô-đun này còn cung cấp một trình trang trí để phát hiện các lệnh gọi đệ quy tới __repr__() và thay thế một chuỗi giữ chỗ.
- @reprlib.recursive_repr(fillvalue='...')¶
Công cụ trang trí cho các phương thức
__repr__()để phát hiện các lệnh gọi đệ quy trong cùng một luồng. Nếu một lệnh gọi đệ quy được thực hiện, fillvalue sẽ được trả về, nếu không, lệnh gọi__repr__()thông thường sẽ được thực hiện. Ví dụ:>>> từ nhập reprlib recursive_repr >>> lớp MyList(danh sách): ... @recursive_repr() ... def __repr__(self): ... return '<' + '|'.join(map(repr, self)) + '>' ... >>> m = MyList('abc') >>> m.append(m) >>> m.append('x') >>> in(m) <'a'|'b'|'c'|...|'x'>
Added in version 3.2.
Đối tượng đại diện¶
Các phiên bản Repr cung cấp một số thuộc tính có thể được sử dụng để cung cấp giới hạn kích thước cho cách biểu diễn các loại đối tượng khác nhau và các phương thức định dạng các loại đối tượng cụ thể.
- Repr.fillvalue¶
Chuỗi này được hiển thị cho các tham chiếu đệ quy. Nó mặc định là
....Added in version 3.11.
- Repr.maxlevel¶
Giới hạn độ sâu trong việc tạo các biểu diễn đệ quy. Mặc định là
6.
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
Giới hạn về số lượng mục được biểu thị cho loại đối tượng được đặt tên. Mặc định là
4chomaxdict,5chomaxarrayvà6cho những cái khác.
- Repr.maxlong¶
Số ký tự tối đa trong biểu diễn của một số nguyên. Các chữ số được bỏ từ giữa. Mặc định là
40.
- Repr.maxstring¶
Giới hạn số lượng ký tự trong cách biểu diễn chuỗi. Lưu ý rằng cách biểu diễn "bình thường" của chuỗi được sử dụng làm nguồn ký tự: nếu cần có các chuỗi thoát trong cách biểu diễn, thì các chuỗi này có thể bị sai khi biểu diễn được rút ngắn. Mặc định là
30.
- Repr.maxother¶
Giới hạn này được sử dụng để kiểm soát kích thước của các loại đối tượng không có phương pháp định dạng cụ thể nào khả dụng trên đối tượng
Repr. Nó được áp dụng theo cách tương tự nhưmaxstring. Mặc định là20.
- Repr.indent¶
Nếu thuộc tính này được đặt thành
None(mặc định), đầu ra sẽ được định dạng không ngắt dòng hoặc thụt lề, giống nhưrepr()tiêu chuẩn. Ví dụ:>>> ví dụ = [ ... 1, 'spam', {'a': 2, 'b': 'trứng thư rác', 'c': {3: 4.5, 6: []}}, 'ham'] >>> nhập khẩu reprlib >>> aRepr = reprlib.Repr() >>> print(aRepr.repr(example)) [1, 'spam', {'a': 2, 'b': 'trứng thư rác', 'c': {3: 4.5, 6: []}}, 'ham']
Nếu
indentđược đặt thành một chuỗi, mỗi cấp độ đệ quy sẽ được đặt trên một dòng riêng, được thụt vào bởi chuỗi đó:>>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) [ -->1, -->'thư rác', -->{ -->--->'a': 2, ----->'b': 'trứng thư rác', -->---'c': { -->---->-->3: 4.5, -->---->-->6: [], -->--->}, -->}, -->'ham', ]
Việc đặt
indentthành giá trị số nguyên dương sẽ hoạt động như thể nó được đặt thành một chuỗi có số khoảng trắng đó:>>> aRepr.indent = 4 >>> print(aRepr.repr(example)) [ 1, 'thư rác', { 'a': 2, 'b': 'trứng thư rác', 'c': { 3: 4,5, 6: [], }, }, 'giăm bông', ]
Added in version 3.12.
- Repr.repr1(obj, level)¶
Triển khai đệ quy được sử dụng bởi
repr(). Điều này sử dụng loại obj để xác định phương thức định dạng nào sẽ gọi, chuyển nó obj và level. Các phương thức dành riêng cho loại nên gọirepr1()để thực hiện định dạng đệ quy, vớilevel - 1cho giá trị level trong lệnh gọi đệ quy.
- Repr.repr_TYPE(obj, level)
Các phương pháp định dạng cho các loại cụ thể được triển khai dưới dạng các phương thức có tên dựa trên tên loại. Trong tên phương thức, TYPE được thay thế bằng
'_'.join(type(obj).__name__.split()). Việc gửi tới các phương thức này được xử lý bởirepr1(). Các phương thức dành riêng cho loại cần định dạng đệ quy một giá trị nên gọiself.repr1(subobj, level - 1).
Phân lớp các đối tượng Repr¶
Việc sử dụng tính năng điều phối động của Repr.repr1() cho phép các lớp con của Repr thêm hỗ trợ cho các loại đối tượng tích hợp bổ sung hoặc sửa đổi cách xử lý các loại đã được hỗ trợ. Ví dụ này cho thấy cách hỗ trợ đặc biệt cho các đối tượng tệp có thể được thêm vào:
nhập khẩu
hệ thống nhập khẩu
lớp MyRepr(reprlib.Repr):
def repr_TextIOWrapper(self, obj, level):
nếu obj.name trong {'<stdin>', '<stdout>', '<stderr>'}:
trả lại obj.name
trả về đại diện(obj)
aRepr = MyRepr()
print(aRepr.repr(sys.stdin)) # prints '<stdin>'
<stdin>