Hướng dẫn python custom string formatter - trình định dạng chuỗi tùy chỉnh python
Ảnh của Raphael Schaller trên unplash Show
Các chuỗi trong Python có phương pháp >>> '{a} {b}'.format(a=1) 1 cho phép người giữ chỗ được thay thế bằng các giá trị:Nội dung chính ShowShow
Trong bài viết này, chúng tôi sẽ thấy cách bạn có thể sử dụng các lớp tùy chỉnh để làm công cụ tuyệt vời với >>> '{a} {b}'.format(a=1) 1.Tùy chọn định dạngGiá trị bị mất Sử dụng mọi giá trịSự kết luận 7.1.1. Chuỗi hằng số lorString constants¶7.1.2. Định dạng chuỗi tùy chỉnhCustom String Formatting¶ ________ 45 ________ 388 (s, chiều rộng) ¶Format String Syntax¶7.1.3.1. Đặc điểm kỹ thuật về định dạng Mini-Language¶Format Specification Mini-Language¶ Your predicted spend next year is ${amount}. 7.1.3.2. Ví dụ định dạng ¶Format examples¶ 7.1.4. Chuỗi mẫuTemplate strings¶7.1.5. Chuỗi hàmString functions¶ 7.1.6. Chuỗi chuỗi không dùng nữaDeprecated string functions¶ Giá trị bị mấtSử dụng mọi giá trị Sự kết luận7.1.1. Chuỗi hằng số lorString constants¶ >>> '{a} {b}'.format(a=1) 02:7.1.2. Định dạng chuỗi tùy chỉnhCustom String Formatting¶ ________ 45 ________ 388 (s, chiều rộng) ¶Format String Syntax¶7.1.3.1. Đặc điểm kỹ thuật về định dạng Mini-Language¶Format Specification Mini-Language¶ 7.1.3.2. Ví dụ định dạng ¶Format examples¶Sử dụng mọi giá trịSự kết luận >>> '{a} {b}'.format(a=1) 37.1.1. Chuỗi hằng số lorString constants¶ >>> '{a} {b}'.format(a=1) 02:Sự kết luận7.1.1. Chuỗi hằng số lorString constants¶ 7.1.2. Định dạng chuỗi tùy chỉnhCustom String Formatting¶Sequence Types — str, unicode, list, tuple, bytearray, buffer, xrange section, and also the string-specific methods described in the String Methods section. To output formatted strings use template strings or the ________ 45 ________ 388 (s, chiều rộng) ¶Format String Syntax¶String Formatting Operations section. Also, see the>>> '{a} {b}'.format(a=1) 34 module for string functions based on regular expressions.7.1.1. Chuỗi hằng số lorString constants¶7.1.2. Định dạng chuỗi tùy chỉnhCustom String Formatting¶ ________ 45 ________ 388 (s, chiều rộng) ¶Format String Syntax¶7.1.3.1. Đặc điểm kỹ thuật về định dạng Mini-Language¶Format Specification Mini-Language¶ 7.1.3.2. Ví dụ định dạng ¶Format examples¶7.1.4. Chuỗi mẫuTemplate strings¶ 7.1.5. Chuỗi hàmString functions¶7.1.6. Chuỗi chuỗi không dùng nữaDeprecated string functions¶ Trong bài viết này, chúng tôi sẽ thấy cách bạn có thể sử dụng các lớp tùy chỉnh để làm công cụ tuyệt vời vớiMột tính năng hữu ích của >>> '{a} {b}'.format(a=1) 1 là các tùy chọn định dạng có thể được cung cấp:Một tính năng hữu ích của >>> '{a} {b}'.format(a=1) 1 là các tùy chọn định dạng có thể được cung cấp:Trong ví dụ trên, chúng tôi đã định dạng một loại >>> '{a} {b}'.format(a=1) 4 với tùy chọn >>> '{a} {b}'.format(a=1) 5. Các loại Python khác hỗ trợ các tùy chọn định dạng bao gồm >>> '{a} {b}'.format(a=1) 6, >>> '{a} {b}'.format(a=1) 7 và >>> '{a} {b}'.format(a=1) 8. Một nguồn tốt để tìm hiểu về tất cả các khả năng cho các tùy chọn định dạng là pyformat.info.Một điều gọn gàng về Python là bạn có thể tạo các loại chấp nhận các tùy chọn định dạng bằng cách thực hiện phương thức >>> '{a} {b}'.format(a=1) 01. Giá trị cụ thể phụ thuộc vào ngôn ngữ và sẽ được cập nhật khi >>> '{a} {b}'.format(a=1) 35 được gọi. ________ 45 ________ 71¶Chuỗi >>> '{a} {b}'.format(a=1) 92. ________ 45 ________ 74¶Chuỗi các ký tự ASCII được coi là ký tự chấm câu trong ngôn ngữ >>> '{a} {b}'.format(a=1) 95. ________ 45 ________ 77¶Chuỗi các ký tự được coi là có thể in. Đây là sự kết hợp của >>> '{a} {b}'.format(a=1) 98, >>> '{a} {b}'.format(a=1) 99, >>> '{a} {b}'.format(a=1) 30 và >>> '{a} {b}'.format(a=1) 31. ________ 45 ________ 83¶Một chuỗi chứa tất cả các ký tự được coi là chữ hoa. Trên hầu hết các hệ thống, đây là chuỗi >>> '{a} {b}'.format(a=1) 04. Giá trị cụ thể phụ thuộc vào ngôn ngữ và sẽ được cập nhật khi >>> '{a} {b}'.format(a=1) 35 được gọi. ________ 45 ________ 87¶Một chuỗi chứa tất cả các ký tự được coi là khoảng trắng. Trên hầu hết các hệ thống, điều này bao gồm không gian ký tự, tab, linefeed, return, formFeed và tab dọc. 7.1.2. Định dạng chuỗi tùy chỉnhCustom String Formatting¶Mới trong phiên bản 2.6. Các lớp STR và Unicode tích hợp cung cấp khả năng thực hiện các thay thế biến đổi phức tạp và định dạng giá trị thông qua phương pháp >>> '{a} {b}'.format(a=1) 38 được mô tả trong PEP 3101. Lớp >>> '{a} {b}'.format(a=1) 39 trong mô-đun >>> '{a} {b}'.format(a=1) 32 cho phép bạn tạo và tùy chỉnh các hành vi định dạng chuỗi của riêng bạn như phương pháp >>> '{a} {b}'.format(a=1) 01 tích hợp.PEP 3101. The >>> '{a} {b}'.format(a=1) 39 class in the >>> '{a} {b}'.format(a=1) 32 module allows you to create and customize your own string formatting behaviors using the same implementation as the built-in >>> '{a} {b}'.format(a=1) 01 method. Lớp ________ 45 ________ 93¶PEP 3101. The >>> '{a} {b}'.format(a=1) 39 class in the >>> '{a} {b}'.format(a=1) 32 module allows you to create and customize your own string formatting behaviors using the same implementation as the built-in >>> '{a} {b}'.format(a=1) 01 method. Lớp ________ 45 ________ 93¶Lớp >>> '{a} {b}'.format(a=1) 39 có các phương thức công khai sau: ________ 34 (format_string, *args, ** kwargs) ¶(format_string, *args, **kwargs)¶(format_string, *args, **kwargs)¶Phương pháp API chính. Nó lấy một chuỗi định dạng và một tập hợp các đối số từ khóa và vị trí tùy ý. Nó chỉ là một trình bao bọc mà gọi >>> '{a} {b}'.format(a=1) 06. ________ 97 (format_string, args, kwargs) ¶(format_string, args, kwargs)¶(format_string, args, kwargs)¶Chức năng này thực hiện công việc thực tế của định dạng. Nó được phơi bày như một chức năng riêng biệt cho các trường hợp bạn muốn truyền trong một từ điển được xác định trước về các đối số, thay vì giải nén và đóng gói từ điển làm đối số riêng lẻ bằng cách sử dụng cú pháp >>> '{a} {b}'.format(a=1) 08 và >>> '{a} {b}'.format(a=1) 09. >>> '{a} {b}'.format(a=1) 06 thực hiện công việc phá vỡ chuỗi định dạng thành dữ liệu ký tự và các trường thay thế. Nó gọi các phương pháp khác nhau được mô tả dưới đây. Ngoài ra, >>> '{a} {b}'.format(a=1) 39 xác định một số phương thức được dự định sẽ được thay thế bằng các lớp con: ________ 102 (Format_String) ¶(format_string)¶(format_string)¶Vòng lặp qua định dạng_string và trả về một bộ dữ liệu (literal_text, field_name, format_spec, chuyển đổi). Điều này được sử dụng bởi >>> '{a} {b}'.format(a=1) 06 để chia chuỗi thành văn bản theo nghĩa đen hoặc các trường thay thế.Các giá trị trong tuple về mặt khái niệm đại diện cho một nhịp của văn bản theo nghĩa đen theo sau là một trường thay thế duy nhất. Nếu không có văn bản theo nghĩa đen (có thể xảy ra nếu hai trường thay thế xảy ra liên tiếp), thì literal_text sẽ là một chuỗi có độ dài bằng không. Nếu không có trường thay thế, thì các giá trị của field_name, format_spec và chuyển đổi sẽ là >>> '{a} {b}'.format(a=1) 104. ________ 105 (field_name, args, kwargs) ¶(field_name, args, kwargs)¶(field_name, args, kwargs)¶Cho field_name được trả về bởi >>> '{a} {b}'.format(a=1) 106 (xem ở trên), chuyển đổi nó thành một đối tượng được định dạng. Trả về một tuple (obj, used_key). Phiên bản mặc định có các chuỗi của biểu mẫu được xác định trong PEP 3101, chẳng hạn như là 0 [tên] Args và kwargs được truyền vào >>> '{a} {b}'.format(a=1) 06. Giá trị trả về đã sử dụng_key có cùng ý nghĩa với tham số chính với >>> '{a} {b}'.format(a=1) 108.PEP 3101, such as “0[name]” or “label.title”. args and kwargs are as passed in to >>> '{a} {b}'.format(a=1) 06. The return value used_key has the same meaning as the key parameter to >>> '{a} {b}'.format(a=1) 108. ________ 109 (khóa, args, kwargs) ¶(key, args, kwargs)¶PEP 3101, such as “0[name]” or “label.title”. args and kwargs are as passed in to >>> '{a} {b}'.format(a=1) 06. The return value
used_key has the same meaning as the key parameter to >>> '{a} {b}'.format(a=1) 108. ________ 109 (khóa, args, kwargs) ¶(key, args, kwargs)¶Lấy một giá trị trường đã cho. Đối số chính sẽ là một số nguyên hoặc một chuỗi. Nếu nó là một số nguyên, nó đại diện cho chỉ số của đối số vị trí trong Args; Nếu đó là một chuỗi, thì nó đại diện cho một đối số được đặt tên trong kwargs. Tham số ARGS được đặt thành danh sách các đối số vị trí thành >>> '{a} {b}'.format(a=1) 06 và tham số KWARGS được đặt thành từ điển của các đối số từ khóa.Đối với tên trường ghép, các chức năng này chỉ được gọi cho thành phần đầu tiên của tên trường; Các thành phần tiếp theo được xử lý thông qua các hoạt động thuộc tính và lập chỉ mục thông thường. Vì vậy, ví dụ, biểu thức trường ‘0.Name, sẽ khiến >>> '{a} {b}'.format(a=1) 108 được gọi bằng đối số chính là 0. Thuộc tính >>> '{a} {b}'.format(a=1) 112 sẽ được tra cứu sau khi trả về >>> '{a} {b}'.format(a=1) 108 bằng cách gọi hàm >>> '{a} {b}'.format(a=1) 114 tích hợp.Nếu chỉ mục hoặc từ khóa đề cập đến một mục không tồn tại, thì nên nâng cao >>> '{a} {b}'.format(a=1) 115 hoặc >>> '{a} {b}'.format(a=1) 116. ________ 117 (used_args, args, kwargs) ¶(used_args, args, kwargs)¶(used_args, args, kwargs)¶Thực hiện kiểm tra các đối số không sử dụng nếu muốn. Các đối số cho hàm này là tập hợp tất cả các khóa đối số thực sự được đề cập trong chuỗi định dạng (số nguyên cho các đối số vị trí và các chuỗi cho các đối số được đặt tên) và tham chiếu đến ARGS và KWARGS được truyền cho VFormat. Tập hợp các arg không sử dụng có thể được tính từ các tham số này. >>> '{a} {b}'.format(a=1) 1 18 được giả định để tăng một ngoại lệ nếu kiểm tra không thành công.________ 119 (giá trị, format_spec) ¶(value, format_spec)¶>>> '{a} {b}'.format(a=1) 120 chỉ đơn giản gọi là toàn cầu >>> '{a} {b}'.format(a=1) 01 tích hợp. Phương pháp được cung cấp để các lớp con có thể ghi đè nó. ________ 122 (giá trị, chuyển đổi) ¶(value, conversion)¶(value, format_spec)¶>>> '{a} {b}'.format(a=1) 120 chỉ đơn giản gọi là toàn cầu >>> '{a} {b}'.format(a=1) 01 tích hợp. Phương pháp được cung cấp để các lớp con có thể ghi đè nó. ________ 122 (giá trị, chuyển đổi) ¶(value, conversion)¶Chuyển đổi giá trị (được trả về bởi >>> '{a} {b}'.format(a=1) 123) được đưa ra một loại chuyển đổi (như trong bộ tuple được trả về bằng phương pháp >>> '{a} {b}'.format(a=1) 106). Phiên bản mặc định hiểu các loại chuyển đổi (STR), ‘R, (repr) và‘ A (ASCII). ________ 45 ________ 388 (s, chiều rộng) ¶Format String Syntax¶Pad Một chuỗi số S ở bên trái với các chữ số bằng không cho đến khi đạt được chiều rộng đã cho. Chuỗi bắt đầu bằng một dấu hiệu được xử lý chính xác. ________ 45 ________ 390 (S, cũ, mới [, maxreplace]) ¶ Ngữ pháp cho một trường thay thế như sau: Trong các thuật ngữ ít chính thức hơn, trường thay thế có thể bắt đầu bằng một field_name chỉ định đối tượng có giá trị được định dạng và chèn vào đầu ra thay vì trường thay thế. Field_name được tùy chọn theo sau bởi một trường chuyển đổi, được đi trước bởi một dấu chấm than >>> '{a} {b}'.format(a=1) 131 và một định dạng_spec, được đi trước bởi một đại tràng >>> '{a} {b}'.format(a=1) 132. Chúng chỉ định một định dạng không mặc định cho giá trị thay thế.Xem thêm phần Đặc tả định dạng Mini-Language.Format Specification Mini-Language section.Format Specification Mini-Language section. Field_name bắt đầu bằng một arg_name là số hoặc từ khóa. Nếu nó có một số, nó đề cập đến một đối số vị trí và nếu nó là một từ khóa, nó sẽ đề cập đến một đối số từ khóa được đặt tên. Nếu arg_names số trong chuỗi định dạng là 0, 1, 2, theo trình tự, tất cả chúng đều có thể bị bỏ qua (không chỉ một số) và các số 0, 1, 2, sẽ được tự động chèn theo thứ tự đó. Vì arg_name không được trích dẫn, nên không thể chỉ định các khóa từ điển tùy ý (ví dụ: chuỗi >>> '{a} {b}'.format(a=1) 133 hoặc >>> '{a} {b}'.format(a=1) 134) trong chuỗi định dạng. ARG_NAME có thể được theo sau bởi bất kỳ số lượng biểu thức chỉ mục hoặc thuộc tính nào. Một biểu thức của dạng >>> '{a} {b}'.format(a=1) 135 chọn thuộc tính được đặt tên bằng cách sử dụng >>> '{a} {b}'.format(a=1) 114, trong khi biểu thức của dạng >>> '{a} {b}'.format(a=1) 137 thực hiện tra cứu chỉ mục bằng cách sử dụng >>> '{a} {b}'.format(a=1) 138.Đã thay đổi trong phiên bản 2.7: Các nhà xác định đối số vị trí có thể được bỏ qua cho >>> '{a} {b}'.format(a=1) 38 và >>> '{a} {b}'.format(a=1) 140, do đó >>> '{a} {b}'.format(a=1) 141 tương đương với >>> '{a} {b}'.format(a=1) 142, >>> '{a} {b}'.format(a=1) 143 tương đương với >>> '{a} {b}'.format(a=1) 144.The positional argument specifiers can be omitted for >>> '{a} {b}'.format(a=1) 38 and >>> '{a} {b}'.format(a=1) 140, so >>> '{a} {b}'.format(a=1) 141 is equivalent to >>> '{a} {b}'.format(a=1) 142, >>> '{a} {b}'.format(a=1) 143 is equivalent to >>> '{a} {b}'.format(a=1) 144.Một số ví dụ chuỗi định dạng đơn giản: >>> '{a} {b}'.format(a=1) 0Trường chuyển đổi gây ra sự ép buộc loại trước khi định dạng. Thông thường, công việc định dạng một giá trị được thực hiện bằng phương thức >>> '{a} {b}'.format(a=1) 145 của chính giá trị. Tuy nhiên, trong một số trường hợp, mong muốn buộc một loại được định dạng thành một chuỗi, ghi đè lên định nghĩa của chính nó về định dạng. Bằng cách chuyển đổi giá trị thành một chuỗi trước khi gọi >>> '{a} {b}'.format(a=1) 145, logic định dạng thông thường được bỏ qua.Hai cờ chuyển đổi hiện đang được hỗ trợ: >>> '{a} {b}'.format(a=1) 147 gọi >>> '{a} {b}'.format(a=1) 148 về giá trị và >>> '{a} {b}'.format(a=1) 149 gọi >>> '{a} {b}'.format(a=1) 150.Vài ví dụ: >>> '{a} {b}'.format(a=1) 3Trường định dạng_spec chứa một đặc điểm kỹ thuật về cách trình bày giá trị, bao gồm các chi tiết như chiều rộng trường, căn chỉnh, đệm, độ chính xác thập phân, v.v. Mỗi loại giá trị có thể xác định định dạng ngôn ngữ nhỏ của riêng mình hoặc giải thích định dạng_spec. Hầu hết các loại tích hợp hỗ trợ một ngôn ngữ mini định dạng phổ biến, được mô tả trong phần tiếp theo. Trường định dạng_spec cũng có thể bao gồm các trường thay thế lồng nhau trong đó. Các trường thay thế lồng nhau này có thể chứa một tên trường, cờ chuyển đổi và đặc tả định dạng, nhưng không được phép làm tổ sâu hơn. Các trường thay thế trong định dạng_spec được thay thế trước khi chuỗi định dạng_spec được giải thích. Điều này cho phép định dạng của một giá trị được chỉ định động. Xem phần Ví dụ định dạng cho một số ví dụ.Format examples section for some examples.Format examples section for some examples. 7.1.3.1. Đặc điểm kỹ thuật về định dạng Mini-Language¶Format Specification Mini-Language¶Thông số kỹ thuật định dạng của Nhật Bản được sử dụng trong các trường thay thế có trong một chuỗi định dạng để xác định cách trình bày các giá trị riêng lẻ (xem Cú pháp chuỗi định dạng). Chúng cũng có thể được chuyển trực tiếp đến hàm >>> '{a} {b}'.format(a=1) 01 tích hợp. Mỗi loại có thể tạo thành có thể xác định cách giải thích đặc tả định dạng.Format String Syntax). They can also be passed directly to the built-in >>> '{a} {b}'.format(a=1) 01 function. Each formattable type may define how the format specification is to be interpreted.Format String Syntax). They can also be passed directly to the built-in >>> '{a} {b}'.format(a=1) 01 function. Each formattable type may define how the format specification is to be interpreted.Hầu hết các loại tích hợp thực hiện các tùy chọn sau đây cho các thông số kỹ thuật định dạng, mặc dù một số tùy chọn định dạng chỉ được hỗ trợ bởi các loại số. Một quy ước chung là một chuỗi định dạng trống ( >>> '{a} {b}'.format(a=1) 152) tạo ra kết quả tương tự như khi bạn đã gọi >>> '{a} {b}'.format(a=1) 148 trên giá trị. Một chuỗi định dạng không trống thường sửa đổi kết quả.Hình thức chung của trình xác định định dạng tiêu chuẩn là: >>> '{a} {b}'.format(a=1) 9Nếu một giá trị căn chỉnh hợp lệ được chỉ định, nó có thể được đi trước bởi một ký tự điền có thể là bất kỳ ký tự và mặc định nào đối với một không gian nếu bị bỏ qua. Không thể sử dụng một nẹp xoăn theo nghĩa đen (____ ____154, hoặc ____ ____155) làm ký tự điền khi sử dụng phương pháp >>> '{a} {b}'.format(a=1) 38. Tuy nhiên, có thể chèn một nẹp xoăn với một trường thay thế lồng nhau. Giới hạn này không ảnh hưởng đến hàm >>> '{a} {b}'.format(a=1) 01.Ý nghĩa của các tùy chọn căn chỉnh khác nhau như sau:
Lưu ý rằng trừ khi chiều rộng trường tối thiểu được xác định, chiều rộng trường sẽ luôn có cùng kích thước với dữ liệu để điền vào nó, do đó tùy chọn căn chỉnh không có ý nghĩa trong trường hợp này. Tùy chọn dấu hiệu chỉ hợp lệ cho các loại số và có thể là một trong những điều sau đây:
>>> '{a} {b}'.format(a=1) 161 Buộc các lĩnh vực phải được tập trung trong không gian có sẵn.>>> '{a} {b}'.format(a=1) 161 Buộc các lĩnh vực phải được tập trung trong không gian có sẵn.Lưu ý rằng trừ khi chiều rộng trường tối thiểu được xác định, chiều rộng trường sẽ luôn có cùng kích thước với dữ liệu để điền vào nó, do đó tùy chọn căn chỉnh không có ý nghĩa trong trường hợp này. Tùy chọn dấu hiệu chỉ hợp lệ cho các loại số và có thể là một trong những điều sau đây:>>> '{a} {b}'.format(a=1) 162 PEP 378).chỉ ra rằng một dấu hiệu nên được sử dụng cho cả số dương cũng như số âm. >>> '{a} {b}'.format(a=1) 163 chỉ ra rằng một dấu hiệu chỉ nên được sử dụng cho các số âm (đây là hành vi mặc định).không gian chỉ ra rằng một không gian hàng đầu nên được sử dụng trên các số dương và dấu trừ trên các số âm.Tùy chọn >>> '{a} {b}'.format(a=1) 164 chỉ có giá trị đối với các số nguyên và chỉ cho đầu ra nhị phân, bát phân hoặc thập lục phân. Nếu có, nó chỉ định rằng đầu ra sẽ được tiền tố bởi >>> '{a} {b}'.format(a=1) 165, >>> '{a} {b}'.format(a=1) 166 hoặc >>> '{a} {b}'.format(a=1) 167, tương ứng.
Buộc các phần đệm được đặt sau dấu hiệu (nếu có) nhưng trước các chữ số. Điều này được sử dụng để in các trường trong mẫu ‘+000000120. Tùy chọn căn chỉnh này chỉ có giá trị cho các loại số. Nó trở thành mặc định khi ‘0 ngay lập tức đi trước chiều rộng trường.
chỉ ra rằng một không gian hàng đầu nên được sử dụng trên các số dương và dấu trừ trên các số âm. Tùy chọn >>> '{a} {b}'.format(a=1) 168 báo hiệu việc sử dụng dấu phẩy cho hàng ngàn người. Đối với một bộ phân cách nhận biết địa phương, thay vào đó hãy sử dụng loại trình bày số nguyên >>> '{a} {b}'.format(a=1) 169.
>>> '{a} {b}'.format(a=1)Traceback (most recent call last): File " |