Thay thế cho chuỗi f Python

Cam kết này không thuộc về bất kỳ nhánh nào trên kho lưu trữ này và có thể thuộc về một nhánh bên ngoài kho lưu trữ

Bạn không thể thực hiện hành động đó vào lúc này

Bạn đã đăng nhập bằng tab hoặc cửa sổ khác. Tải lại để làm mới phiên của bạn. Bạn đã đăng xuất trong một tab hoặc cửa sổ khác. Tải lại để làm mới phiên của bạn

Python hỗ trợ nhiều cách để định dạng chuỗi văn bản. Chúng bao gồm %-formatting ,

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
2. Mỗi phương pháp này đều có những ưu điểm nhưng bên cạnh đó cũng có những nhược điểm khiến chúng trở nên cồng kềnh khi sử dụng trong thực tế. PEP này đã đề xuất thêm một cơ chế định dạng chuỗi mới. Nội suy chuỗi ký tự. Trong PEP này, các chuỗi như vậy sẽ được gọi là "chuỗi f", được lấy từ ký tự đầu được sử dụng để biểu thị các chuỗi đó và là viết tắt của "chuỗi được định dạng"

PEP này không đề xuất loại bỏ hoặc loại bỏ bất kỳ cơ chế định dạng chuỗi hiện có nào

Chuỗi F cung cấp một cách để nhúng các biểu thức bên trong chuỗi ký tự, sử dụng cú pháp tối thiểu. Cần lưu ý rằng chuỗi f thực sự là một biểu thức được đánh giá trong thời gian chạy, không phải là một giá trị không đổi. Trong mã nguồn Python, chuỗi f là một chuỗi ký tự, có tiền tố là 'f', chứa các biểu thức bên trong dấu ngoặc nhọn. Các biểu thức được thay thế bằng các giá trị của chúng. Một số ví dụ

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

Một tính năng tương tự đã được đề xuất trong PEP 215. PEP 215 đã đề xuất hỗ trợ một tập hợp con các biểu thức Python và không hỗ trợ định dạng chuỗi dành riêng cho loại [phương thức

>>> 'The value is {}.'.format[value]
'The value is 80.'
3] được giới thiệu với PEP 3101

PEP này được thúc đẩy bởi mong muốn có một cách đơn giản hơn để định dạng chuỗi trong Python. Các cách định dạng hiện tại dễ bị lỗi, không linh hoạt hoặc rườm rà

%-formatting bị giới hạn đối với các loại mà nó hỗ trợ. Chỉ có thể định dạng ints, strs và doubles. Tất cả các loại khác không được hỗ trợ hoặc được chuyển đổi thành một trong các loại này trước khi định dạng. Ngoài ra, có một cái bẫy nổi tiếng trong đó một giá trị duy nhất được chuyển

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'

Nhưng nếu msg đã từng là một bộ, mã tương tự sẽ thất bại

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting

Để phòng thủ, mã sau đây nên được sử dụng

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 đã được thêm vào để giải quyết một số vấn đề này với %-formatting. Đặc biệt, nó sử dụng cú pháp gọi hàm thông thường [và do đó hỗ trợ nhiều tham số] và nó có thể mở rộng thông qua phương thức
>>> 'The value is {}.'.format[value]
'The value is 80.'
3 trên đối tượng được chuyển đổi thành chuỗi. Xem PEP 3101 để biết lý do chi tiết. PEP này sử dụng lại phần lớn cú pháp và máy móc của
>>> 'The value is {}.'.format[value]
'The value is 80.'
1, để cung cấp tính liên tục với cơ chế định dạng chuỗi Python hiện có

Tuy nhiên,

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 không phải là không có vấn đề. Đứng đầu trong số đó là tính dài dòng của nó. Ví dụ, văn bản
>>> 'The value is {}.'.format[value]
'The value is 80.'
8 được lặp lại ở đây

>>> 'The value is {}.'.format[value]
'The value is 80.'
2

Ngay cả ở dạng đơn giản nhất cũng có một chút bản mẫu và giá trị được chèn vào trình giữ chỗ đôi khi bị loại bỏ xa khỏi vị trí của trình giữ chỗ

>>> 'The value is {}.'.format[value]
'The value is 80.'

Với một chuỗi f, điều này trở thành

>>> 'The value is {}.'.format[value]
'The value is 80.'
4

Chuỗi F cung cấp một cách ngắn gọn, dễ đọc để bao gồm giá trị của biểu thức Python bên trong chuỗi

Theo nghĩa này,

>>> 'The value is {}.'.format[value]
'The value is 80.'
2 và %-formatting có những thiếu sót tương tự như
>>> 'The value is {}.'.format[value]
'The value is 80.'
1, nhưng cũng hỗ trợ ít tùy chọn định dạng hơn. Đặc biệt, chúng không hỗ trợ giao thức
>>> 'The value is {}.'.format[value]
'The value is 80.'
41, do đó không có cách nào kiểm soát cách một đối tượng cụ thể được chuyển đổi thành chuỗi, cũng như không thể mở rộng sang các loại bổ sung muốn kiểm soát cách chúng được chuyển đổi thành chuỗi [chẳng hạn như . Ví dụ này không khả thi với
>>> 'The value is {}.'.format[value]
'The value is 80.'
2

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
1

Và cả %-formatting lẫn

>>> 'The value is {}.'.format[value]
'The value is 80.'
2 đều không thể kiểm soát định dạng như

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
3

Trong các cuộc thảo luận về python-dev , một số giải pháp được trình bày đã sử dụng locals[] và globals[] hoặc tương đương của chúng. Tất cả những điều này có nhiều vấn đề khác nhau. Trong số này có các biến tham chiếu không được sử dụng trong một bao đóng. Xem xét

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
4

Điều này trả về lỗi vì trình biên dịch chưa thêm tham chiếu đến x bên trong bao đóng. Bạn cần thêm tham chiếu đến x theo cách thủ công để tính năng này hoạt động

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
0

Ngoài ra, việc sử dụng locals[] hoặc globals[] sẽ gây rò rỉ thông tin. Một thói quen được gọi có quyền truy cập vào người gọi locals[] hoặc globals[] có quyền truy cập vào nhiều thông tin hơn mức cần thiết để thực hiện phép nội suy chuỗi

Guido tuyên bố rằng bất kỳ giải pháp nào để nội suy chuỗi tốt hơn sẽ không sử dụng locals[] hoặc globals[] khi triển khai. [Điều này không cấm người dùng chuyển locals[] hoặc globals[] vào, nó chỉ không yêu cầu và cũng không cho phép sử dụng các chức năng này dưới mui xe. ]

Trong mã nguồn, chuỗi f là chuỗi ký tự có tiền tố là chữ 'f' hoặc 'F'. Ở mọi nơi PEP này sử dụng 'f', 'F' cũng có thể được sử dụng. 'f' có thể được kết hợp với 'r' hoặc 'R', theo một trong hai thứ tự, để tạo ra các chuỗi ký tự f thô. 'f' không được kết hợp với 'b'. PEP này không đề xuất thêm chuỗi f nhị phân. 'f' không được kết hợp với 'u'

Khi mã hóa tệp nguồn, chuỗi f sử dụng các quy tắc giống như chuỗi bình thường, chuỗi thô, chuỗi nhị phân và chuỗi trích dẫn ba. Nghĩa là, chuỗi phải kết thúc bằng cùng một ký tự mà nó bắt đầu bằng. nếu nó bắt đầu bằng một trích dẫn thì nó phải kết thúc bằng một trích dẫn, v.v. Điều này ngụ ý rằng bất kỳ mã nào hiện đang quét mã Python để tìm chuỗi phải có thể sửa đổi tầm thường để nhận ra chuỗi f [tất nhiên, việc phân tích cú pháp trong chuỗi f là một vấn đề khác]

Sau khi được mã hóa, các chuỗi f được phân tích cú pháp thành các chuỗi và biểu thức bằng chữ. Biểu thức xuất hiện trong dấu ngoặc nhọn

>>> 'The value is {}.'.format[value]
'The value is 80.'
46 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
47. Trong khi quét chuỗi để tìm biểu thức, bất kỳ dấu ngoặc kép nào
>>> 'The value is {}.'.format[value]
'The value is 80.'
48 hoặc
>>> 'The value is {}.'.format[value]
'The value is 80.'
49 bên trong các phần ký tự của chuỗi f đều được thay thế bằng dấu ngoặc đơn tương ứng. Dấu ngoặc nhọn mở đôi không biểu thị sự bắt đầu của một biểu thức. Một dấu ngoặc nhọn đóng duy nhất
>>> 'The value is {}.'.format[value]
'The value is 80.'
47 trong phần chữ của chuỗi là một lỗi. Dấu ngoặc nhọn đóng theo nghĩa đen phải được nhân đôi
>>> 'The value is {}.'.format[value]
'The value is 80.'
49 để biểu thị một dấu ngoặc nhọn đóng đơn

Các phần của chuỗi f bên ngoài dấu ngoặc nhọn là chuỗi ký tự. Những phần chữ này sau đó được giải mã. Đối với các chuỗi f không thô, điều này bao gồm chuyển đổi các dấu gạch chéo ngược thoát như

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
12,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
13,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
14,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
15,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
16,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
17 và các ký tự unicode có tên là
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
18 thành các ký tự Unicode được liên kết của chúng

Dấu gạch chéo ngược có thể không xuất hiện ở bất kỳ đâu trong các biểu thức. Nhận xét, sử dụng ký tự

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
19, không được phép bên trong một biểu thức

Sau mỗi biểu thức, một chuyển đổi loại tùy chọn có thể được chỉ định. Các chuyển đổi được phép là

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
30,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
31 hoặc
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
32. Chúng được đối xử giống như trong
>>> 'The value is {}.'.format[value]
'The value is 80.'
1.
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
30 gọi
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
35 trên biểu thức,
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
31 gọi
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
37 trên biểu thức và
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
32 gọi
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
39 trên biểu thức. Những chuyển đổi này được áp dụng trước lệnh gọi tới
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
40. Lý do duy nhất để sử dụng
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
30 là nếu bạn muốn chỉ định một công cụ xác định định dạng áp dụng cho
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
42, không phải cho loại biểu thức

Các chuỗi F sử dụng ngôn ngữ nhỏ của trình xác định định dạng giống như

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
43. Tương tự như
>>> 'The value is {}.'.format[value]
'The value is 80.'
1, các bộ xác định định dạng tùy chọn có thể được bao gồm bên trong chuỗi f, được phân tách khỏi biểu thức [hoặc chuyển đổi kiểu, nếu được chỉ định] bằng dấu hai chấm. Nếu không cung cấp bộ xác định định dạng, một chuỗi rỗng sẽ được sử dụng

Vì vậy, một chuỗi f trông giống như

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
1

Sau đó, biểu thức được định dạng bằng giao thức

>>> 'The value is {}.'.format[value]
'The value is 80.'
41, sử dụng định dạng định dạng làm đối số. Giá trị kết quả được sử dụng khi xây dựng giá trị của chuỗi f

Lưu ý rằng

>>> 'The value is {}.'.format[value]
'The value is 80.'
3 không được gọi trực tiếp trên mỗi giá trị. Mã thực tế sử dụng tương đương với
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
47 hoặc
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
48. Xem tài liệu về hàm dựng sẵn
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
40 để biết thêm chi tiết

Biểu thức không thể chứa

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
00 hoặc
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
01 bên ngoài chuỗi hoặc dấu ngoặc đơn, dấu ngoặc hoặc dấu ngoặc nhọn. Ngoại lệ là toán tử
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
02 được phép là trường hợp đặc biệt

Dấu gạch chéo ngược có thể không xuất hiện bên trong các phần biểu thức của chuỗi f, vì vậy, bạn không thể sử dụng chúng, ví dụ: để thoát dấu ngoặc kép bên trong chuỗi f

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
2

Bạn có thể sử dụng một loại trích dẫn khác bên trong biểu thức

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
3

Thoát dấu gạch chéo ngược có thể xuất hiện bên trong các phần chuỗi của chuỗi f

Lưu ý rằng cách chính xác để dấu ngoặc đơn xuất hiện trong giá trị chuỗi kết quả là nhân đôi dấu ngoặc nhọn

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
4

Giống như tất cả các chuỗi thô trong Python, không có quá trình xử lý thoát nào được thực hiện đối với các chuỗi f thô

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
5

Do quy tắc mã thông báo chuỗi của Python, chuỗi f

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
03 không hợp lệ. Trình mã thông báo phân tích cú pháp này dưới dạng 3 mã thông báo.
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
04,
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
05 và
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
06. Cũng giống như các chuỗi thông thường, điều này không thể được khắc phục bằng cách sử dụng các chuỗi thô. Có một số cách chính xác để viết chuỗi f này. với một ký tự trích dẫn khác

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
6

Hoặc với dấu ngoặc kép

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
7

Mã chính xác được sử dụng để triển khai chuỗi f không được chỉ định. Tuy nhiên, đảm bảo rằng bất kỳ giá trị nhúng nào được chuyển đổi thành chuỗi sẽ sử dụng phương thức

>>> 'The value is {}.'.format[value]
'The value is 80.'
41 của giá trị đó. Đây là cơ chế tương tự mà
>>> 'The value is {}.'.format[value]
'The value is 80.'
1 sử dụng để chuyển đổi giá trị thành chuỗi

Ví dụ, mã này

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
8

Có thể được đánh giá là

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
9

Các biểu thức được trích xuất từ ​​​​chuỗi được đánh giá trong ngữ cảnh xuất hiện chuỗi f. Điều này có nghĩa là biểu thức có toàn quyền truy cập vào các biến cục bộ và toàn cục. Bất kỳ biểu thức Python hợp lệ nào cũng có thể được sử dụng, bao gồm các lệnh gọi hàm và phương thức

Bởi vì f-strings được đánh giá ở vị trí mà chuỗi xuất hiện trong mã nguồn, nên không có biểu thức bổ sung nào khả dụng với f-strings. Cũng không có mối quan tâm bảo mật bổ sung. bạn cũng có thể viết cùng một biểu thức, không phải bên trong chuỗi f

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
0

Tương đương với

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
1

Các biểu thức được phân tích cú pháp tương đương với

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
09

Lưu ý rằng vì biểu thức được đặt trong dấu ngoặc đơn ẩn trước khi đánh giá, biểu thức có thể chứa dòng mới. Ví dụ

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
2

Định dạng specifiers cũng có thể chứa các biểu thức đánh giá. Điều này cho phép mã như

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
3

Khi các biểu thức trong bộ xác định định dạng được đánh giá [nếu cần], bộ xác định định dạng không được trình đánh giá chuỗi f diễn giải. Giống như trong

>>> 'The value is {}.'.format[value]
'The value is 80.'
1, chúng chỉ được chuyển vào phương thức
>>> 'The value is {}.'.format[value]
'The value is 80.'
3 của đối tượng được định dạng

Chuỗi f liền kề và chuỗi thông thường được nối. Các chuỗi thông thường được nối vào thời gian biên dịch và các chuỗi f được nối vào thời gian chạy. Ví dụ, biểu thức

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
4

mang lại giá trị

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
5

Mặc dù phương pháp chính xác của việc nối thời gian chạy này không được chỉ định, nhưng đoạn mã trên có thể ước tính thành

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
6

Mỗi chuỗi f được đánh giá hoàn toàn trước khi được nối với chuỗi f liền kề. Điều đó có nghĩa là điều này

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
7

Là một lỗi cú pháp, bởi vì chuỗi f đầu tiên không chứa dấu ngoặc nhọn

Có thể xảy ra lỗi thời gian biên dịch hoặc thời gian chạy khi xử lý chuỗi f. Lỗi thời gian biên dịch được giới hạn ở những lỗi có thể được phát hiện khi quét chuỗi f. Tất cả các lỗi này đều tăng

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
12

niềng răng vô đối

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8

biểu thức không hợp lệ

>>> msg = ['disk failure', 32]
>>> 'error: %s' % msg
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
9

Lỗi thời gian chạy xảy ra khi đánh giá các biểu thức bên trong chuỗi f. Lưu ý rằng một chuỗi f có thể được đánh giá nhiều lần và đôi khi hoạt động và gây ra lỗi vào những thời điểm khác

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
0

hoặc

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
1

Để dễ đọc, khoảng trắng đầu và cuối trong các biểu thức được bỏ qua. Đây là sản phẩm phụ của việc đặt biểu thức trong ngoặc đơn trước khi đánh giá

Các biểu thức trong chuỗi f được đánh giá theo thứ tự từ trái sang phải. Điều này chỉ có thể phát hiện được nếu các biểu thức có tác dụng phụ

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
2

Hầu hết các cuộc thảo luận về ý tưởng python tập trung vào ba vấn đề

  • Cách biểu thị chuỗi f,
  • Cách chỉ định vị trí của các biểu thức trong chuỗi f và
  • Có cho phép các biểu thức Python đầy đủ hay không

Bởi vì trình biên dịch phải tham gia vào việc đánh giá các biểu thức có trong các chuỗi được nội suy, nên phải có một số cách để biểu thị cho trình biên dịch chuỗi nào sẽ được đánh giá. PEP này đã chọn một ký tự

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
13 hàng đầu trước chuỗi ký tự. Điều này tương tự như cách các tiền tố
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
14 và
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
15 thay đổi ý nghĩa của chính chuỗi đó, tại thời điểm biên dịch. Các tiền tố khác đã được đề xuất, chẳng hạn như
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
16. Không có tùy chọn nào có vẻ tốt hơn tùy chọn kia, vì vậy
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
13 đã được chọn

Một tùy chọn khác là hỗ trợ các chức năng đặc biệt mà trình biên dịch đã biết, chẳng hạn như

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
18. Điều này có vẻ như quá nhiều phép thuật đối với Python. không chỉ có khả năng va chạm với các mã định danh hiện có, tác giả PEP cảm thấy rằng tốt hơn hết là biểu thị phép thuật bằng một ký tự tiền tố chuỗi

PEP này hỗ trợ cú pháp giống như

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 để phân biệt văn bản thay thế bên trong chuỗi. biểu thức được chứa bên trong dấu ngoặc nhọn. Có các tùy chọn khác được đề xuất, chẳng hạn như
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
21 của
>>> 'The value is {}.'.format[value]
'The value is 80.'
2 hoặc
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
22

Mặc dù

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
21 chắc chắn quen thuộc hơn với những người viết shell và người dùng một số ngôn ngữ khác, nhưng trong Python,
>>> 'The value is {}.'.format[value]
'The value is 80.'
1 được sử dụng nhiều. Tìm kiếm nhanh thư viện chuẩn của Python chỉ cho thấy một số cách sử dụng
>>> 'The value is {}.'.format[value]
'The value is 80.'
2, nhưng hàng trăm cách sử dụng
>>> 'The value is {}.'.format[value]
'The value is 80.'
1

Một giải pháp thay thế được đề xuất khác là có văn bản được thay thế giữa

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
27 và
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
28 hoặc giữa
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
27 và
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
30. Mặc dù cú pháp này có thể được mong muốn nếu tất cả các chuỗi ký tự đều hỗ trợ phép nội suy, PEP này chỉ hỗ trợ các chuỗi đã được đánh dấu bằng
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
13 ở đầu. Do đó, PEP đang sử dụng các dấu ngoặc đơn không trang trí để biểu thị văn bản được thay thế nhằm thúc đẩy sự quen thuộc của người dùng cuối với
>>> 'The value is {}.'.format[value]
'The value is 80.'
1

Nhiều người trong cuộc thảo luận về ý tưởng python muốn hỗ trợ cho chỉ một số nhận dạng duy nhất hoặc một tập hợp con giới hạn các biểu thức Python [chẳng hạn như tập hợp con được hỗ trợ bởi

>>> 'The value is {}.'.format[value]
'The value is 80.'
1]. PEP này hỗ trợ các biểu thức Python đầy đủ bên trong dấu ngoặc nhọn. Nếu không có biểu thức đầy đủ, một số cách sử dụng mong muốn sẽ trở nên cồng kềnh. Ví dụ

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
3

sẽ trở thành

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
4

Mặc dù đúng là các biểu thức rất xấu có thể được đưa vào chuỗi f, PEP này đảm nhận vị trí rằng việc sử dụng như vậy nên được giải quyết trong đánh giá mã hoặc kẻ nói dối

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
5

Wikipedia có một cuộc thảo luận hay về phép nội suy chuỗi trong các ngôn ngữ lập trình khác. Tính năng này được triển khai bằng nhiều ngôn ngữ, với nhiều cú pháp và hạn chế khác nhau

Có một sự khác biệt nhỏ giữa các biểu thức giới hạn được phép trong

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 và các biểu thức đầy đủ được phép bên trong chuỗi f. Sự khác biệt là cách tra cứu chỉ mục được thực hiện. Trong
>>> 'The value is {}.'.format[value]
'The value is 80.'
1, các giá trị chỉ mục không giống số được chuyển đổi thành chuỗi

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
6

Lưu ý rằng giá trị chỉ mục được chuyển đổi thành chuỗi

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
36 khi nó được tra cứu trong dict

Tuy nhiên, trong f-string, bạn sẽ cần sử dụng một chữ cái cho giá trị của

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
36

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
7

Sự khác biệt này là bắt buộc vì nếu không bạn sẽ không thể sử dụng các biến làm giá trị chỉ mục

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
8

Xem để thảo luận thêm. Chính quan sát này đã dẫn đến các biểu thức Python đầy đủ được hỗ trợ trong chuỗi f

Hơn nữa, các biểu thức giới hạn mà

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 hiểu không nhất thiết phải là các biểu thức Python hợp lệ. Ví dụ

>>> 'error: %s' % [msg,]
"error: ['disk failure', 32]"
9

Vì lý do này, str. format[] "trình phân tích cú pháp biểu thức" không phù hợp để sử dụng khi triển khai chuỗi f

Ba chuỗi f được trích dẫn được cho phép. Các chuỗi này được phân tích cú pháp giống như các chuỗi trích dẫn ba bình thường. Sau khi phân tích cú pháp và giải mã, logic f-string bình thường được áp dụng và

>>> 'The value is {}.'.format[value]
'The value is 80.'
3 được gọi trên mỗi giá trị

Raw và f-strings có thể được kết hợp. Ví dụ, chúng có thể được sử dụng để xây dựng các biểu thức chính quy

>>> 'The value is {}.'.format[value]
'The value is 80.'
20

Ngoài ra, chuỗi f thô có thể được kết hợp với chuỗi trích dẫn ba

Vì lý do tương tự mà chúng tôi không hỗ trợ

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
40, bạn không thể kết hợp
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
13 với chuỗi ký tự
>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
14. Vấn đề chính là phương thức
>>> 'The value is {}.'.format[value]
'The value is 80.'
3 của đối tượng có thể trả về dữ liệu Unicode không tương thích với chuỗi byte

Các chuỗi f nhị phân trước tiên sẽ yêu cầu một giải pháp cho

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
40. Ý tưởng này đã được đề xuất trong quá khứ, gần đây nhất là trong. Các cuộc thảo luận về một tính năng như vậy thường đề xuất một trong hai

  • thêm một phương thức chẳng hạn như
    >>> msg = 'disk failure'
    >>> 'error: %s' % msg
    'error: disk failure'
    
    45 để một đối tượng có thể kiểm soát cách nó được chuyển đổi thành byte hoặc
  • >>> msg = 'disk failure'
    >>> 'error: %s' % msg
    'error: disk failure'
    
    40 không phải là mục đích chung hoặc có thể mở rộng như
    >>> 'The value is {}.'.format[value]
    'The value is 80.'
    
    1

Cả hai vẫn là tùy chọn trong tương lai, nếu chức năng đó được mong muốn

Các chuyển đổi

>>> 'The value is {}.'.format[value]
'The value is 80.'
28,
>>> 'The value is {}.'.format[value]
'The value is 80.'
29 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
0 không bắt buộc. Bởi vì các biểu thức tùy ý được cho phép bên trong chuỗi f, mã này

>>> 'The value is {}.'.format[value]
'The value is 80.'
21

giống hệt với

>>> 'The value is {}.'.format[value]
'The value is 80.'
22

Tương tự,

>>> 'The value is {}.'.format[value]
'The value is 80.'
28 có thể được thay thế bằng lệnh gọi tới
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
35 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
0 bằng lệnh gọi tới
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date[1991, 10, 12]
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
39

Tuy nhiên,

>>> 'The value is {}.'.format[value]
'The value is 80.'
28,
>>> 'The value is {}.'.format[value]
'The value is 80.'
29 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
0 được hỗ trợ bởi PEP này để giảm thiểu sự khác biệt với
>>> 'The value is {}.'.format[value]
'The value is 80.'
1.
>>> 'The value is {}.'.format[value]
'The value is 80.'
28,
>>> 'The value is {}.'.format[value]
'The value is 80.'
29 và
>>> 'The value is {}.'.format[value]
'The value is 80.'
0 được yêu cầu trong
>>> 'The value is {}.'.format[value]
'The value is 80.'
1 vì nó không cho phép thực hiện các biểu thức tùy ý

Bởi vì lambdas sử dụng ký tự

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
00, chúng không thể xuất hiện bên ngoài dấu ngoặc đơn trong một biểu thức. Dấu hai chấm được hiểu là phần đầu của trình xác định định dạng, có nghĩa là phần đầu của biểu thức lambda được nhìn thấy và không hợp lệ về mặt cú pháp. Vì không có cách sử dụng thực tế nào cho lambda đơn giản trong biểu thức chuỗi f, nên điều này không được coi là hạn chế nhiều

Nếu bạn cảm thấy mình phải sử dụng lambdas, chúng có thể được sử dụng bên trong dấu ngoặc đơn

>>> 'The value is {}.'.format[value]
'The value is 80.'
23

Tiền tố 'u' đã được thêm vào Python 3. 3 trong PEP 414 như một phương tiện để dễ dàng tương thích nguồn với Python 2. 7. Bởi vì Python 2. 7 sẽ không bao giờ hỗ trợ chuỗi f, không có gì thu được khi có thể kết hợp tiền tố 'f' với 'u'

Dưới đây là một số ví dụ từ mã nguồn Python hiện đang sử dụng

>>> 'The value is {}.'.format[value]
'The value is 80.'
1 và giao diện của chúng với chuỗi f. PEP này không khuyến nghị chuyển đổi toàn bộ thành chuỗi f, đây chỉ là ví dụ về cách sử dụng
>>> 'The value is {}.'.format[value]
'The value is 80.'
1 trong thế giới thực và giao diện của chúng nếu được viết từ đầu bằng chuỗi f

Tôi có thể sử dụng cái gì thay vì f

Một thay thế repr[] với f-string

Bạn có nên sử dụng F

Python f-strings được giới thiệu là có cú pháp tối thiểu để định dạng chuỗi. Các biểu thức được đánh giá trong thời gian chạy. Nếu bạn đang sử dụng Python 3. 6 trở lên, bạn nên sử dụng chuỗi f cho tất cả các yêu cầu định dạng chuỗi của mình .

là F

Tóm tắt. f-string dễ đọc hơn và dễ triển khai hơn % và. format[] kiểu định dạng chuỗi . Hơn nữa, sử dụng chuỗi f được đề xuất cho Python 3. 6 trở lên trong khi. format[] phù hợp nhất với Python 2. 6 trở lên.

f có giống với định dạng trong Python không?

Không có sự khác biệt như bạn thấy. Cả hai đều là tùy chọn định dạng chuỗi, với chuỗi f mới được giới thiệu.

Chủ Đề