2016-03-02 19 views
27

Tôi đang thử Python 3.6. Đi qua mã mới, tôi stumbled khi cú pháp mới này:Chuỗi có tiền tố 'f' trong python-3.6

f"My formatting string!" 

Có vẻ như chúng ta có thể làm những việc như thế này:

>>> name = "George" 
>>> print(f"My cool string is called {name}.") 
My cool string is called George. 

bất cứ ai có thể làm sáng tỏ về các hoạt động bên trong này? Đặc biệt phạm vi của các biến mà một chuỗi có tiền tố f có thể mất là bao nhiêu?

Trả lời

28

Xem PEP 498 Literal String Interpolation:

Các biểu thức được chiết xuất từ ​​các chuỗi được đánh giá trong bối cảnh nơi e-chuỗi xuất hiện. Đ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 hàm và các cuộc gọi phương thức.

Vì vậy, các biểu thức được đánh giá như thể chúng xuất hiện trong cùng một phạm vi; người dân địa phương, đóng cửa, và globals tất cả làm việc giống như trong mã khác trong cùng một bối cảnh.

Bạn sẽ tìm thấy thêm chi tiết trong reference documentation:

Expressions trong xâu định dạng được đối xử như biểu Python thường xuyên bao quanh bởi dấu ngoặc đơn, với một vài trường hợp ngoại lệ. Không cho phép biểu thức trống và biểu thức lambda phải được bao quanh bởi dấu ngoặc đơn rõ ràng. Biểu thức thay thế có thể chứa dấu ngắt dòng (ví dụ: trong chuỗi được trích dẫn ba lần), nhưng chúng không thể chứa nhận xét. Mỗi biểu thức được đánh giá trong ngữ cảnh có chuỗi chữ được định dạng xuất hiện, theo thứ tự từ trái sang phải.

Vì bạn đang dùng thử bản dựng alpha 3.6, vui lòng đọc What's New In Python 3.6 documentation. Nó tóm tắt tất cả các thay đổi, bao gồm các liên kết đến tài liệu có liên quan và PEP.

Và chỉ cần rõ ràng: 3.6 không được phát hành chưa; alpha đầu tiên sẽ không được phát hành cho đến tháng 5 năm 2016. Xem số 3.6 release schedule.

+1

Dự kiến ​​các chuỗi f sẽ được chuyển về phiên bản trước của python3 (nếu chúng tìm thấy mức sử dụng nặng trong mã mới)? Tôi không thể tìm thấy câu trả lời cho điều này theo cách này, nhưng điều này có vẻ như là một điểm tranh chấp. –

+0

Không có kế hoạch để backport này, không có. PEP nói rằng đây là một tính năng mới cho 3.6. –

+0

Cảm ơn. Tôi đã cố gắng để so sánh nó với Enum PEP đó là mới nhưng cuối cùng backported cho phiên bản 3.x trước đó, và tôi không thấy bất cứ điều gì cho thấy một kế hoạch một trong hai cách. –

2

f-strings cũng hỗ trợ bất kỳ biểu thức Python nào bên trong dấu ngoặc nhọn.

print(f"My cool string is called {name.upper()}.") 
Các vấn đề liên quan