pprint --- Dữ liệu máy in đẹp¶
Source code: Lib/pprint.py
Mô-đun pprint cung cấp khả năng "in đẹp" các cấu trúc dữ liệu Python tùy ý ở dạng có thể được sử dụng làm đầu vào cho trình thông dịch. Nếu cấu trúc được định dạng bao gồm các đối tượng không phải là kiểu Python cơ bản, thì biểu diễn có thể không tải được. Điều này có thể xảy ra nếu các đối tượng như tệp, ổ cắm hoặc lớp được bao gồm, cũng như nhiều đối tượng khác không thể biểu diễn dưới dạng chữ Python.
Biểu diễn được định dạng sẽ giữ các đối tượng trên một dòng nếu có thể và chia chúng thành nhiều dòng nếu chúng không vừa với chiều rộng cho phép, có thể điều chỉnh bằng tham số width mặc định là 80 ký tự.
Thay đổi trong phiên bản 3.9: Đã thêm hỗ trợ cho types.SimpleNamespace in đẹp.
Thay đổi trong phiên bản 3.10: Đã thêm hỗ trợ cho dataclasses.dataclass in đẹp.
Chức năng¶
- pprint.pp(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)¶
In phần trình bày được định dạng của object, theo sau là dòng mới. Hàm này có thể được sử dụng trong trình thông dịch tương tác thay vì hàm
print()để kiểm tra các giá trị. Mẹo: bạn có thể chỉ định lạiprint = pprint.ppđể sử dụng trong một phạm vi.- Tham số:
object -- Đối tượng cần in.
stream (file-like object | None) -- Một đối tượng giống như tệp mà đầu ra sẽ được ghi vào bằng cách gọi phương thức
write()của nó. NếuNone(mặc định),sys.stdoutsẽ được sử dụng.indent (int) -- Số lượng thụt lề được thêm vào cho mỗi cấp độ lồng nhau.
width (int) -- Số ký tự tối đa mong muốn trên mỗi dòng ở đầu ra. Nếu cấu trúc không thể được định dạng trong giới hạn chiều rộng thì sẽ phải nỗ lực hết sức.
depth (int | None) -- Số lượng mức lồng nhau có thể được in. Nếu cấu trúc dữ liệu đang được in quá sâu, mức chứa tiếp theo sẽ được thay thế bằng
.... NếuNone(mặc định), không có hạn chế nào về độ sâu của đối tượng được định dạng.compact (bool) -- Kiểm soát thời gian định dạng sequences. Nếu
False(mặc định), mỗi mục của chuỗi sẽ được định dạng trên một dòng riêng biệt, nếu không thì bao nhiêu mục phù hợp với width sẽ được định dạng trên mỗi dòng đầu ra.sort_dicts (bool) -- Nếu là
True, từ điển sẽ được định dạng với các khóa được sắp xếp, nếu không chúng sẽ được hiển thị theo thứ tự chèn (mặc định).underscore_numbers (bool) -- Nếu
True, các số nguyên sẽ được định dạng bằng ký tự_cho dấu phân cách hàng nghìn, nếu không thì dấu gạch dưới sẽ không được hiển thị (mặc định).
>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) >>> pprint.pp(stuff) [<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']
Added in version 3.8.
- pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Bí danh cho
pp()với sort_dicts được đặt thànhTruetheo mặc định, điều này sẽ tự động sắp xếp các khóa của từ điển, bạn có thể muốn sử dụngpp()thay vìFalsetheo mặc định.
- pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Trả về biểu diễn được định dạng của object dưới dạng chuỗi. indent, width, depth, compact, sort_dicts và underscore_numbers được chuyển đến hàm tạo
PrettyPrinterdưới dạng các tham số định dạng và ý nghĩa của chúng như được mô tả trong tài liệu ở trên.
- pprint.isreadable(object)¶
Xác định xem biểu diễn được định dạng của object có "có thể đọc được" hay không hoặc có thể được sử dụng để xây dựng lại giá trị bằng
eval(). Điều này luôn trả vềFalsecho các đối tượng đệ quy.>>> pprint.isreadable(stuff) False
- pprint.isrecursive(object)¶
Xác định xem object có yêu cầu biểu diễn đệ quy hay không. Hàm này tuân theo các giới hạn tương tự như được lưu ý trong
saferepr()bên dưới và có thể tăngRecursionErrornếu nó không phát hiện được đối tượng đệ quy.
- pprint.saferepr(object)¶
Trả về biểu diễn chuỗi của object, được bảo vệ chống đệ quy trong một số cấu trúc dữ liệu phổ biến, cụ thể là các phiên bản của
dict,listvàtuplehoặc các lớp con có__repr__chưa bị ghi đè. Nếu biểu diễn đối tượng hiển thị mục nhập đệ quy, tham chiếu đệ quy sẽ được biểu diễn dưới dạng<Recursion on typename with id=number>. Sự biểu diễn không được định dạng khác.>>> pprint.saferepr(stuff) "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
Đối tượng PrettyPrinter¶
- class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Xây dựng một phiên bản
PrettyPrinter.Các đối số có cùng ý nghĩa như đối với
pp(). Lưu ý rằng chúng có thứ tự khác và sort_dicts mặc định làTrue.>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff[:]) >>> pp = pprint.PrettyPrinter(indent=4) >>> pp.pprint(stuff) [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> pp = pprint.PrettyPrinter(width=41, compact=True) >>> pp.pprint(stuff) [['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ... ('parrot', ('fresh fruit',)))))))) >>> pp = pprint.PrettyPrinter(depth=6) >>> pp.pprint(tup) ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
Thay đổi trong phiên bản 3.4: Đã thêm tham số compact.
Thay đổi trong phiên bản 3.8: Đã thêm tham số sort_dicts.
Thay đổi trong phiên bản 3.10: Đã thêm tham số underscore_numbers.
Thay đổi trong phiên bản 3.11: Không còn cố gắng ghi vào
sys.stdoutnếu đó làNone.
Các phiên bản PrettyPrinter có các phương thức sau:
- PrettyPrinter.pformat(object)¶
Trả về biểu diễn được định dạng của object. Điều này tính đến các tùy chọn được chuyển đến hàm tạo
PrettyPrinter.
- PrettyPrinter.pprint(object)¶
In phần trình bày được định dạng của object trên luồng đã định cấu hình, theo sau là dòng mới.
Các phương pháp sau đây cung cấp cách triển khai cho các hàm tương ứng có cùng tên. Việc sử dụng các phương thức này trên một phiên bản sẽ hiệu quả hơn một chút vì không cần phải tạo các đối tượng PrettyPrinter mới.
- PrettyPrinter.isreadable(object)¶
Xác định xem biểu diễn được định dạng của đối tượng có "có thể đọc được" hay không hoặc có thể được sử dụng để xây dựng lại giá trị bằng
eval(). Lưu ý rằng điều này trả vềFalsecho các đối tượng đệ quy. Nếu tham số depth củaPrettyPrinterđược đặt và đối tượng sâu hơn mức cho phép, điều này sẽ trả vềFalse.
- PrettyPrinter.isrecursive(object)¶
Xác định xem đối tượng có yêu cầu biểu diễn đệ quy hay không.
Phương thức này được cung cấp dưới dạng hook để cho phép các lớp con sửa đổi cách chuyển đổi các đối tượng thành chuỗi. Việc triển khai mặc định sử dụng phần bên trong của việc triển khai saferepr().
- PrettyPrinter.format(object, context, maxlevels, level)¶
Trả về ba giá trị: phiên bản được định dạng của object dưới dạng chuỗi, cờ cho biết kết quả có thể đọc được hay không và cờ cho biết liệu đệ quy có được phát hiện hay không. Đối số đầu tiên là đối tượng được trình bày. Thứ hai là một từ điển chứa
id()các đối tượng là một phần của bối cảnh trình bày hiện tại (các vùng chứa trực tiếp và gián tiếp cho object đang ảnh hưởng đến bản trình bày) làm khóa; nếu một đối tượng cần được trình bày đã được biểu thị bằng context thì giá trị trả về thứ ba sẽ làTrue. Các cuộc gọi đệ quy đến phương thứcformat()sẽ thêm các mục bổ sung cho vùng chứa vào từ điển này. Đối số thứ ba, maxlevels, đưa ra giới hạn được yêu cầu cho đệ quy; đây sẽ là0nếu không có giới hạn được yêu cầu. Đối số này phải được chuyển mà không được sửa đổi cho các cuộc gọi đệ quy. Đối số thứ tư, level, đưa ra mức hiện tại; các cuộc gọi đệ quy phải được chuyển một giá trị nhỏ hơn giá trị của cuộc gọi hiện tại.
Ví dụ¶
Để minh họa một số cách sử dụng hàm pp() và các tham số của nó, hãy tìm nạp thông tin về một dự án từ PyPI
>>> nhập json
>>> nhập pprint
>>> từ urllib.request nhập urlopen
>>> với urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') là resp:
... project_info = json.load(resp)['info']
Ở dạng cơ bản, pp() hiển thị toàn bộ đối tượng:
>>> pprint.pp(project_info)
{'tác giả': 'Cơ quan đóng gói Python',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': Không,
'phân loại': ['Trạng thái phát triển :: 3 - Alpha',
'Đối tượng dự kiến :: Nhà phát triển',
'Giấy phép :: OSI Đã được phê duyệt :: Giấy phép MIT',
'Ngôn ngữ lập trình :: Python :: 2',
'Ngôn ngữ lập trình :: Python :: 2.6',
'Ngôn ngữ lập trình :: Python :: 2.7',
'Ngôn ngữ lập trình :: Python :: 3',
'Ngôn ngữ lập trình :: Python :: 3.2',
'Ngôn ngữ lập trình :: Python :: 3.3',
'Ngôn ngữ lập trình :: Python :: 3.4',
'Chủ đề :: Phát triển phần mềm :: Công cụ xây dựng'],
'description': 'Một dự án Python mẫu\n'
'=========================\n'
'\n'
'Đây là tệp mô tả cho dự án.\n'
'\n'
'Tệp phải sử dụng mã hóa UTF-8 và được viết bằng '
'Văn bản được cấu trúc lại. Nó\n'
'sẽ được sử dụng để tạo trang web dự án trên PyPI và '
'nên được viết cho\n'
'mục đích đó.\n'
'\n'
'Nội dung điển hình của tập tin này sẽ bao gồm cái nhìn tổng quan về'
'dự án, cơ bản\n'
'ví dụ sử dụng, v.v. Nói chung, bao gồm cả dự án '
'log thay đổi ở đây không có\n'
'một ý tưởng hay, mặc dù phần "Có gì mới" đơn giản dành cho '
'phiên bản mới nhất\n'
'có thể phù hợp.',
'description_content_type': Không có,
'docs_url': Không,
'download_url': 'UNKNOWN',
'lượt tải xuống': {'last_day': -1, 'last_month': -1, 'last_week': -1},
'home_page': 'https://github.com/pypa/sampleproject',
'từ khóa': 'phát triển công cụ thiết lập mẫu',
'giấy phép': 'MIT',
'người bảo trì': Không,
'người bảo trì_email': Không có,
'tên': 'dự án mẫu',
'gói_url': 'https://pypi.org/project/sampleproject/',
'nền tảng': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'project_urls': {'Tải xuống': 'UNKNOWN',
'Trang chủ': 'https://github.com/pypa/sampleproject'},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': Không,
'requires_python': Không,
'tóm tắt': 'Một dự án Python mẫu',
'phiên bản': '1.2.0'}
Kết quả có thể được giới hạn ở một depth nhất định (dấu chấm lửng được sử dụng cho nội dung sâu hơn):
>>> pprint.pp(project_info, độ sâu=1)
{'tác giả': 'Cơ quan đóng gói Python',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': Không,
'bộ phân loại': […],
'description': 'Một dự án Python mẫu\n'
'=========================\n'
'\n'
'Đây là tệp mô tả cho dự án.\n'
'\n'
'Tệp phải sử dụng mã hóa UTF-8 và được viết bằng '
'Văn bản được cấu trúc lại. Nó\n'
'sẽ được sử dụng để tạo trang web dự án trên PyPI và '
'nên được viết cho\n'
'mục đích đó.\n'
'\n'
'Nội dung điển hình của tập tin này sẽ bao gồm cái nhìn tổng quan về'
'dự án, cơ bản\n'
'ví dụ sử dụng, v.v. Nói chung, bao gồm cả dự án '
'log thay đổi ở đây không có\n'
'một ý tưởng hay, mặc dù phần "Có gì mới" đơn giản dành cho '
'phiên bản mới nhất\n'
'có thể phù hợp.',
'description_content_type': Không có,
'docs_url': Không,
'download_url': 'UNKNOWN',
'tải xuống': {...},
'home_page': 'https://github.com/pypa/sampleproject',
'từ khóa': 'phát triển công cụ thiết lập mẫu',
'giấy phép': 'MIT',
'người bảo trì': Không,
'người bảo trì_email': Không có,
'tên': 'dự án mẫu',
'gói_url': 'https://pypi.org/project/sampleproject/',
'nền tảng': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'dự án_urls': {...},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': Không,
'requires_python': Không,
'tóm tắt': 'Một dự án Python mẫu',
'phiên bản': '1.2.0'}
Ngoài ra, ký tự tối đa width có thể được đề xuất. Nếu một đối tượng dài không thể phân chia được thì chiều rộng đã chỉ định sẽ bị vượt quá:
>>> pprint.pp(project_info, độ sâu=1, chiều rộng=60)
{'tác giả': 'Cơ quan đóng gói Python',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': Không,
'bộ phân loại': […],
'description': 'Một dự án Python mẫu\n'
'=========================\n'
'\n'
'Đây là tệp mô tả cho'
'dự án.\n'
'\n'
'Tệp phải sử dụng mã hóa UTF-8 và '
'được viết bằng Văn bản được cấu trúc lại. Nó\n'
'sẽ được sử dụng để tạo dự án'
'trang web trên PyPI và phải được viết'
'cho\n'
'mục đích đó.\n'
'\n'
'Nội dung điển hình của tập tin này sẽ '
'bao gồm tổng quan về dự án, '
'cơ bản\n'
'ví dụ về cách sử dụng, v.v. Nói chung, bao gồm '
'không có nhật ký thay đổi dự án ở đây\n'
'một ý tưởng hay, mặc dù chỉ đơn giản là "Cái gì '
Phần 'Mới" dành cho phiên bản mới nhất\n'
'có thể phù hợp.',
'description_content_type': Không có,
'docs_url': Không,
'download_url': 'UNKNOWN',
'tải xuống': {...},
'home_page': 'https://github.com/pypa/sampleproject',
'từ khóa': 'phát triển công cụ thiết lập mẫu',
'giấy phép': 'MIT',
'người bảo trì': Không,
'người bảo trì_email': Không có,
'tên': 'dự án mẫu',
'gói_url': 'https://pypi.org/project/sampleproject/',
'nền tảng': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'dự án_urls': {...},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': Không,
'requires_python': Không,
'tóm tắt': 'Một dự án Python mẫu',
'phiên bản': '1.2.0'}