Nhận từ đầu tiên của chuỗi Python

lấy từ đầu tiên của chuỗi trong python [cách đơn giản]

  • không xác định. PY
  • 05 Tháng Tư, 2020

trong hướng dẫn này, chúng ta sẽ học cách lấy từ đầu tiên của chuỗi bằng một cách đơn giản

nội dung

1. cú pháp

string.split[][0]

2. ví dụ


#string
string = "python is a great language"

#convert string to list and get the first item
first_world = string.split[][0]

#print
print[first_world]

đầu ra

con trăn

như bạn có thể thấy, "python" là mục đầu tiên trong chuỗi của chúng tôi


Bây giờ, hãy xem chúng ta đã làm điều đó như thế nào

trước tiên, chúng tôi đã chuyển đổi chuỗi thành danh sách bằng cách sử dụng hàm tích hợp split[] , sau đó lấy mục đầu tiên trong danh sách bằng cách .

Bài viết liên quan

con trăn. Nhận từ đầu tiên, thứ hai, từ cuối cùng trong chuỗi

Python Kiểm tra xem Chuỗi có phải là Datetime không

Xóa HTTPS hoặc HTTP khỏi URL Python

3 phương thức nối vào cuối chuỗi trong Python

con trăn. Bỏ qua Case và kiểm tra xem các chuỗi có bằng nhau không

Python - Kiểm tra xem Chuỗi có bắt đầu với danh sách Tiền tố không

Hướng dẫn này cho bạn thấy python lấy từ đầu tiên từ chuỗi. Bài đăng này sẽ cung cấp cho bạn một ví dụ đơn giản về python lấy từ đầu tiên trong chuỗi. Đây là một ví dụ đơn giản về cách lấy từ đầu tiên trong chuỗi python. Chúng tôi sẽ sử dụng cách lấy từ đầu tiên từ chuỗi trong python

Trong ví dụ này, tôi sẽ thêm biến myString với chuỗi hello. Sau đó, chúng ta sẽ sử dụng hàm split[] để lấy từ đầu tiên từ chuỗi trong python. Vì vậy, không cần phải quảng cáo thêm, hãy xem các ví dụ đơn giản. Bạn có thể sử dụng các ví dụ này với phiên bản python3 [Python 3]

PEP này đề xuất một hệ thống mới cho các hoạt động định dạng chuỗi tích hợp, nhằm mục đích thay thế cho toán tử định dạng chuỗi '%' hiện có

Python hiện cung cấp hai phương thức nội suy chuỗi

  • Toán tử '%' cho chuỗi.
  • chuỗi. mô-đun mẫu.

Phạm vi chính của PEP này liên quan đến các đề xuất cho các hoạt động định dạng chuỗi tích hợp [nói cách khác, các phương thức của loại chuỗi tích hợp]

Toán tử '%' chủ yếu bị giới hạn bởi thực tế nó là toán tử nhị phân và do đó có thể nhận tối đa hai đối số. Một trong những đối số đó đã được dành riêng cho chuỗi định dạng, khiến tất cả các biến khác bị ép vào đối số còn lại. Thực tiễn hiện tại là sử dụng từ điển hoặc bộ dữ liệu làm đối số thứ hai, nhưng như nhiều người đã nhận xét, điều này thiếu tính linh hoạt. Cách tiếp cận “tất cả hoặc không có gì” [có nghĩa là người ta phải chọn giữa chỉ các đối số theo vị trí hoặc chỉ các đối số được đặt tên] được cho là quá hạn chế

Mặc dù có một số trùng lặp giữa đề xuất này và chuỗi. Mẫu, có cảm giác rằng mỗi cái phục vụ một nhu cầu riêng biệt và cái này không cản trở cái kia. Đề xuất này dành cho một cơ chế, chẳng hạn như '%', hiệu quả đối với các chuỗi nhỏ chỉ được sử dụng một lần, vì vậy, chẳng hạn, việc biên dịch một chuỗi thành một mẫu không được dự tính trong đề xuất này, mặc dù đề xuất này quan tâm đến

Đặc điểm kỹ thuật sẽ bao gồm các phần sau

  • Đặc tả phương thức định dạng mới sẽ được thêm vào lớp chuỗi dựng sẵn
  • Đặc tả chức năng và giá trị cờ sẽ được thêm vào mô-đun chuỗi để có thể sử dụng công cụ định dạng cơ bản với các tùy chọn bổ sung
  • Đặc tả cú pháp mới cho chuỗi định dạng
  • Đặc điểm kỹ thuật của một tập hợp các phương thức đặc biệt mới để kiểm soát việc định dạng và chuyển đổi các đối tượng
  • Đặc tả API cho các lớp định dạng do người dùng định nghĩa
  • Đặc tả cách xử lý lỗi định dạng

Lưu ý về mã hóa chuỗi. Khi thảo luận về PEP này trong ngữ cảnh của Python 3. 0, người ta cho rằng tất cả các chuỗi đều là chuỗi unicode và việc sử dụng từ 'chuỗi' trong ngữ cảnh của tài liệu này thường đề cập đến Python 3. 0, giống như Python 2. x đối tượng unicode

Trong ngữ cảnh của Python 2. x, việc sử dụng từ 'chuỗi' trong tài liệu này đề cập đến một đối tượng có thể là một chuỗi thông thường hoặc một đối tượng unicode. Tất cả các giao diện gọi hàm được mô tả trong PEP này có thể được sử dụng cho cả đối tượng chuỗi và đối tượng unicode và trong mọi trường hợp đều có đủ thông tin để có thể suy ra đúng loại chuỗi đầu ra [nói cách khác, không cần hai giao diện riêng biệt]. . Trong mọi trường hợp, loại của chuỗi định dạng chiếm ưu thế - nghĩa là kết quả của việc chuyển đổi sẽ luôn dẫn đến một đối tượng chứa cùng biểu diễn các ký tự như chuỗi định dạng đầu vào

Lớp chuỗi dựng sẵn [và cả lớp unicode trong 2. 6] sẽ nhận được một phương thức mới, 'định dạng', lấy một số đối số từ khóa và vị trí tùy ý

"The story of {0}, {1}, and {c}".format[a, b, c=d]

Trong một chuỗi định dạng, mỗi đối số vị trí được xác định bằng một số, bắt đầu từ 0, vì vậy trong ví dụ trên, 'a' là đối số 0 và 'b' là đối số 1. Mỗi đối số từ khóa được xác định bằng tên từ khóa của nó, vì vậy trong ví dụ trên, 'c' được sử dụng để chỉ đối số thứ ba

Ngoài ra còn có một chức năng tích hợp toàn cầu, 'định dạng' định dạng một giá trị duy nhất

print[format[10.0, "7.3g"]]

Chức năng này được mô tả trong phần sau

Chuỗi định dạng bao gồm dữ liệu ký tự xen kẽ và đánh dấu

Dữ liệu ký tự là dữ liệu được truyền không thay đổi từ chuỗi định dạng sang chuỗi đầu ra;

Các ký tự dấu ngoặc nhọn ['dấu ngoặc nhọn'] được sử dụng để biểu thị trường thay thế trong chuỗi

"My name is {0}".format['Fred']

Kết quả của việc này là chuỗi

"My name is Fred"

Niềng răng có thể được thoát bằng cách nhân đôi

"My name is {0} :-{{}}".format['Fred']

Mà sẽ sản xuất

"My name is Fred :-{}"

Phần tử trong dấu ngoặc nhọn được gọi là 'trường'. Các trường bao gồm một 'tên trường', có thể đơn giản hoặc phức hợp và một 'công cụ xác định định dạng' tùy chọn

Tên trường đơn giản là tên hoặc số. Nếu là số, chúng phải là số nguyên cơ số 10 hợp lệ; . Một số được sử dụng để xác định đối số vị trí, trong khi tên được sử dụng để xác định đối số từ khóa

Tên trường ghép là sự kết hợp của nhiều tên trường đơn giản trong một biểu thức

________số 8

Ví dụ này cho thấy việc sử dụng toán tử 'getattr' hoặc 'dot' trong một biểu thức trường. Toán tử dấu chấm cho phép một thuộc tính của giá trị đầu vào được chỉ định làm giá trị trường

Không giống như một số ngôn ngữ lập trình khác, bạn không thể nhúng các biểu thức tùy ý vào chuỗi định dạng. Đây là do thiết kế - các loại biểu thức mà bạn có thể sử dụng bị hạn chế có chủ ý. Chỉ có hai toán tử được hỗ trợ. các '. ’ [getattr] và toán tử ‘[]’ [getitem]. Lý do cho phép các toán tử này là vì chúng thường không có tác dụng phụ trong mã không bệnh lý

Một ví dụ về cú pháp 'getitem'

"My name is {0[name]}".format[dict[name='Fred']]

Cần lưu ý rằng việc sử dụng 'getitem' trong chuỗi định dạng bị hạn chế hơn nhiều so với cách sử dụng thông thường của nó. Trong ví dụ trên, chuỗi 'tên' thực sự là chuỗi ký tự 'tên', không phải là một biến có tên 'tên'. Các quy tắc để phân tích khóa mục rất đơn giản. Nếu nó bắt đầu bằng một chữ số, thì nó được coi là một số, ngược lại, nó được sử dụng như một chuỗi

Vì các khóa không được phân tách bằng dấu ngoặc kép nên không thể chỉ định các khóa từ điển tùy ý [e. g. , chuỗi “10” hoặc “. -]”] từ bên trong một chuỗi định dạng

lưu ý thực hiện. Việc triển khai đề xuất này là không bắt buộc để thực thi quy tắc về một tên đơn giản hoặc có dấu chấm là một mã định danh Python hợp lệ. Thay vào đó, nó sẽ dựa vào hàm getattr của đối tượng bên dưới để đưa ra một ngoại lệ nếu mã định danh không hợp lệ. Hàm

"My name is {0}".format['Fred']
8 sẽ có một trình phân tích cú pháp tối giản chỉ cố gắng tìm ra thời điểm nó được "xong" với một mã định danh [bằng cách tìm một '. ' hoặc ']' hoặc '}', v.v. ]

Mỗi trường cũng có thể chỉ định một bộ 'chỉ định định dạng' tùy chọn có thể được sử dụng để điều chỉnh định dạng của trường đó. Định dạng xác định theo tên trường, với dấu hai chấm [‘. ’] ký tự ngăn cách hai


#string
string = "python is a great language"

#convert string to list and get the first item
first_world = string.split[][0]

#print
print[first_world]

1

Ý nghĩa và cú pháp của các bộ xác định định dạng phụ thuộc vào loại đối tượng đang được định dạng, nhưng có một bộ bộ xác định định dạng tiêu chuẩn được sử dụng cho bất kỳ đối tượng nào không ghi đè chúng

Bản thân các định dạng định dạng có thể chứa các trường thay thế. Ví dụ: một trường có chiều rộng trường chính là một tham số có thể được chỉ định thông qua


#string
string = "python is a great language"

#convert string to list and get the first item
first_world = string.split[][0]

#print
print[first_world]

2

Các trường thay thế 'nội bộ' này chỉ có thể xuất hiện trong phần xác định định dạng của trường thay thế. Các trường thay thế nội bộ không thể tự xác định định dạng. Điều này cũng ngụ ý rằng các trường thay thế không thể được lồng vào các mức tùy ý

Lưu ý rằng '}' được nhân đôi ở cuối, thường được thoát, không được thoát trong trường hợp này. Lý do là vì cú pháp thoát '{{' và '}}' chỉ được áp dụng khi được sử dụng bên ngoài trường định dạng. Trong một trường định dạng, các ký tự ngoặc nhọn luôn có ý nghĩa bình thường

Cú pháp của các bộ xác định định dạng là kết thúc mở, vì một lớp có thể ghi đè lên các bộ xác định định dạng tiêu chuẩn. Trong những trường hợp như vậy, phương thức

"My name is {0}".format['Fred']
8 chỉ chuyển tất cả các ký tự giữa dấu hai chấm đầu tiên và dấu ngoặc nhọn phù hợp sang phương thức định dạng cơ bản có liên quan

Nếu một đối tượng không xác định định dạng định dạng riêng của nó, thì một bộ xác định định dạng tiêu chuẩn sẽ được sử dụng. Về khái niệm, chúng tương tự như các định dạng định dạng được sử dụng bởi toán tử '%' hiện có, tuy nhiên cũng có một số điểm khác biệt

Hình thức chung của một công cụ xác định định dạng tiêu chuẩn là

print[format[10.0, "7.3g"]]
0

Dấu ngoặc [[]] chỉ ra một yếu tố tùy chọn

Sau đó, cờ căn chỉnh tùy chọn có thể là một trong những điều sau đây

print[format[10.0, "7.3g"]]
1

Lưu ý rằng trừ khi độ 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, do đó, tùy chọn căn chỉnh không có ý nghĩa gì trong trường hợp này

Ký tự 'điền' tùy chọn xác định ký tự được sử dụng để đệm trường theo chiều rộng tối thiểu. Ký tự điền, nếu có, phải được theo sau bởi cờ căn chỉnh

Tùy chọn 'ký' chỉ hợp lệ đối với các loại số và có thể là một trong các loại sau

print[format[10.0, "7.3g"]]
2

Nếu có ký tự '#', các số nguyên sẽ sử dụng 'dạng thay thế' để định dạng. Điều này có nghĩa là đầu ra nhị phân, bát phân và thập lục phân sẽ có tiền tố tương ứng là '0b', '0o' và '0x'

'chiều rộng' là một số nguyên thập phân xác định chiều rộng trường tối thiểu. Nếu không được chỉ định, thì độ rộng trường sẽ được xác định bởi nội dung

Nếu trường chiều rộng được bắt đầu bằng ký tự số 0 [‘0’], điều này cho phép tính năng đệm bằng 0. Điều này tương đương với kiểu căn chỉnh là '=' và ký tự điền là '0'

'Độ chính xác' là một số thập phân cho biết có bao nhiêu chữ số sẽ được hiển thị sau dấu thập phân trong chuyển đổi dấu phẩy động. Đối với các loại không phải là số, trường cho biết kích thước trường tối đa - nói cách khác, có bao nhiêu ký tự sẽ được sử dụng từ nội dung trường. Độ chính xác bị bỏ qua đối với chuyển đổi số nguyên

Cuối cùng, 'loại' xác định cách trình bày dữ liệu

Các kiểu trình bày số nguyên có sẵn là

print[format[10.0, "7.3g"]]
3

Các loại bản trình bày dấu phẩy động có sẵn là

print[format[10.0, "7.3g"]]
4

Các đối tượng có thể xác định các định dạng định dạng của riêng chúng để thay thế các định dạng tiêu chuẩn. Một ví dụ là lớp 'datetime', có các chỉ định định dạng có thể trông giống như các đối số của hàm

"My name is Fred"
0

print[format[10.0, "7.3g"]]
5

Đối với tất cả các loại tích hợp sẵn, một đặc tả định dạng trống sẽ tạo ra giá trị tương đương của

"My name is Fred"
1. Các đối tượng xác định định dạng định dạng riêng của chúng cũng nên tuân theo quy ước này

Cờ chuyển đổi rõ ràng được sử dụng để chuyển đổi giá trị trường định dạng trước khi nó được định dạng. Điều này có thể được sử dụng để ghi đè hành vi định dạng theo loại cụ thể và định dạng giá trị như thể đó là một loại chung chung hơn. Hiện tại, hai cờ chuyển đổi rõ ràng được công nhận

print[format[10.0, "7.3g"]]
6

Các cờ này được đặt trước định dạng định dạng

print[format[10.0, "7.3g"]]
7

Trong ví dụ trước, chuỗi “Xin chào” sẽ được in cùng với dấu ngoặc kép trong một trường có độ rộng ít nhất là 20 ký tự

Lớp Trình định dạng tùy chỉnh có thể xác định các cờ chuyển đổi bổ sung. Trình định dạng tích hợp sẽ tăng ValueError nếu cờ chuyển đổi không hợp lệ được chỉ định

Mỗi loại Python có thể kiểm soát định dạng của các phiên bản của nó bằng cách xác định phương thức

"My name is Fred"
2. Phương thức
"My name is Fred"
2 chịu trách nhiệm giải thích trình xác định định dạng, định dạng giá trị và trả về chuỗi kết quả

Hàm 'định dạng' tích hợp toàn cầu mới chỉ đơn giản gọi phương thức đặc biệt này, tương tự như cách

"My name is Fred"
4 và
"My name is Fred"
5 đơn giản gọi các phương thức đặc biệt tương ứng của chúng

print[format[10.0, "7.3g"]]
8

Sẽ an toàn khi gọi hàm này với giá trị là “None” [vì giá trị “None” trong Python là một đối tượng và có thể có các phương thức. ]

Một số loại tích hợp, bao gồm 'str', 'int', 'float' và 'object' xác định các phương thức

"My name is Fred"
2. Điều này có nghĩa là nếu bạn xuất phát từ bất kỳ loại nào trong số đó, lớp của bạn sẽ biết cách tự định dạng

Phương pháp

"My name is Fred"
7 là đơn giản nhất. Nó chỉ đơn giản là chuyển đổi đối tượng thành một chuỗi, sau đó gọi lại định dạng

print[format[10.0, "7.3g"]]
9

Các phương thức

"My name is Fred"
2 cho 'int' và 'float' sẽ thực hiện định dạng số dựa trên trình xác định định dạng. Trong một số trường hợp, các thao tác định dạng này có thể được ủy quyền cho các loại khác. Vì vậy, ví dụ, trong trường hợp trình định dạng 'int' nhìn thấy loại định dạng 'f' [có nghĩa là 'float'], nó có thể chỉ cần chuyển giá trị thành float và gọi lại
"My name is Fred"
9

Bất kỳ lớp nào cũng có thể ghi đè phương thức

"My name is Fred"
2 để cung cấp định dạng tùy chỉnh cho loại đó

"My name is {0}".format['Fred']
0

Lưu ý cho Python 2. x. Đối số 'format_spec' sẽ là đối tượng chuỗi hoặc đối tượng unicode, tùy thuộc vào loại chuỗi định dạng gốc. Phương thức

"My name is Fred"
2 sẽ kiểm tra loại tham số specifiers để xác định xem có trả về một chuỗi hoặc đối tượng unicode hay không. Trách nhiệm của phương thức
"My name is Fred"
2 là trả về một đối tượng thuộc loại phù hợp

Lưu ý rằng cờ 'chuyển đổi rõ ràng' được đề cập ở trên không được chuyển cho phương thức

"My name is Fred"
2. Thay vào đó, chuyển đổi được chỉ định bởi cờ sẽ được thực hiện trước khi gọi
"My name is Fred"
2

Sẽ có lúc việc tùy chỉnh định dạng của các trường trên cơ sở từng loại là không đủ. Một ví dụ có thể là một ứng dụng bảng tính, ứng dụng này hiển thị các dấu băm '#' khi một giá trị quá lớn để vừa với không gian có sẵn

Để có định dạng mạnh mẽ và linh hoạt hơn, có thể truy cập vào công cụ định dạng cơ bản thông qua lớp 'Trình định dạng' nằm trong mô-đun 'chuỗi'. Lớp này có các tùy chọn bổ sung không thể truy cập thông qua str bình thường. phương pháp định dạng

Một ứng dụng có thể phân lớp lớp Formatter để tạo hành vi định dạng tùy chỉnh của riêng nó

PEP không cố gắng chỉ định chính xác tất cả các phương thức và thuộc tính được định nghĩa bởi lớp

"My name is {0} :-{{}}".format['Fred']
5; . Tuy nhiên, PEP này sẽ chỉ định các yêu cầu chung cho lớp
"My name is {0} :-{{}}".format['Fred']
5, được liệt kê bên dưới

Mặc dù

"My name is {0} :-{{}}".format['Fred']
7 không trực tiếp sử dụng lớp
"My name is {0} :-{{}}".format['Fred']
5 để thực hiện định dạng, nhưng cả hai đều sử dụng cùng một triển khai cơ bản. Lý do mà
"My name is {0} :-{{}}".format['Fred']
7 không sử dụng trực tiếp lớp
"My name is {0} :-{{}}".format['Fred']
5 là vì “string” là một kiểu dựng sẵn, có nghĩa là tất cả các phương thức của nó phải được triển khai trong C, trong khi đó
"My name is {0} :-{{}}".format['Fred']
5 là một lớp Python.
"My name is {0} :-{{}}".format['Fred']
5 cung cấp một trình bao bọc có thể mở rộng xung quanh các hàm C giống như được sử dụng bởi
"My name is {0} :-{{}}".format['Fred']
7

Lớp

"My name is {0} :-{{}}".format['Fred']
5 không có đối số khởi tạo

"My name is {0}".format['Fred']
1

Các phương thức API công khai của lớp

"My name is {0} :-{{}}".format['Fred']
5 như sau

"My name is {0}".format['Fred']
2

'format' là phương thức API chính. Nó có một mẫu định dạng và một tập hợp tùy ý các đối số vị trí và từ khóa. 'format' chỉ là một trình bao bọc gọi 'vformat'

'vformat' là chức năng thực hiện công việc định dạng thực tế. Nó được hiển thị dưới dạng một hàm riêng biệt cho các trường hợp bạn muốn chuyển vào một từ điển các đối số được xác định trước, thay vì giải nén và đóng gói lại từ điển dưới dạng các đối số riêng lẻ bằng cách sử dụng cú pháp

"My name is Fred :-{}"
6 và
"My name is Fred :-{}"
7. 'vformat' thực hiện công việc chia chuỗi mẫu định dạng thành dữ liệu ký tự và các trường thay thế. Nó gọi các phương thức 'get_positional' và 'get_index' khi thích hợp [được mô tả bên dưới. ]

"My name is {0} :-{{}}".format['Fred']
5 định nghĩa các phương thức có thể ghi đè sau

"My name is {0}".format['Fred']
3

'get_value' được sử dụng để truy xuất một giá trị trường đã cho. Đối số 'key' 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ỉ mục của đối số vị trí trong 'args';

Tham số 'args' được đặt thành danh sách các đối số vị trí thành 'vformat' và tham số 'kwargs' được đặt thành từ điển các đối số vị trí

Đối với tên trường ghép, các hàm này chỉ được gọi cho thành phần đầu tiên của tên trường;

Vì vậy, ví dụ, biểu thức trường '0. name' sẽ khiến 'get_value' được gọi với đối số 'key' là 0. Thuộc tính ‘name’ sẽ được tra cứu sau khi trả về ‘get_value’ bằng cách gọi hàm ‘getattr’ 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 tăng

"My name is Fred :-{}"
9

‘check_unused_args’ được sử dụng để triển khai kiểm tra các đối số không sử dụng nếu muốn. Đối số của hàm này là tập hợp tất cả các khóa đối số thực sự được tham chiếu trong chuỗi định dạng [số nguyên cho đối số vị trí và chuỗi cho đối số được đặt tên] và tham chiếu đến đối số và kwargs đã được chuyển đến vformat. Tập hợp các đối số không sử dụng có thể được tính từ các tham số này. 'check_unused_args' được cho là ném ngoại lệ nếu kiểm tra không thành công

'format_field' chỉ cần gọi tích hợp 'định dạng' chung. Phương thức được cung cấp để các lớp con có thể ghi đè lên nó

Để hiểu rõ hơn về cách các chức năng này liên quan với nhau, đây là mã giả giải thích hoạt động chung của vformat

"My name is {0}".format['Fred']
4

Lưu ý rằng thuật toán thực tế của lớp Formatter [sẽ được triển khai trong C] có thể không phải là thuật toán được trình bày ở đây. [Có vẻ như việc triển khai thực tế hoàn toàn không phải là một 'lớp' - thay vào đó, vformat có thể chỉ gọi một hàm C chấp nhận các phương thức có thể ghi đè khác làm đối số. ] Mục đích chính của ví dụ mã này là để minh họa thứ tự các phương thức có thể ghi đè được gọi

Phần này mô tả một số cách điển hình mà các đối tượng Trình định dạng có thể được tùy chỉnh

Để hỗ trợ cú pháp chuỗi định dạng thay thế, phương thức 'vformat' có thể được ghi đè để thay đổi cách phân tích chuỗi định dạng

Một mong muốn phổ biến là hỗ trợ không gian tên 'mặc định', do đó bạn không cần chuyển các đối số từ khóa cho phương thức

"My name is Fred"
9 mà thay vào đó có thể sử dụng các giá trị trong không gian tên có sẵn. Điều này có thể dễ dàng được thực hiện bằng cách ghi đè
"My name is {0.name}".format[open['out.txt', 'w']]
1 như sau

"My name is {0}".format['Fred']
5

Ví dụ, người ta có thể sử dụng điều này để dễ dàng tạo một hàm định dạng cho phép truy cập vào các biến toàn cục

"My name is {0}".format['Fred']
6

Một kỹ thuật tương tự có thể được thực hiện với từ điển

"My name is {0.name}".format[open['out.txt', 'w']]
2 để có quyền truy cập vào từ điển địa phương

Cũng có thể tạo một trình định dạng không gian tên 'thông minh' có thể tự động truy cập cả cục bộ và toàn cầu thông qua rình mò ngăn xếp cuộc gọi. Do nhu cầu tương thích với các phiên bản Python khác nhau, khả năng như vậy sẽ không được đưa vào thư viện tiêu chuẩn, tuy nhiên, người ta dự đoán rằng ai đó sẽ tạo và xuất bản một công thức để thực hiện việc này

Một loại tùy chỉnh khác là thay đổi cách định dạng các loại tích hợp bằng cách ghi đè phương thức 'format_field'. [Đối với các loại không tích hợp sẵn, bạn có thể chỉ cần xác định một phương thức đặc biệt

"My name is Fred"
2 trên loại đó. ] Vì vậy, chẳng hạn, bạn có thể ghi đè định dạng số để xuất ký hiệu khoa học khi cần

Có hai loại ngoại lệ có thể xảy ra trong quá trình định dạng. ngoại lệ được tạo bởi chính mã trình định dạng và ngoại lệ được tạo bởi mã người dùng [chẳng hạn như hàm 'getattr' của đối tượng trường]

Nói chung, các ngoại lệ do chính mã trình định dạng tạo ra thuộc loại “Lỗi giá trị” – có lỗi trong “giá trị” thực của chuỗi định dạng. [Điều này không phải lúc nào cũng đúng; ví dụ: hàm

"My name is {0} :-{{}}".format['Fred']
7 có thể được truyền một giá trị không phải chuỗi làm tham số đầu tiên, điều này sẽ dẫn đến kết quả là
"My name is {0.name}".format[open['out.txt', 'w']]
5. ]

Văn bản được liên kết với các ngoại lệ

"My name is {0.name}".format[open['out.txt', 'w']]
6 được tạo nội bộ này sẽ cho biết vị trí của ngoại lệ bên trong chuỗi định dạng, cũng như bản chất của ngoại lệ

Đối với các trường hợp ngoại lệ do mã người dùng tạo ra, một bản ghi theo dõi và khung giả sẽ được thêm vào ngăn xếp theo dõi để giúp xác định vị trí trong chuỗi xảy ra trường hợp ngoại lệ. Tracback được chèn sẽ chỉ ra rằng lỗi xảy ra tại

"My name is {0}".format['Fred']
7

trong đó XX và YY lần lượt biểu thị thông tin vị trí dòng và ký tự trong chuỗi

Đương nhiên, một trong những vấn đề gây tranh cãi nhất là cú pháp của các chuỗi định dạng và đặc biệt là các quy ước đánh dấu được sử dụng để chỉ ra các trường

Thay vì cố gắng liệt kê đầy đủ tất cả các đề xuất khác nhau, tôi sẽ đề cập đến những đề xuất đã được sử dụng rộng rãi nhất

  • Cú pháp biến Shell.
    "My name is {0.name}".format[open['out.txt', 'w']]
    
    7 và
    "My name is {0.name}".format[open['out.txt', 'w']]
    
    8 [hoặc trong một số biến thể,
    "My name is {0.name}".format[open['out.txt', 'w']]
    
    9]. Đây có lẽ là quy ước lâu đời nhất hiện có và được sử dụng bởi Perl và nhiều người khác. Khi được sử dụng mà không có dấu ngoặc nhọn, độ dài của biến được xác định bằng cách quét từ vựng cho đến khi tìm thấy ký tự không hợp lệ

    Sơ đồ này thường được sử dụng trong các trường hợp mà nội suy là ẩn - nghĩa là trong các môi trường mà bất kỳ chuỗi nào cũng có thể chứa các biến nội suy và không cần gọi hàm thay thế đặc biệt. Trong những trường hợp như vậy, điều quan trọng là phải ngăn hành vi nội suy vô tình xảy ra, do đó, '$' [mặt khác là một ký tự tương đối ít được sử dụng] được sử dụng để báo hiệu khi nào hành vi sẽ xảy ra

    Tuy nhiên, theo ý kiến ​​của tác giả, trong trường hợp định dạng được gọi rõ ràng, thì cần ít quan tâm hơn để ngăn chặn nội suy ngẫu nhiên, trong trường hợp đó có thể sử dụng cú pháp nhẹ hơn và ít khó sử dụng hơn

  • printf và những người anh em họ của nó [‘%’], bao gồm các biến thể thêm chỉ mục trường, để các trường có thể được nội suy không theo thứ tự
  • Các biến thể chỉ có dấu ngoặc đơn khác. Nhiều MUD khác nhau [Hầm ngục nhiều người dùng] như MUSH đã sử dụng dấu ngoặc [e. g.
    "My name is {0[name]}".format[dict[name='Fred']]
    
    0] để thực hiện phép nội suy chuỗi. Microsoft. Các thư viện Net sử dụng dấu ngoặc nhọn [
    "My name is {0[name]}".format[dict[name='Fred']]
    
    1] và một cú pháp rất giống với cú pháp trong đề xuất này, mặc dù cú pháp cho các chỉ định định dạng khá khác nhau.
  • trích dẫn ngược. Phương thức này có ưu điểm là giảm thiểu sự lộn xộn về mặt cú pháp, tuy nhiên nó lại thiếu nhiều lợi ích của cú pháp gọi hàm [chẳng hạn như đối số biểu thức phức tạp, trình định dạng tùy chỉnh, v.v. ]
  • Các biến thể khác bao gồm
    "My name is {0[name]}".format[dict[name='Fred']]
    
    2 của Ruby,
    "My name is {0[name]}".format[dict[name='Fred']]
    
    3 của PHP, v.v.

Một số khía cạnh cụ thể của cú pháp đảm bảo nhận xét bổ sung

1] Ký tự dấu gạch chéo ngược để thoát. Phiên bản gốc của PEP này đã sử dụng dấu gạch chéo ngược thay vì nhân đôi để thoát khỏi dấu ngoặc. Điều này hoạt động vì dấu gạch chéo ngược trong chuỗi ký tự Python không tuân theo chuỗi dấu gạch chéo ngược tiêu chuẩn, chẳng hạn như

"My name is {0[name]}".format[dict[name='Fred']]
4 không được sửa đổi. Tuy nhiên, điều này gây ra một số nhầm lẫn nhất định và dẫn đến các tình huống tiềm ẩn của nhiều lần thoát đệ quy, tôi. e.
"My name is {0[name]}".format[dict[name='Fred']]
5 để đặt dấu gạch chéo ngược theo nghĩa đen trước dấu ngoặc

2] Việc sử dụng ký tự dấu hai chấm [‘. ’] làm dấu phân cách cho các bộ xác định định dạng. Điều này đã được chọn đơn giản bởi vì đó là những gì. sử dụng ròng

Hạn chế quyền truy cập thuộc tính. Phiên bản trước của PEP đã hạn chế khả năng truy cập các thuộc tính bắt đầu bằng dấu gạch dưới ở đầu, ví dụ: “{0}. _riêng". Tuy nhiên, đây là một khả năng hữu ích khi gỡ lỗi, vì vậy tính năng này đã bị loại bỏ

Một số nhà phát triển đề xuất rằng nên loại bỏ hoàn toàn khả năng truy cập 'getattr' và 'getitem'. Tuy nhiên, điều này mâu thuẫn với nhu cầu của một nhóm nhà phát triển khác, những người đã vận động hành lang mạnh mẽ để có khả năng chuyển một lệnh lớn thành một đối số duy nhất [không làm phẳng nó thành các đối số từ khóa riêng lẻ bằng cách sử dụng cú pháp

"My name is {0[name]}".format[dict[name='Fred']]
6] và sau đó có tham chiếu chuỗi định dạng

Cũng đã có đề xuất mở rộng tập hợp các biểu thức được phép trong một chuỗi định dạng. Tuy nhiên, điều này được cho là đi ngược lại tinh thần của TOOWTDI, vì hiệu quả tương tự có thể đạt được trong hầu hết các trường hợp bằng cách thực hiện cùng một biểu thức trên tham số trước khi nó được chuyển đến hàm định dạng. Đối với các trường hợp chuỗi định dạng đang được sử dụng để thực hiện định dạng tùy ý trong môi trường giàu dữ liệu, bạn nên sử dụng một công cụ mẫu chuyên dụng cho mục đích này, chẳng hạn như Genshi hoặc Cheetah

Nhiều tính năng khác đã được xem xét và từ chối vì chúng có thể dễ dàng đạt được bằng cách phân lớp con

"My name is {0} :-{{}}".format['Fred']
5 thay vì xây dựng tính năng này trong quá trình triển khai cơ sở. Điều này bao gồm cú pháp thay thế, nhận xét trong chuỗi định dạng và nhiều thứ khác

Trước đây, định dạng chuỗi là một nguồn lỗ hổng bảo mật phổ biến trong các ứng dụng dựa trên web, đặc biệt nếu hệ thống định dạng chuỗi cho phép các biểu thức tùy ý được nhúng trong chuỗi định dạng

Cách tốt nhất để sử dụng định dạng chuỗi theo cách không tạo ra các lỗ hổng bảo mật tiềm ẩn là không bao giờ sử dụng các chuỗi định dạng đến từ một nguồn không đáng tin cậy

Ngoài ra, cách tiếp cận tốt nhất tiếp theo là đảm bảo rằng định dạng chuỗi không có tác dụng phụ. Do tính chất mở của Python, không thể đảm bảo rằng mọi hoạt động không tầm thường đều có thuộc tính này. Những gì PEP này làm là giới hạn các loại biểu thức trong chuỗi định dạng thành những loại trong đó các tác dụng phụ có thể nhìn thấy đều hiếm và không được khuyến khích bởi văn hóa của các nhà phát triển Python. Vì vậy, ví dụ, quyền truy cập thuộc tính được cho phép vì việc viết mã sẽ bị coi là bệnh lý khi chỉ truy cập một thuộc tính có tác dụng phụ có thể nhìn thấy [liệu mã có tác dụng phụ không nhìn thấy được hay không - chẳng hạn như tạo mục nhập bộ đệm để tra cứu nhanh hơn - là không liên quan. ]

Việc triển khai phiên bản cũ hơn của PEP này được tạo bởi Patrick Maupin và Eric V. Smith và có thể được tìm thấy trong hộp cát pep3101 tại

http. //svn. con trăn. org/view/sandbox/trunk/pep3101/

Khả năng tương thích ngược có thể được duy trì bằng cách giữ nguyên các cơ chế hiện có. Hệ thống mới không xung đột với bất kỳ tên phương thức nào của các kỹ thuật định dạng chuỗi hiện có, vì vậy cả hai hệ thống có thể cùng tồn tại cho đến khi hệ thống cũ ngừng hoạt động.

Chủ Đề