Có gì mới trong Python 3.7¶
- Biên tập viên:
Elvis Pranskevichus <elvis@magic.io>
Bài viết này giải thích các tính năng mới trong Python 3.7, so với 3.6. Python 3.7 được phát hành vào ngày 27 tháng 6 năm 2018. Để biết chi tiết đầy đủ, hãy xem changelog.
Tóm tắt -- Điểm nổi bật của bản phát hành¶
Các tính năng cú pháp mới:
PEP 563, hoãn đánh giá các chú thích loại.
Thay đổi cú pháp không tương thích ngược:
Các mô-đun thư viện mới:
Các tính năng tích hợp mới:
PEP 553, chức năng
breakpoint()mới.
Cải tiến mô hình dữ liệu Python:
PEP 562, tùy chỉnh quyền truy cập vào các thuộc tính mô-đun.
PEP 560, hỗ trợ cốt lõi cho mô-đun gõ và các loại chung.
Bản chất bảo toàn thứ tự chèn của các đối tượng dict has been declared là một phần chính thức của đặc tả ngôn ngữ Python.
Những cải tiến đáng kể trong thư viện tiêu chuẩn:
Mô-đun
asynciođã nhận được các tính năng mới, usability and performance improvements đáng kể.Mô-đun
timeđã được hỗ trợ cho functions with nanosecond resolution.
Cải tiến triển khai CPython:
Tránh sử dụng ASCII làm mã hóa văn bản mặc định:
PEP 552, .pycs xác định
PEP 565, xử lý
DeprecationWarningđược cải thiện
C API cải tiến:
PEP 539, C API mới để lưu trữ cục bộ theo luồng
Cải tiến tài liệu:
Bản phát hành này có những cải tiến hiệu suất đáng chú ý trong nhiều lĩnh vực. Phần Tối ưu hóa liệt kê chúng một cách chi tiết.
Để biết danh sách các thay đổi có thể ảnh hưởng đến khả năng tương thích với các bản phát hành Python trước đó, vui lòng tham khảo phần Chuyển sang Python 3.7.
Tính năng mới¶
PEP 563: Trì hoãn đánh giá chú thích¶
Sự ra đời của gợi ý kiểu trong Python đã phát hiện ra hai vấn đề rõ ràng về khả năng sử dụng với chức năng của các chú thích được thêm vào trong PEP 3107 và được tinh chỉnh thêm trong PEP 526:
chú thích chỉ có thể sử dụng các tên đã có sẵn trong phạm vi hiện tại, nói cách khác, chúng không hỗ trợ bất kỳ loại tham chiếu chuyển tiếp nào; và
mã nguồn chú thích có ảnh hưởng xấu đến thời gian khởi động của chương trình Python.
Cả hai vấn đề này đều được khắc phục bằng cách trì hoãn việc đánh giá các chú thích. Thay vì biên dịch mã thực thi các biểu thức trong chú thích tại thời điểm định nghĩa, trình biên dịch lưu trữ chú thích ở dạng chuỗi tương đương với AST của biểu thức được đề cập. Nếu cần, chú thích có thể được giải quyết trong thời gian chạy bằng typing.get_type_hints(). Trong trường hợp phổ biến khi điều này không bắt buộc, việc lưu trữ các chú thích sẽ rẻ hơn (vì các chuỗi ngắn được trình thông dịch thực hiện) và giúp thời gian khởi động nhanh hơn.
Về mặt khả năng sử dụng, các chú thích hiện hỗ trợ các tham chiếu chuyển tiếp, làm cho cú pháp sau hợp lệ
lớp C:
@classmethod
def from_string(cls, source: str) -> C:
...
def xác thực_b(self, obj: B) -> bool:
...
lớp B:
...
Vì thay đổi này phá vỡ tính tương thích nên hành vi mới cần được bật trên cơ sở từng mô-đun trong Python 3.7 bằng cách sử dụng tính năng nhập __future__:
từ __future__ nhập chú thích
Nó sẽ trở thành mặc định trong Python 3.10.
Xem thêm
- PEP 563 -- Trì hoãn việc đánh giá các chú thích
PEP được viết và triển khai bởi Łukasz Langa.
PEP 538: Cưỡng chế ngôn ngữ C kế thừa¶
Một thách thức đang diễn ra trong loạt Python 3 là xác định chiến lược mặc định hợp lý để xử lý giả định mã hóa văn bản "7-bit ASCII" hiện được ngụ ý bằng việc sử dụng ngôn ngữ C hoặc POSIX mặc định trên nền tảng không phải Windows.
PEP 538 cập nhật giao diện dòng lệnh trình thông dịch mặc định để tự động ép buộc ngôn ngữ đó thành ngôn ngữ dựa trên UTF-8 có sẵn như được mô tả trong tài liệu về biến môi trường PYTHONCOERCECLOCALE mới. Việc tự động đặt LC_CTYPE theo cách này có nghĩa là cả trình thông dịch cốt lõi và phần mở rộng C nhận biết ngôn ngữ (chẳng hạn như readline) sẽ thừa nhận việc sử dụng UTF-8 làm mã hóa văn bản mặc định, thay vì ASCII.
Định nghĩa hỗ trợ nền tảng trong PEP 11 cũng đã được cập nhật để hạn chế hỗ trợ xử lý toàn văn bản đối với các ngôn ngữ không dựa trên ASCII được định cấu hình phù hợp.
Là một phần của thay đổi này, trình xử lý lỗi mặc định cho stdin và stdout hiện là surrogateescape (chứ không phải strict) khi sử dụng bất kỳ ngôn ngữ đích cưỡng chế nào đã xác định (hiện tại là C.UTF-8, C.utf8 và UTF-8). Trình xử lý lỗi mặc định cho stderr tiếp tục là backslashreplace, bất kể ngôn ngữ.
Việc ép buộc ngôn ngữ theo mặc định là im lặng, nhưng để hỗ trợ gỡ lỗi các vấn đề tích hợp có thể liên quan đến ngôn ngữ, bạn có thể yêu cầu các cảnh báo rõ ràng (được phát trực tiếp trên stderr) bằng cách cài đặt PYTHONCOERCECLOCALE=warn. Cài đặt này cũng sẽ khiến thời gian chạy Python phát ra cảnh báo nếu ngôn ngữ C cũ vẫn hoạt động khi trình thông dịch lõi được khởi chạy.
Mặc dù việc ép buộc ngôn ngữ của PEP 538 cũng có lợi ích là ảnh hưởng đến các mô-đun mở rộng (chẳng hạn như GNU readline), cũng như các tiến trình con (bao gồm cả các tiến trình chạy ứng dụng không phải Python và các phiên bản Python cũ hơn), nhưng nó có nhược điểm là yêu cầu phải có một ngôn ngữ đích phù hợp trên hệ thống đang chạy. Để xử lý tốt hơn trường hợp không có ngôn ngữ đích phù hợp (chẳng hạn như xảy ra trên RHEL/CentOS 7), Python 3.7 cũng triển khai PEP 540: Chế độ thời gian chạy UTF-8 bắt buộc.
Xem thêm
- PEP 538 -- Buộc ngôn ngữ C kế thừa thành ngôn ngữ dựa trên UTF-8
PEP được viết và triển khai bởi Nick Coghlan.
PEP 540: Chế độ thời gian chạy UTF-8 bắt buộc¶
Tùy chọn dòng lệnh -X utf8 mới và biến môi trường PYTHONUTF8 có thể được sử dụng để kích hoạt Python UTF-8 Mode.
Khi ở chế độ UTF-8, CPython bỏ qua cài đặt ngôn ngữ và sử dụng mã hóa UTF-8 theo mặc định. Trình xử lý lỗi cho luồng sys.stdin và sys.stdout được đặt thành surrogateescape.
Chế độ UTF-8 bắt buộc có thể được sử dụng để thay đổi hành vi xử lý văn bản trong trình thông dịch Python được nhúng mà không thay đổi cài đặt ngôn ngữ của ứng dụng nhúng.
Mặc dù chế độ UTF-8 của PEP 540 có lợi ích là hoạt động bất kể ngôn ngữ nào có sẵn trên hệ thống đang chạy, nhưng nó có nhược điểm là không ảnh hưởng đến các mô-đun mở rộng (chẳng hạn như GNU readline), các tiến trình con chạy các ứng dụng không phải Python và các tiến trình con chạy các phiên bản Python cũ hơn. Để giảm nguy cơ làm hỏng dữ liệu văn bản khi giao tiếp với các thành phần như vậy, Python 3.7 cũng triển khai PEP 540: Chế độ thời gian chạy UTF-8 bắt buộc).
Chế độ UTF-8 được bật theo mặc định khi ngôn ngữ là C hoặc POSIX và tính năng ép buộc ngôn ngữ PEP 538 không thể thay đổi nó thành một lựa chọn thay thế dựa trên UTF-8 (cho dù lỗi đó là do PYTHONCOERCECLOCALE=0 được đặt, LC_ALL được đặt hay thiếu ngôn ngữ mục tiêu phù hợp).
Xem thêm
- PEP 540 -- Thêm chế độ UTF-8 mới
PEP được viết và triển khai bởi Victor Stinner
PEP 553: Tích hợp breakpoint()¶
Python 3.7 bao gồm hàm breakpoint() tích hợp mới như một cách dễ dàng và nhất quán để vào trình gỡ lỗi Python.
breakpoint() tích hợp gọi sys.breakpointhook(). Theo mặc định, cái sau nhập pdb và sau đó gọi pdb.set_trace(), nhưng bằng cách liên kết sys.breakpointhook() với chức năng bạn chọn, breakpoint() có thể nhập bất kỳ trình gỡ lỗi nào. Ngoài ra, biến môi trường PYTHONBREAKPOINT có thể được đặt thành khả năng gọi được của trình gỡ lỗi mà bạn chọn. Đặt PYTHONBREAKPOINT=0 để tắt hoàn toàn breakpoint() tích hợp.
Xem thêm
- PEP 553 -- Điểm dừng tích hợp()
PEP được viết và triển khai bởi Barry Warsaw
PEP 539: C API mới cho bộ nhớ cục bộ theo luồng¶
Trong khi Python cung cấp C API để hỗ trợ lưu trữ cục bộ theo luồng; Thread Local Storage (TLS) API hiện tại đã sử dụng int để đại diện cho các khóa TLS trên tất cả các nền tảng. Điều này nhìn chung không phải là vấn đề đối với các nền tảng hỗ trợ chính thức, nhưng điều đó không tương thích với POSIX hay di động theo bất kỳ ý nghĩa thực tế nào.
PEP 539 thay đổi điều này bằng cách cung cấp một Thread Specific Storage (TSS) API mới cho CPython thay thế việc sử dụng TLS API hiện có trong trình thông dịch CPython, đồng thời không dùng API hiện có. TSS API sử dụng loại Py_tss_t mới thay vì int để biểu thị các khóa TSS--một loại mờ mà định nghĩa về loại này có thể phụ thuộc vào việc triển khai TLS cơ bản. Do đó, điều này sẽ cho phép xây dựng CPython trên các nền tảng trong đó khóa TLS gốc được xác định theo cách không thể chuyển sang int một cách an toàn.
Lưu ý rằng trên các nền tảng mà khóa TLS gốc được xác định theo cách không thể truyền sang int một cách an toàn, tất cả các chức năng của TLS API hiện tại sẽ không hoạt động và ngay lập tức trả về lỗi. Điều này cho thấy rõ ràng rằng API cũ không được hỗ trợ trên các nền tảng mà nó không thể được sử dụng một cách đáng tin cậy và sẽ không có nỗ lực nào được thực hiện để thêm hỗ trợ đó.
Xem thêm
- PEP 539 -- C-API mới cho bộ nhớ cục bộ theo luồng trong CPython
PEP được viết bởi Erik M. Bray; thực hiện bởi Masayuki Yamamoto.
PEP 562: Tùy chỉnh quyền truy cập vào thuộc tính mô-đun¶
Python 3.7 cho phép xác định __getattr__() trên các mô-đun và sẽ gọi nó bất cứ khi nào không tìm thấy thuộc tính mô-đun. Hiện tại, việc xác định __dir__() trên các mô-đun cũng được cho phép.
Một ví dụ điển hình về việc điều này có thể hữu ích là việc ngừng sử dụng thuộc tính mô-đun và tải chậm.
Xem thêm
- PEP 562 -- Mô-đun
__getattr__và__dir__ PEP được viết và triển khai bởi Ivan Levkivskyi
PEP 564: Chức năng thời gian mới với độ phân giải nano giây¶
Độ phân giải của đồng hồ trong các hệ thống hiện đại có thể vượt quá độ chính xác giới hạn của số dấu phẩy động được hàm time.time() và các biến thể của nó trả về. Để tránh mất độ chính xác, PEP 564 bổ sung thêm sáu biến thể "nano giây" mới của các chức năng hẹn giờ hiện có vào mô-đun time:
Các hàm mới trả về số nano giây dưới dạng giá trị nguyên.
Measurements cho thấy trên Linux và Windows độ phân giải của time.time_ns() tốt hơn khoảng 3 lần so với time.time().
Xem thêm
- PEP 564 -- Thêm chức năng thời gian mới với độ phân giải nano giây
PEP được viết và triển khai bởi Victor Stinner
PEP 565: Hiển thị cảnh báo không dùng nữa trong __main__¶
Việc xử lý mặc định của DeprecationWarning đã được thay đổi sao cho những cảnh báo này một lần nữa được hiển thị theo mặc định, nhưng chỉ khi mã kích hoạt chúng chạy trực tiếp trong mô-đun __main__. Do đó, các nhà phát triển tập lệnh tệp đơn và những người sử dụng Python tương tác một lần nữa sẽ bắt đầu thấy cảnh báo không dùng nữa đối với các API mà họ sử dụng, nhưng cảnh báo không dùng nữa được kích hoạt bởi ứng dụng, thư viện và mô-đun khung đã nhập sẽ tiếp tục bị ẩn theo mặc định.
Do sự thay đổi này, thư viện tiêu chuẩn hiện cho phép các nhà phát triển lựa chọn giữa ba hành vi cảnh báo ngừng sử dụng khác nhau:
FutureWarning: luôn được hiển thị theo mặc định, được khuyến nghị cho các cảnh báo nhằm mục đích hiển thị cho người dùng cuối của ứng dụng (ví dụ: đối với cài đặt cấu hình ứng dụng không được dùng nữa).DeprecationWarning: theo mặc định chỉ được hiển thị trong__main__và khi chạy thử nghiệm, được khuyến nghị cho các cảnh báo mà các nhà phát triển Python khác sẽ thấy trong đó việc nâng cấp phiên bản có thể dẫn đến thay đổi hành vi hoặc xảy ra lỗi.PendingDeprecationWarning: chỉ hiển thị theo mặc định khi chạy thử nghiệm, dành cho trường hợp nâng cấp phiên bản trong tương lai sẽ thay đổi danh mục cảnh báo thànhDeprecationWarninghoặcFutureWarning.
Trước đây cả DeprecationWarning và PendingDeprecationWarning chỉ hiển thị khi chạy thử nghiệm, điều đó có nghĩa là các nhà phát triển chủ yếu viết các tập lệnh tệp đơn lẻ hoặc sử dụng Python một cách tương tác có thể gây bất ngờ khi phá vỡ các thay đổi trong API mà họ sử dụng.
Xem thêm
- PEP 565 -- Hiển thị cảnh báo không dùng nữa trong
__main__ PEP được viết và triển khai bởi Nick Coghlan
PEP 560: Hỗ trợ cốt lõi cho mô-đun typing và các loại chung¶
Ban đầu PEP 484 được thiết kế theo cách nó sẽ không đưa ra những thay đổi về any cho trình thông dịch CPython cốt lõi. Hiện tại, gợi ý nhập và mô-đun typing được cộng đồng sử dụng rộng rãi nên hạn chế này đã bị loại bỏ. PEP giới thiệu hai phương thức đặc biệt __class_getitem__() và __mro_entries__(), những phương thức này hiện được hầu hết các lớp và cấu trúc đặc biệt trong typing sử dụng. Do đó, tốc độ của các hoạt động khác nhau với các loại tăng lên tới 7 lần, các loại chung có thể được sử dụng mà không có xung đột siêu dữ liệu và một số lỗi tồn tại lâu dài trong mô-đun typing đã được sửa.
Xem thêm
- PEP 560 -- Hỗ trợ cốt lõi cho mô-đun gõ và các loại chung
PEP được viết và triển khai bởi Ivan Levkivskyi
PEP 552: Tệp .pyc dựa trên hàm băm¶
Theo truyền thống, Python kiểm tra tính cập nhật của các tệp bộ đệm mã byte (tức là tệp .pyc) bằng cách so sánh siêu dữ liệu nguồn (dấu thời gian và kích thước được sửa đổi lần cuối) với siêu dữ liệu nguồn được lưu trong tiêu đề tệp bộ đệm khi nó được tạo. Mặc dù hiệu quả nhưng phương pháp vô hiệu hóa này có nhược điểm. Khi dấu thời gian của hệ thống tệp quá thô, Python có thể bỏ lỡ các bản cập nhật nguồn, dẫn đến sự nhầm lẫn của người dùng. Ngoài ra, việc có dấu thời gian trong tệp bộ đệm là vấn đề đối với build reproducibility và hệ thống xây dựng dựa trên nội dung.
PEP 552 mở rộng định dạng pyc để cho phép sử dụng hàm băm của tệp nguồn để vô hiệu hóa thay vì dấu thời gian nguồn. Các tệp .pyc như vậy được gọi là "dựa trên hàm băm". Theo mặc định, Python vẫn sử dụng tính năng vô hiệu hóa dựa trên dấu thời gian và không tạo các tệp .pyc dựa trên hàm băm khi chạy. Các tệp .pyc dựa trên hàm băm có thể được tạo bằng py_compile hoặc compileall.
Các tệp .pyc dựa trên hàm băm có hai biến thể: được chọn và không được chọn. Python xác thực các tệp .pyc dựa trên hàm băm đã được kiểm tra dựa trên các tệp nguồn tương ứng trong thời gian chạy nhưng không làm như vậy đối với các pycs dựa trên hàm băm không được kiểm tra. Các tệp .pyc dựa trên hàm băm không được kiểm tra là một cách tối ưu hóa hiệu suất hữu ích cho các môi trường trong đó hệ thống bên ngoài Python (ví dụ: hệ thống xây dựng) chịu trách nhiệm cập nhật các tệp .pyc.
Xem Vô hiệu hóa mã byte được lưu trong bộ nhớ đệm để biết thêm thông tin.
Xem thêm
- PEP 552 -- Pycs xác định
PEP được viết và triển khai bởi Benjamin Peterson
PEP 545: Dịch tài liệu Python¶
PEP 545 mô tả quá trình tạo và duy trì các bản dịch tài liệu Python.
Ba bản dịch mới đã được thêm vào:
Tiếng Nhật: https://python.go-mizu.dev/ja/
Tiếng Pháp: https://python.go-mizu.dev/fr/
Tiếng Hàn: https://python.go-mizu.dev/ko/
Xem thêm
- PEP 545 -- Dịch tài liệu Python
PEP được viết và triển khai bởi Julien Palard, Inada Naoki và Victor Stinner.
Chế độ phát triển Python (-X dev)¶
Tùy chọn dòng lệnh -X dev mới hoặc biến môi trường PYTHONDEVMODE mới có thể được sử dụng để kích hoạt Python Development Mode. Khi ở chế độ phát triển, Python thực hiện các kiểm tra thời gian chạy bổ sung quá tốn kém để có thể bật theo mặc định. Xem tài liệu Python Development Mode để biết mô tả đầy đủ.
Những thay đổi ngôn ngữ khác¶
Biểu thức
awaitvà cách hiểu có chứa mệnh đềasync forlà bất hợp pháp trong các biểu thức trong formatted string literals do có vấn đề trong quá trình triển khai. Trong Python 3.7 hạn chế này đã được dỡ bỏ.Hiện tại, hơn 255 đối số có thể được truyền cho một hàm và một hàm hiện có thể có hơn 255 tham số. (Được đóng góp bởi Serhiy Storchaka trong bpo-12844 và bpo-18896.)
bytes.fromhex()vàbytearray.fromhex()hiện bỏ qua tất cả khoảng trắng ASCII, không chỉ khoảng trắng. (Được đóng góp bởi Robert Xiao trong bpo-28927.)str,bytesvàbytearrayđã nhận được hỗ trợ cho phương thứcisascii()mới, có thể được sử dụng để kiểm tra xem một chuỗi hoặc byte chỉ chứa các ký tự ASCII hay không. (Được đóng góp bởi INADA Naoki trong bpo-32677.)ImportErrorhiện hiển thị tên mô-đun và đường dẫn__file__của mô-đun khifrom ... import ...bị lỗi. (Được đóng góp bởi Matthias Bussonnier trong bpo-29546.)Hiện đã hỗ trợ nhập vòng tròn liên quan đến nhập tuyệt đối bằng cách ràng buộc mô-đun con với tên. (Được đóng góp bởi Serhiy Storchaka trong bpo-30024.)
object.__format__(x, '')hiện tương đương vớistr(x)chứ không phảiformat(str(self), ''). (Được đóng góp bởi Serhiy Storchaka trong bpo-28974.)Để hỗ trợ tốt hơn việc tạo dấu vết ngăn xếp động,
types.TracebackTypehiện có thể được khởi tạo từ mã Python và thuộc tínhtb_nexttrên tracebacks hiện có thể ghi được. (Được đóng góp bởi Nathaniel J. Smith trong bpo-30579.)Khi sử dụng khóa chuyển
-m,sys.path[0]hiện được mở rộng sang đường dẫn thư mục bắt đầu đầy đủ, thay vì để trống thư mục (cho phép nhập từ thư mục làm việc current tại thời điểm quá trình nhập xảy ra) (Được đóng góp bởi Nick Coghlan trong bpo-33053.)Tùy chọn
-Ximporttimemới hoặc biến môi trườngPYTHONPROFILEIMPORTTIMEcó thể được sử dụng để hiển thị thời gian của mỗi lần nhập mô-đun. (Được đóng góp bởi Inada Naoki trong bpo-31415.)
Mô-đun mới¶
bối cảnh¶
Mô-đun contextvars mới và bộ new C APIs giới thiệu hỗ trợ cho context variables. Các biến bối cảnh về mặt khái niệm tương tự như các biến luồng cục bộ. Không giống như TLS, các biến ngữ cảnh hỗ trợ mã không đồng bộ một cách chính xác.
Các mô-đun asyncio và decimal đã được cập nhật để sử dụng và hỗ trợ các biến ngữ cảnh ngay lập tức. Đặc biệt, bối cảnh thập phân hoạt động hiện được lưu trữ trong một biến bối cảnh, cho phép các phép toán thập phân hoạt động với ngữ cảnh chính xác trong mã không đồng bộ.
Xem thêm
- PEP 567 -- Biến ngữ cảnh
PEP được viết và triển khai bởi Yury Selivanov
các lớp dữ liệu¶
Trình trang trí dataclass() mới cung cấp cách khai báo data classes. Một lớp dữ liệu mô tả các thuộc tính của nó bằng cách sử dụng các chú thích biến lớp. Hàm tạo của nó và các phương thức ma thuật khác, chẳng hạn như __repr__(), __eq__() và __hash__() được tạo tự động.
Ví dụ:
@dataclass
Điểm lớp:
x: nổi
y: trôi nổi
z: phao = 0,0
p = Điểm(1,5, 2,5)
print(p) # produces "Điểm(x=1,5, y=2,5, z=0,0)"
Xem thêm
- PEP 557 -- Lớp dữ liệu
PEP được viết và triển khai bởi Eric V. Smith
importlib.resource¶
Mô-đun importlib.resources mới cung cấp một số API mới và một ABC mới để truy cập, mở và đọc resources bên trong các gói. Tài nguyên gần giống với các tệp bên trong gói, nhưng chúng không cần phải là tệp thực trên hệ thống tệp vật lý. Trình tải mô-đun có thể cung cấp hàm get_resource_reader() trả về phiên bản importlib.abc.ResourceReader để hỗ trợ API mới này. Cả trình tải đường dẫn tệp tích hợp và trình tải tệp zip đều hỗ trợ điều này.
Được đóng góp bởi Barry Warsaw và Brett Cannon trong bpo-32248.
Xem thêm
importlib_resources -- một backport PyPI cho các phiên bản Python cũ hơn.
Mô-đun cải tiến¶
phân tích cú pháp¶
Phương thức ArgumentParser.parse_intermixed_args() mới cho phép trộn lẫn các tùy chọn và đối số vị trí. (Được đóng góp bởi paul.j3 trong bpo-14191.)
asyncio¶
Mô-đun asyncio đã nhận được nhiều tính năng mới, khả năng sử dụng và performance improvements. Những thay đổi đáng chú ý bao gồm:
Bạn có thể dùng hàm provisional
asyncio.run()mới để chạy coroutine từ mã đồng bộ bằng cách tự động tạo và hủy vòng lặp sự kiện. (Được đóng góp bởi Yury Selivanov trong bpo-32314.)asyncio đã nhận được hỗ trợ cho
contextvars.loop.call_soon(),loop.call_soon_threadsafe(),loop.call_later(),loop.call_at()vàFuture.add_done_callback()có tham số context tùy chọn mới chỉ dành cho từ khóa.Taskshiện tự động theo dõi ngữ cảnh của chúng. Xem PEP 567 để biết thêm chi tiết. (Được đóng góp bởi Yury Selivanov trong bpo-32436.)Chức năng
asyncio.create_task()mới đã được thêm làm phím tắt choasyncio.get_event_loop().create_task(). (Được đóng góp bởi Andrew Svetlov trong bpo-32311.)Phương pháp
loop.start_tls()mới có thể được sử dụng để nâng cấp kết nối hiện có lên TLS. (Được đóng góp bởi Yury Selivanov trong bpo-23749.)Phương pháp
loop.sock_recv_into()mới cho phép đọc dữ liệu từ ổ cắm trực tiếp vào bộ đệm được cung cấp để có thể giảm số lượng bản sao dữ liệu. (Được đóng góp bởi Antoine Pitrou trong bpo-31819.)Hàm
asyncio.current_task()mới trả về phiên bảnTaskhiện đang chạy và hàmasyncio.all_tasks()mới trả về một tập hợp tất cả các phiên bảnTaskhiện có trong một vòng lặp nhất định. Các phương thứcTask.current_task()vàTask.all_tasks()không còn được dùng nữa. (Được đóng góp bởi Andrew Svetlov trong bpo-32250.)Lớp provisional
BufferedProtocolmới cho phép triển khai các giao thức truyền phát với điều khiển thủ công đối với bộ đệm nhận. (Được đóng góp bởi Yury Selivanov trong bpo-32251.)Hàm
asyncio.get_running_loop()mới trả về vòng lặp hiện đang chạy và tăngRuntimeErrornếu không có vòng lặp nào đang chạy. Điều này trái ngược vớiasyncio.get_event_loop(), nó sẽ create một vòng lặp sự kiện mới nếu không có sự kiện nào đang chạy. (Được đóng góp bởi Yury Selivanov trong bpo-32269.)Phương thức coroutine
StreamWriter.wait_closed()mới cho phép đợi cho đến khi trình ghi luồng đóng lại. Phương phápStreamWriter.is_closing()mới có thể được sử dụng để xác định xem người viết có đang đóng hay không. (Được đóng góp bởi Andrew Svetlov trong bpo-32391.)Phương thức coroutine
loop.sock_sendfile()mới cho phép gửi tệp bằngos.sendfilekhi có thể. (Được đóng góp bởi Andrew Svetlov trong bpo-32410.)Các phương thức
Future.get_loop()vàTask.get_loop()mới trả về phiên bản của vòng lặp mà trên đó một tác vụ hoặc tương lai đã được tạo.Server.get_loop()cho phép thực hiện tương tự với các đối tượngasyncio.Server. (Được đóng góp bởi Yury Selivanov trong bpo-32415 và Srinivas Reddy Thatiparthy trong bpo-32418.)Hiện tại có thể kiểm soát cách các phiên bản
asyncio.Serverbắt đầu phân phát. Trước đây, máy chủ sẽ bắt đầu phục vụ ngay khi được tạo. Đối số từ khóa start_serving mới choloop.create_server()vàloop.create_unix_server(), cũng nhưServer.start_serving()vàServer.serve_forever()có thể được sử dụng để tách rời quá trình khởi tạo và phân phát máy chủ. Phương thứcServer.is_serving()mới trả vềTruenếu máy chủ đang phục vụ. Các đối tượngServerhiện là trình quản lý bối cảnh không đồng bộsrv = đang chờ loop.create_server(...) không đồng bộ với srv: mã # some # At thời điểm này, srv đã bị đóng và không còn chấp nhận kết nối mới.
(Được đóng góp bởi Yury Selivanov trong bpo-32662.)
Các đối tượng gọi lại được
loop.call_later()trả về đã nhận được phương thứcwhen()mới trả về dấu thời gian gọi lại được lên lịch tuyệt đối. (Được đóng góp bởi Andrew Svetlov trong bpo-32741.)Phương thức
loop.create_datagram_endpoint()đã được hỗ trợ cho các ổ cắm Unix. (Được đóng góp bởi Quentin Dawans trong bpo-31245.)Các hàm
asyncio.open_connection(),asyncio.start_server(),loop.create_connection(),loop.create_server(),loop.create_accepted_socket()và các biến thể ổ cắm UNIX tương ứng của chúng hiện chấp nhận đối số từ khóa ssl_handshake_timeout. (Được đóng góp bởi Neil Aspinall trong bpo-29970.)Phương thức
Handle.cancelled()mới trả vềTruenếu cuộc gọi lại bị hủy. (Được đóng góp bởi Marat Sharafutdinov trong bpo-31943.)Nguồn asyncio đã được chuyển đổi để sử dụng cú pháp
async/await. (Được đóng góp bởi Andrew Svetlov trong bpo-32193.)Phương pháp
ReadTransport.is_reading()mới có thể được sử dụng để xác định trạng thái đọc của phương tiện truyền tải. Ngoài ra, các lệnh gọi tớiReadTransport.resume_reading()vàReadTransport.pause_reading()hiện không còn hiệu lực. (Được đóng góp bởi Yury Selivanov trong bpo-32356.)Các phương thức vòng lặp chấp nhận đường dẫn ổ cắm hiện hỗ trợ chuyển path-like objects. (Được đóng góp bởi Yury Selivanov trong bpo-32066.)
Trong
asyncio, ổ cắm TCP trên Linux hiện được tạo với cờTCP_NODELAYđược đặt theo mặc định. (Được đóng góp bởi Yury Selivanov và Victor Stinner trong bpo-27456.)Các ngoại lệ xảy ra trong các tác vụ bị hủy không còn được ghi lại. (Được đóng góp bởi Yury Selivanov trong bpo-30508.)
Các lớp
WindowsSelectorEventLoopPolicyvàWindowsProactorEventLoopPolicymới. (Được đóng góp bởi Yury Selivanov trong bpo-33792.)
Một số API asyncio đã là deprecated.
binascii¶
Hàm b2a_uu() hiện chấp nhận đối số từ khóa backtick tùy chọn. Khi giá trị này đúng, số 0 được biểu thị bằng '`' thay vì dấu cách. (Được đóng góp bởi Xiang Zhang trong bpo-30103.)
lịch¶
Lớp HTMLCalendar có các thuộc tính lớp mới giúp dễ dàng tùy chỉnh các lớp CSS trong lịch HTML được sản xuất. (Được đóng góp bởi Oz Tiram trong bpo-30095.)
bộ sưu tập¶
collections.namedtuple() hiện hỗ trợ các giá trị mặc định. (Được đóng góp bởi Raymond Hettinger trong bpo-32320.)
biên soạn tất cả¶
compileall.compile_dir() đã học được tham số invalidation_mode mới, tham số này có thể được sử dụng để kích hoạt hash-based .pyc invalidation. Chế độ vô hiệu hóa cũng có thể được chỉ định trên dòng lệnh bằng cách sử dụng đối số --invalidation-mode mới. (Được đóng góp bởi Benjamin Peterson trong bpo-31650.)
đồng thời.futures¶
ProcessPoolExecutor và ThreadPoolExecutor hiện hỗ trợ các đối số hàm tạo initializer và initargs mới. (Được đóng góp bởi Antoine Pitrou trong bpo-21423.)
Zz000zz hiện có thể lấy bối cảnh đa xử lý thông qua đối số mp_context mới. (Được đóng góp bởi Thomas Moreau trong bpo-31540.)
bối cảnh¶
Zz000zz mới là trình quản lý bối cảnh không cần hoạt động đơn giản hơn và nhanh hơn ExitStack. (Được đóng góp bởi Jesse-Bakker trong bpo-10049.)
asynccontextmanager(), AbstractAsyncContextManager và AsyncExitStack mới đã được thêm vào để bổ sung cho các phiên bản đồng bộ của chúng. (Được đóng góp bởi Jelle Zijlstra trong bpo-29679 và bpo-30241, và bởi Alexander Mohr và Ilya Kulakov trong bpo-29302.)
hồ sơ c¶
Dòng lệnh cProfile hiện chấp nhận -m module_name thay thế cho đường dẫn tập lệnh. (Được đóng góp bởi Sanyam Khurana trong bpo-21862.)
hầm mộ¶
Mô-đun crypt hiện hỗ trợ phương pháp băm Blowfish. (Được đóng góp bởi Serhiy Storchaka trong bpo-31664.)
Hàm mksalt() hiện cho phép chỉ định số vòng để băm. (Được đóng góp bởi Serhiy Storchaka trong bpo-31702.)
ngày giờ¶
Phương thức datetime.fromisoformat() mới xây dựng một đối tượng datetime từ một chuỗi ở một trong các định dạng do datetime.isoformat() xuất ra. (Được đóng góp bởi Paul Ganssle trong bpo-15873.)
Lớp tzinfo hiện hỗ trợ bù trừ phút phụ. (Được đóng góp bởi Alexander Belopolsky trong bpo-5288.)
dbm¶
dbm.dumb hiện hỗ trợ đọc các tệp chỉ đọc và không còn ghi tệp chỉ mục khi nó không bị thay đổi.
số thập phân¶
Mô-đun decimal hiện sử dụng context variables để lưu trữ ngữ cảnh thập phân. (Được đóng góp bởi Yury Selivanov trong bpo-32630.)
dis¶
Hàm dis() hiện có thể tách rời các đối tượng mã lồng nhau (mã hiểu, biểu thức trình tạo và hàm lồng nhau cũng như mã được sử dụng để xây dựng các lớp lồng nhau). Độ sâu tối đa của đệ quy tháo gỡ được kiểm soát bởi tham số depth mới. (Được đóng góp bởi Serhiy Storchaka trong bpo-11822.)
nước cất¶
README.rst hiện được đưa vào danh sách các README tiêu chuẩn của distutils và do đó được đưa vào các bản phân phối nguồn. (Được đóng góp bởi Ryan Gonzalez trong bpo-11913.)
liệt kê¶
Zz000zz đã học thuộc tính lớp _ignore_ mới, cho phép liệt kê tên của các thuộc tính không nên trở thành thành viên enum. (Được đóng góp bởi Ethan Furman trong bpo-31801.)
Trong Python 3.8, việc cố gắng kiểm tra các đối tượng không phải Enum trong các lớp Enum sẽ tạo ra TypeError (ví dụ: 1 in Color); tương tự, cố gắng kiểm tra các đối tượng không phải Flag trong thành viên Flag sẽ tăng TypeError (ví dụ: 1 in Perm.RW); hiện tại, cả hai thao tác đều trả về False và không được dùng nữa. (Được đóng góp bởi Ethan Furman trong bpo-33217.)
công cụ chức năng¶
functools.singledispatch() hiện hỗ trợ đăng ký triển khai bằng cách sử dụng chú thích loại. (Được đóng góp bởi Łukasz Langa trong bpo-32227.)
gc¶
Chức năng gc.freeze() mới cho phép đóng băng tất cả các đối tượng được trình thu gom rác theo dõi và loại trừ chúng khỏi các bộ sưu tập trong tương lai. Điều này có thể được sử dụng trước lệnh gọi POSIX fork() để làm cho GC trở nên thân thiện với việc sao chép khi ghi hoặc để tăng tốc độ thu thập. Các chức năng gc.unfreeze() mới đảo ngược hoạt động này. Ngoài ra, gc.get_freeze_count() có thể được sử dụng để lấy số lượng vật thể bị đóng băng. (Được đóng góp bởi Li Zekun trong bpo-31558.)
hmac¶
Mô-đun hmac hiện có chức năng digest() một lần được tối ưu hóa, nhanh hơn tới ba lần so với HMAC(). (Được đóng góp bởi Christian Heimes trong bpo-32433.)
http.client¶
HTTPConnection và HTTPSConnection hiện hỗ trợ đối số blocksize mới để cải thiện thông lượng tải lên. (Được đóng góp bởi Nir Soffer trong bpo-31945.)
http.máy chủ¶
SimpleHTTPRequestHandler hiện hỗ trợ tiêu đề HTTP If-Modified-Since. Máy chủ trả về trạng thái phản hồi 304 nếu tệp đích không được sửa đổi sau thời gian được chỉ định trong tiêu đề. (Được đóng góp bởi Pierre Quentel trong bpo-29654.)
SimpleHTTPRequestHandler chấp nhận đối số directory mới, ngoài đối số dòng lệnh --directory mới. Với tham số này, máy chủ phục vụ thư mục được chỉ định, theo mặc định nó sử dụng thư mục làm việc hiện tại. (Được đóng góp bởi Stéphane Wirtel và Julien Palard trong bpo-28707.)
Lớp ThreadingHTTPServer mới sử dụng các luồng để xử lý các yêu cầu bằng ThreadingMixIn. Nó được sử dụng khi http.server chạy với -m. (Được đóng góp bởi Julien Palard trong bpo-31639.)
nhàn rỗi và IDLE¶
Nhiều bản sửa lỗi để tự động hoàn thành. (Được đóng góp bởi Louie Lu trong bpo-15786.)
Trình duyệt mô-đun (trên menu Tệp, trước đây gọi là Trình duyệt lớp), giờ đây hiển thị các hàm và lớp lồng nhau bên cạnh các hàm và lớp cấp cao nhất. (Được đóng góp bởi Guilherme Polo, Cheryl Sabella và Terry Jan Reedy trong bpo-1612262.)
Hộp thoại Cài đặt (Tùy chọn, Định cấu hình IDLE) đã được viết lại một phần để cải thiện cả về hình thức lẫn chức năng. (Được đóng góp bởi Cheryl Sabella và Terry Jan Reedy trong nhiều số báo.)
Mẫu phông chữ hiện bao gồm lựa chọn các ký tự không phải tiếng Latinh để người dùng có thể thấy rõ hơn tác dụng của việc chọn một phông chữ cụ thể. (Được đóng góp bởi Terry Jan Reedy trong bpo-13802.) Mẫu có thể được chỉnh sửa để bao gồm các ký tự khác. (Được đóng góp bởi Serhiy Storchaka trong bpo-31860.)
Các tính năng IDLE trước đây được triển khai dưới dạng tiện ích mở rộng đã được triển khai lại dưới dạng các tính năng thông thường. Cài đặt của chúng đã được chuyển từ tab Tiện ích mở rộng sang các tab hộp thoại khác. (Được đóng góp bởi Charles Wohlganger và Terry Jan Reedy trong bpo-27099.)
Tùy chọn ngữ cảnh mã soạn thảo đã được sửa đổi. Hộp hiển thị tất cả các dòng ngữ cảnh cho đến dòng tối đa. Nhấp vào một dòng ngữ cảnh sẽ chuyển trình soạn thảo tới dòng đó. Màu ngữ cảnh cho chủ đề tùy chỉnh được thêm vào tab Nổi bật của hộp thoại Cài đặt. (Được đóng góp bởi Cheryl Sabella và Terry Jan Reedy trong bpo-33642, bpo-33768 và bpo-33679.)
Trên Windows, lệnh gọi API mới cho Windows biết rằng tk chia tỷ lệ cho DPI. Trên Windows 8.1+ hoặc 10, với các thuộc tính tương thích DPI của tệp nhị phân Python không thay đổi và độ phân giải màn hình lớn hơn 96 DPI, điều này sẽ làm cho văn bản và đường nét sắc nét hơn. Nếu không thì nó sẽ không có tác dụng. (Được đóng góp bởi Terry Jan Reedy trong bpo-33656.)
Mới trong 3.7.1:
Đầu ra trên N dòng (50 theo mặc định) được nén xuống một nút. N có thể được thay đổi trong phần PyShell của trang Chung của hộp thoại Cài đặt. Các dòng ít hơn, nhưng có thể dài hơn, có thể được nén bằng cách nhấp chuột phải vào đầu ra. Đầu ra bị nén có thể được mở rộng tại chỗ bằng cách nhấp đúp vào nút hoặc vào bảng tạm hoặc một cửa sổ riêng bằng cách nhấp chuột phải vào nút. (Được đóng góp bởi Tal Einat trong bpo-1529353.)
Những thay đổi ở trên đã được đưa trở lại vào bản phát hành bảo trì 3.6.
NEW trong 3.7.4:
Thêm "Chạy tùy chỉnh" vào menu Chạy để chạy mô-đun có cài đặt tùy chỉnh. Mọi đối số dòng lệnh đã nhập đều được thêm vào sys.argv. Chúng sẽ xuất hiện lại trong hộp cho lần chạy tùy chỉnh tiếp theo. Người ta cũng có thể ngăn chặn việc khởi động lại mô-đun chính Shell thông thường. (Được đóng góp bởi Cheryl Sabella, Terry Jan Reedy và những người khác trong bpo-5680 và bpo-37627.)
Mới trong phiên bản 3.7.5:
Thêm số dòng tùy chọn cho cửa sổ soạn thảo IDLE. Windows mở mà không có số dòng trừ khi được đặt khác trong tab Chung của hộp thoại cấu hình. Số dòng cho cửa sổ hiện có được hiển thị và ẩn trong menu Tùy chọn. (Được đóng góp bởi Tal Einat và Saimadhav Heblikar trong bpo-17535.)
nhập khẩu¶
importlib.abc.ResourceReader ABC được giới thiệu để hỗ trợ tải tài nguyên từ các gói. Xem thêm importlib.resource. (Được đóng góp bởi Barry Warsaw, Brett Cannon trong bpo-32248.)
importlib.reload() hiện tăng ModuleNotFoundError nếu mô-đun thiếu thông số kỹ thuật. (Được đóng góp bởi Garvit Khatri trong bpo-29851.)
importlib.util.find_spec() hiện tăng ModuleNotFoundError thay vì AttributeError nếu mô-đun gốc được chỉ định không phải là một gói (tức là thiếu thuộc tính __path__). (Được đóng góp bởi Milan Oberkirch trong bpo-30436.)
Zz000zz mới có thể được sử dụng để tính toán hàm băm của nguồn được truyền. Zz001zz nhúng giá trị được hàm này trả về.
io¶
Phương pháp TextIOWrapper.reconfigure() mới có thể được sử dụng để định cấu hình lại luồng văn bản với các cài đặt mới. (Được đóng góp bởi Antoine Pitrou trong bpo-30526 và INADA Naoki trong bpo-15216.)
váy ipad¶
Các phương pháp subnet_of() và supernet_of() mới của ipaddress.IPv6Network và ipaddress.IPv4Network có thể được sử dụng để kiểm tra khả năng ngăn chặn mạng. (Được đóng góp bởi Michel Albert và Cheryl Sabella trong bpo-20825.)
itertools¶
itertools.islice() hiện chấp nhận integer-like objects làm đối số bắt đầu, dừng và cắt lát. (Được đóng góp bởi Will Roberts trong bpo-30537.)
ngôn ngữ¶
Đối số monetary mới cho locale.format_string() có thể được sử dụng để thực hiện chuyển đổi bằng cách sử dụng dấu phân cách hàng nghìn tiền tệ và chuỗi nhóm. (Được đóng góp bởi Garvit trong bpo-10379.)
Hàm locale.getpreferredencoding() hiện luôn trả về 'UTF-8' trên Android hoặc khi ở forced UTF-8 mode.
khai thác gỗ¶
Các phiên bản Logger hiện có thể được chọn. (Được đóng góp bởi Vinay Sajip trong bpo-30520.)
Phương thức StreamHandler.setStream() mới có thể được sử dụng để thay thế luồng nhật ký sau khi tạo trình xử lý. (Được đóng góp bởi Vinay Sajip trong bpo-30522.)
Hiện tại có thể chỉ định đối số từ khóa cho hàm tạo của trình xử lý trong cấu hình được truyền tới logging.config.fileConfig(). (Được đóng góp bởi Preston Landers trong bpo-31080.)
môn toán¶
Hàm math.remainder() mới triển khai thao tác còn lại kiểu IEEE 754. (Được đóng góp bởi Mark Dickinson trong bpo-29962.)
kiểu bắt chước¶
Loại .bmp MIME đã được thay đổi từ 'image/x-ms-bmp' thành 'image/bmp'. (Được đóng góp bởi Nitish Chandra trong bpo-22589.)
msilib¶
Phương thức Database.Close() mới có thể được sử dụng để đóng cơ sở dữ liệu MSI. (Được đóng góp bởi Berker Peksag trong bpo-20486.)
đa xử lý¶
Phương thức Process.close() mới đóng đối tượng tiến trình một cách rõ ràng và giải phóng tất cả tài nguyên liên quan đến nó. ValueError được nâng lên nếu tiến trình cơ bản vẫn đang chạy. (Được đóng góp bởi Antoine Pitrou trong bpo-30596.)
Phương pháp Process.kill() mới có thể được sử dụng để chấm dứt quá trình bằng tín hiệu SIGKILL trên Unix. (Được đóng góp bởi Vitor Pereira trong bpo-30794.)
Các chủ đề không phải daemon được tạo bởi Process hiện đã được tham gia khi thoát quy trình. (Được đóng góp bởi Antoine Pitrou trong bpo-18966.)
hệ điều hành¶
os.fwalk() hiện chấp nhận đối số path là bytes. (Được đóng góp bởi Serhiy Storchaka trong bpo-28682.)
os.scandir() đã nhận được hỗ trợ cho file descriptors. (Được đóng góp bởi Serhiy Storchaka trong bpo-25996.)
Hàm register_at_fork() mới cho phép đăng ký lệnh gọi lại Python để được thực thi tại ngã ba quy trình. (Được đóng góp bởi Antoine Pitrou trong bpo-16500.)
Đã thêm chức năng os.preadv() (kết hợp chức năng của os.readv() và os.pread()) và chức năng os.pwritev() (kết hợp chức năng của os.writev() và os.pwrite()). (Được đóng góp bởi Pablo Galindo trong bpo-31368.)
Đối số chế độ của os.makedirs() không còn ảnh hưởng đến các bit cấp phép tệp của các thư mục cấp trung gian mới được tạo. (Được đóng góp bởi Serhiy Storchaka trong bpo-19930.)
os.dup2() hiện trả về bộ mô tả tệp mới. Trước đây, None luôn được trả về. (Được đóng góp bởi Benjamin Peterson trong bpo-32441.)
Cấu trúc được trả về bởi os.stat() hiện chứa thuộc tính st_fstype trên Solaris và các dẫn xuất của nó. (Được đóng góp bởi Jesús Cea Avión trong bpo-32659.)
đường dẫn¶
Phương pháp Path.is_mount() mới hiện có sẵn trên hệ thống POSIX và có thể được sử dụng để xác định xem đường dẫn có phải là điểm gắn kết hay không. (Được đóng góp bởi Cooper Ry Lees trong bpo-30897.)
pdb¶
pdb.set_trace() hiện có đối số chỉ từ khóa header tùy chọn. Nếu được cung cấp, nó sẽ được in ra bảng điều khiển ngay trước khi quá trình gỡ lỗi bắt đầu. (Được đóng góp bởi Barry Warsaw trong bpo-31389.)
Dòng lệnh pdb hiện chấp nhận -m module_name thay thế cho tệp tập lệnh. (Được đóng góp bởi Mario Corchero trong bpo-32206.)
py_compile¶
py_compile.compile() -- và mở rộng là compileall -- hiện tôn trọng biến môi trường SOURCE_DATE_EPOCH bằng cách tạo vô điều kiện các tệp .pyc để xác thực dựa trên hàm băm. Điều này cho phép đảm bảo reproducible builds của các tệp .pyc khi chúng được tạo một cách háo hức. (Được đóng góp bởi Bernhard M. Wiedemann trong bpo-29708.)
pydoc¶
Máy chủ pydoc hiện có thể liên kết với tên máy chủ tùy ý được chỉ định bởi đối số dòng lệnh -n mới. (Được đóng góp bởi Feanil Patel trong bpo-31128.)
xếp hàng¶
Lớp SimpleQueue mới là hàng đợi FIFO không giới hạn. (Được đóng góp bởi Antoine Pitrou trong bpo-14976.)
lại¶
Các cờ re.ASCII, re.LOCALE và re.UNICODE có thể được đặt trong phạm vi của một nhóm. (Được đóng góp bởi Serhiy Storchaka trong bpo-31690.)
re.split() hiện hỗ trợ phân tách theo mẫu như r'\b', '^$' hoặc (?=-) khớp với một chuỗi trống. (Được đóng góp bởi Serhiy Storchaka trong bpo-25054.)
Biểu thức chính quy được biên dịch bằng cờ re.LOCALE không còn phụ thuộc vào ngôn ngữ tại thời điểm biên dịch. Cài đặt ngôn ngữ chỉ được áp dụng khi sử dụng biểu thức chính quy đã biên dịch. (Được đóng góp bởi Serhiy Storchaka trong bpo-30215.)
FutureWarning hiện được phát ra nếu một biểu thức chính quy chứa các cấu trúc bộ ký tự sẽ thay đổi về mặt ngữ nghĩa trong tương lai, chẳng hạn như các tập hợp lồng nhau và các thao tác tập hợp. (Được đóng góp bởi Serhiy Storchaka trong bpo-30349.)
Giờ đây, bạn có thể sao chép các đối tượng biểu thức chính quy và đối sánh đã biên dịch bằng cách sử dụng copy.copy() và copy.deepcopy(). (Được đóng góp bởi Serhiy Storchaka trong bpo-10076.)
tín hiệu¶
Đối số warn_on_full_buffer mới cho hàm signal.set_wakeup_fd() cho phép chỉ định xem Python có in cảnh báo trên stderr khi bộ đệm đánh thức tràn hay không. (Được đóng góp bởi Nathaniel J. Smith trong bpo-30050.)
ổ cắm¶
Phương thức socket.getblocking() mới trả về True nếu ổ cắm ở chế độ chặn và False nếu ngược lại. (Được đóng góp bởi Yury Selivanov trong bpo-32373.)
Hàm socket.close() mới đóng bộ mô tả tệp ổ cắm đã truyền. Nên sử dụng chức năng này thay vì os.close() để tương thích tốt hơn trên các nền tảng. (Được đóng góp bởi Christian Heimes trong bpo-32454.)
Mô-đun socket hiện hiển thị các hằng số socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) và socket.TCP_NOTSENT_LOWAT (Linux 3.12). (Được đóng góp bởi Omar Sandoval trong bpo-26273 và Nathaniel J. Smith trong bpo-29728.)
Hỗ trợ cho ổ cắm socket.AF_VSOCK đã được thêm vào để cho phép liên lạc giữa các máy ảo và máy chủ của chúng. (Được đóng góp bởi Cathy Avery trong bpo-27584.)
Theo mặc định, các ổ cắm hiện tự động phát hiện dòng, loại và giao thức từ bộ mô tả tệp. (Được đóng góp bởi Christian Heimes trong bpo-28134.)
máy chủ ổ cắm¶
socketserver.ThreadingMixIn.server_close hiện đợi cho đến khi tất cả các luồng không phải daemon hoàn tất. socketserver.ForkingMixIn.server_close bây giờ đợi cho đến khi tất cả các tiến trình con hoàn tất.
Thêm thuộc tính lớp socketserver.ForkingMixIn.block_on_close mới vào các lớp socketserver.ForkingMixIn và socketserver.ThreadingMixIn. Đặt thuộc tính lớp thành False để có hành vi trước 3.7.
sqlite3¶
sqlite3.Connection hiện hiển thị phương thức backup() khi thư viện SQLite cơ bản ở phiên bản 3.6.11 trở lên. (Được đóng góp bởi Lele Gaifax trong bpo-27645.)
Đối số database của sqlite3.connect() hiện chấp nhận bất kỳ path-like object nào, thay vì chỉ một chuỗi. (Được đóng góp bởi Anders Lorentsen trong bpo-31843.)
ssl¶
Mô-đun ssl hiện sử dụng API tích hợp của OpenSSL thay vì match_hostname() để kiểm tra tên máy chủ hoặc địa chỉ IP. Các giá trị được xác thực trong quá trình bắt tay TLS. Bất kỳ lỗi xác thực chứng chỉ nào bao gồm cả việc không kiểm tra tên máy chủ hiện sẽ tăng SSLCertVerificationError và hủy bỏ quá trình bắt tay bằng thông báo Cảnh báo TLS thích hợp. Ngoại lệ mới chứa thông tin bổ sung. Xác thực tên máy chủ có thể được tùy chỉnh bằng SSLContext.hostname_checks_common_name. (Được đóng góp bởi Christian Heimes trong bpo-31399.)
Ghi chú
Việc kiểm tra tên máy chủ được cải thiện yêu cầu triển khai libssl tương thích với OpenSSL 1.0.2 hoặc 1.1. Do đó, OpenSSL 0.9.8 và 1.0.1 không còn được hỗ trợ (xem Xóa hỗ trợ nền tảng để biết thêm chi tiết). Mô-đun ssl hầu hết tương thích với LibreSSL 2.7.2 trở lên.
Mô-đun ssl không còn gửi địa chỉ IP trong tiện ích mở rộng SNI TLS nữa. (Được đóng góp bởi Christian Heimes trong bpo-32185.)
match_hostname() không còn hỗ trợ các ký tự đại diện một phần như www*.example.org. (Được đóng góp bởi Mandeep Singh trên bpo-23033 và Christian Heimes trên bpo-31399.)
Lựa chọn bộ mật mã mặc định của mô-đun ssl hiện sử dụng cách tiếp cận danh sách đen thay vì danh sách trắng được mã hóa cứng. Python không còn kích hoạt lại các mật mã đã bị chặn bởi các bản cập nhật bảo mật OpenSSL nữa. Lựa chọn bộ mật mã mặc định có thể được cấu hình tại thời điểm biên dịch. (Được đóng góp bởi Christian Heimes trong bpo-31429.)
Hiện đã hỗ trợ xác thực chứng chỉ máy chủ chứa tên miền quốc tế hóa (IDN). Là một phần của thay đổi này, thuộc tính SSLSocket.server_hostname hiện lưu trữ tên máy chủ dự kiến ở dạng nhãn A ("xn--pythn-mua.org"), thay vì dạng nhãn U ("pythön.org"). (Được đóng góp bởi Nathaniel J. Smith và Christian Heimes trong bpo-28414.)
Mô-đun ssl có hỗ trợ sơ bộ và thử nghiệm cho TLS 1.3 và OpenSSL 1.1.1. Tại thời điểm phát hành Python 3.7.0, OpenSSL 1.1.1 vẫn đang được phát triển và TLS 1.3 vẫn chưa được hoàn thiện. Giao thức và bắt tay TLS 1.3 hoạt động hơi khác so với TLS 1.2 trở về trước, hãy xem TLS 1.3. (Được đóng góp bởi Christian Heimes trong bpo-32947, bpo-20995, bpo-29136, bpo-30622 và bpo-33618)
SSLSocket và SSLObject không còn có hàm tạo công khai nữa. Khởi tạo trực tiếp chưa bao giờ là một tính năng được ghi lại và hỗ trợ. Các phiên bản phải được tạo bằng các phương thức SSLContext wrap_socket() và wrap_bio(). (Được đóng góp bởi Christian Heimes trong bpo-32951)
API OpenSSL 1.1 để thiết lập phiên bản giao thức TLS tối thiểu và tối đa có sẵn dưới dạng SSLContext.minimum_version và SSLContext.maximum_version. Các giao thức được hỗ trợ được biểu thị bằng một số cờ mới, chẳng hạn như HAS_TLSv1_1. (Được đóng góp bởi Christian Heimes trong bpo-32609.)
Đã thêm ssl.SSLContext.post_handshake_auth để bật và ssl.SSLSocket.verify_client_post_handshake() để bắt đầu xác thực sau bắt tay TLS 1.3. (Được đóng góp bởi Christian Heimes trong gh-78851.)
chuỗi¶
string.Template giờ đây cho phép bạn tùy ý sửa đổi mẫu biểu thức chính quy cho phần giữ chỗ được giằng và không được giằng riêng biệt. (Được đóng góp bởi Barry Warsaw trong bpo-1198569.)
quy trình con¶
Hàm subprocess.run() chấp nhận đối số từ khóa capture_output mới. Khi đúng, stdout và stderr sẽ được ghi lại. Điều này tương đương với việc chuyển subprocess.PIPE làm đối số stdout và stderr. (Được đóng góp bởi Bo Bayles trong bpo-32102.)
Hàm subprocess.run và hàm tạo subprocess.Popen hiện chấp nhận đối số từ khóa text làm bí danh cho universal_newlines. (Được đóng góp bởi Andrew Clegg trong bpo-31756.)
Trên Windows, mặc định cho close_fds đã được thay đổi từ False thành True khi chuyển hướng các thẻ điều khiển tiêu chuẩn. Hiện tại, bạn có thể đặt close_fds thành true khi chuyển hướng các thẻ điều khiển tiêu chuẩn. Xem subprocess.Popen. Điều này có nghĩa là close_fds hiện được mặc định là True trên tất cả các nền tảng được hỗ trợ. (Được đóng góp bởi Segev Finer trong bpo-19764.)
Mô-đun quy trình con giờ đây duyên dáng hơn khi xử lý KeyboardInterrupt trong subprocess.call(), subprocess.run() hoặc trong trình quản lý ngữ cảnh Popen. Bây giờ nó đợi một khoảng thời gian ngắn để đứa trẻ thoát ra trước khi tiếp tục xử lý ngoại lệ KeyboardInterrupt. (Được đóng góp bởi Gregory P. Smith trong bpo-25942.)
hệ thống¶
Chức năng hook sys.breakpointhook() mới được gọi bằng breakpoint() tích hợp. (Được đóng góp bởi Barry Warsaw trong bpo-31353.)
Trên Android, sys.getandroidapilevel() mới trả về phiên bản Android API tại thời điểm xây dựng. (Được đóng góp bởi Victor Stinner trong bpo-28740.)
Hàm sys.get_coroutine_origin_tracking_depth() mới trả về độ sâu theo dõi nguồn gốc coroutine hiện tại, do sys.set_coroutine_origin_tracking_depth() mới thiết lập. asyncio đã được chuyển đổi để sử dụng API mới này thay vì sys.set_coroutine_wrapper() không còn được dùng nữa. (Được đóng góp bởi Nathaniel J. Smith trong bpo-32591.)
thời gian¶
PEP 564 bổ sung sáu chức năng mới với độ phân giải nano giây vào mô-đun time:
Số nhận dạng đồng hồ mới đã được thêm vào:
time.CLOCK_BOOTTIME(Linux): Giống hệttime.CLOCK_MONOTONIC, ngoại trừ nó cũng bao gồm bất kỳ thời điểm nào hệ thống bị treo.time.CLOCK_PROF(FreeBSD, NetBSD và OpenBSD): Bộ đếm thời gian CPU có độ phân giải cao cho mỗi quy trình.time.CLOCK_UPTIME(FreeBSD, OpenBSD): Thời gian có giá trị tuyệt đối là thời gian hệ thống đã chạy và không bị treo, cung cấp phép đo thời gian hoạt động chính xác.
Các hàm time.thread_time() và time.thread_time_ns() mới có thể được sử dụng để lấy số đo thời gian CPU trên mỗi luồng. (Được đóng góp bởi Antoine Pitrou trong bpo-32025.)
Hàm time.pthread_getcpuclockid() mới trả về ID đồng hồ của đồng hồ thời gian CPU dành riêng cho luồng.
tkinter¶
Lớp tkinter.ttk.Spinbox mới hiện đã có sẵn. (Được đóng góp bởi Alan Moore trong bpo-32585.)
dấu vết¶
tracemalloc.Traceback hoạt động giống truy nguyên thông thường hơn, sắp xếp các khung hình từ cũ nhất đến gần đây nhất. Traceback.format() hiện chấp nhận limit âm, cắt bớt kết quả đối với các khung hình cũ nhất của abs(limit). Để có hành vi cũ, hãy sử dụng đối số most_recent_first mới cho Traceback.format(). (Được đóng góp bởi Jesse Bakker trong bpo-32121.)
các loại¶
Các lớp WrapperDescriptorType, MethodWrapperType, MethodDescriptorType và ClassMethodDescriptorType mới hiện đã có sẵn. (Được đóng góp bởi Manuel Krebber và Guido van Rossum trong bpo-29377 và Serhiy Storchaka trong bpo-32265.)
Hàm types.resolve_bases() mới phân giải các mục MRO một cách linh hoạt như được chỉ định bởi PEP 560. (Được đóng góp bởi Ivan Levkivskyi trong bpo-32717.)
dữ liệu unicode¶
Cơ sở dữ liệu unicodedata nội bộ đã được nâng cấp để sử dụng Unicode 11. (Được đóng góp bởi Benjamin Peterson.)
nhỏ nhất¶
Tùy chọn dòng lệnh -k mới cho phép lọc các bài kiểm tra theo chuỗi con tên hoặc mẫu giống Unix shell. Ví dụ: python -m unittest -k foo chạy foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo nhưng không chạy bar_tests.FooTest.test_something. (Được đóng góp bởi Jonas Haag trong bpo-32071.)
unittest.mock¶
Các thuộc tính sentinel hiện giữ nguyên danh tính của chúng khi chúng là copied hoặc pickled. (Được đóng góp bởi Serhiy Storchaka trong bpo-20804.)
Chức năng seal() mới cho phép niêm phong các phiên bản Mock, điều này sẽ không cho phép tạo thêm các mô hình thuộc tính. Con dấu được áp dụng đệ quy cho tất cả các thuộc tính mà bản thân chúng là mô phỏng. (Được đóng góp bởi Mario Corchero trong bpo-30541.)
urllib.parse¶
urllib.parse.quote() đã được cập nhật từ RFC 2396 lên RFC 3986, thêm ~ vào bộ ký tự không bao giờ được trích dẫn theo mặc định. (Được đóng góp bởi Christian Theune và Ratnadeep Debnath trong bpo-16285.)
ừ¶
Hàm uu.encode() hiện chấp nhận đối số từ khóa backtick tùy chọn. Khi giá trị này đúng, số 0 được biểu thị bằng '`' thay vì dấu cách. (Được đóng góp bởi Xiang Zhang trong bpo-30103.)
uuid¶
Thuộc tính UUID.is_safe mới chuyển tiếp thông tin từ nền tảng về việc liệu UUID được tạo có được tạo bằng phương thức an toàn đa xử lý hay không. (Được đóng góp bởi Barry Warsaw trong bpo-22807.)
uuid.getnode() hiện ưu tiên các địa chỉ MAC được quản lý phổ biến hơn các địa chỉ MAC được quản lý cục bộ. Điều này đảm bảo tốt hơn cho tính duy nhất toàn cầu của UUID được trả về từ uuid.uuid1(). Nếu chỉ có địa chỉ MAC được quản lý cục bộ thì địa chỉ đầu tiên được tìm thấy sẽ được trả về. (Được đóng góp bởi Barry Warsaw trong bpo-32107.)
cảnh báo¶
Việc khởi tạo các bộ lọc cảnh báo mặc định đã thay đổi như sau:
các cảnh báo được kích hoạt thông qua các tùy chọn dòng lệnh (bao gồm các tùy chọn dành cho
-bvà tùy chọn-Xdevdành riêng cho CPython mới) luôn được chuyển đến máy cảnh báo thông qua thuộc tínhsys.warnoptions.các bộ lọc cảnh báo được kích hoạt thông qua dòng lệnh hoặc môi trường hiện có thứ tự ưu tiên sau:
bộ lọc
BytesWarningcho-b(hoặc-bb)bất kỳ bộ lọc nào được chỉ định bằng tùy chọn
-Wbất kỳ bộ lọc nào được chỉ định bằng biến môi trường
PYTHONWARNINGSbất kỳ bộ lọc cụ thể CPython nào khác (ví dụ: bộ lọc
defaultđược thêm cho chế độ-X devmới)bất kỳ bộ lọc tiềm ẩn nào được xác định trực tiếp bởi bộ máy cảnh báo
trong CPython debug builds, tất cả các cảnh báo hiện được hiển thị theo mặc định (danh sách bộ lọc ngầm trống)
(Được đóng góp bởi Nick Coghlan và Victor Stinner trong bpo-20361, bpo-32043 và bpo-32230.)
Cảnh báo không dùng nữa một lần nữa được hiển thị theo mặc định trong các tập lệnh một tệp và tại dấu nhắc tương tác. Xem PEP 565: Hiển thị cảnh báo không dùng nữa trong __main__ để biết chi tiết. (Được đóng góp bởi Nick Coghlan trong bpo-31975.)
xml¶
Để giảm thiểu khả năng truy xuất DTD và thực thể bên ngoài, các mô-đun xml.dom.minidom và xml.sax không còn xử lý các thực thể bên ngoài theo mặc định nữa. (Được đóng góp bởi Christian Heimes trong gh-61441.)
xml.etree¶
Các vị từ ElementPath trong các phương thức find() giờ đây có thể so sánh văn bản của nút hiện tại với [. = "text"], không chỉ văn bản ở trẻ em. Vị ngữ cũng cho phép thêm khoảng trắng để dễ đọc hơn. (Được đóng góp bởi Stefan Behnel trong bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function() hiện có thể được sử dụng làm vật trang trí. (Được đóng góp bởi Xiang Zhang trong bpo-7769.)
ứng dụng zip¶
Hàm create_archive() hiện chấp nhận đối số filter tùy chọn để cho phép người dùng chọn tệp nào sẽ được đưa vào kho lưu trữ. (Được đóng góp bởi Irmen de Jong trong bpo-31072.)
Hàm create_archive() hiện chấp nhận đối số compressed tùy chọn để tạo kho lưu trữ nén. Tùy chọn dòng lệnh --compress cũng đã được thêm vào để hỗ trợ nén. (Được đóng góp bởi Zhiming Wang trong bpo-31638.)
tập tin zip¶
ZipFile hiện chấp nhận tham số compresslevel mới để kiểm soát mức độ nén. (Được đóng góp bởi Bo Bayles trong bpo-21417.)
Các thư mục con trong kho lưu trữ được tạo bởi ZipFile hiện được lưu trữ theo thứ tự bảng chữ cái. (Được đóng góp bởi Bernhard M. Wiedemann trong bpo-30693.)
C API Thay đổi¶
Một API mới cho bộ nhớ cục bộ theo luồng đã được triển khai. Xem PEP 539: C API mới cho bộ nhớ cục bộ theo luồng để biết tổng quan và Lưu trữ theo chủ đề cụ thể API để tham khảo đầy đủ. (Được đóng góp bởi Masayuki Yamamoto trong bpo-25658.)
Chức năng context variables mới hiển thị một số new C APIs.
Hàm PyImport_GetModule() mới trả về mô-đun đã nhập trước đó với tên đã cho. (Được đóng góp bởi Eric Snow trong bpo-28411.)
Macro Py_RETURN_RICHCOMPARE mới giúp dễ dàng viết các hàm so sánh phong phú. (Được đóng góp bởi Petr Victorin trong bpo-23699.)
Macro Py_UNREACHABLE mới có thể được sử dụng để đánh dấu các đường dẫn mã không thể truy cập được. (Được đóng góp bởi Barry Warsaw trong bpo-31338.)
Zz000zz hiện hiển thị C API thông qua các hàm PyTraceMalloc_Track() và PyTraceMalloc_Untrack() mới. (Được đóng góp bởi Victor Stinner trong bpo-30054.)
Các điểm đánh dấu tĩnh import__find__load__start và import__find__load__done mới có thể được sử dụng để theo dõi quá trình nhập mô-đun. (Được đóng góp bởi Christian Heimes trong bpo-31574.)
Các trường name và doc của cấu trúc PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc và wrapperbase hiện thuộc loại const char * thay vì char *. (Được đóng góp bởi Serhiy Storchaka trong bpo-28761.)
Kết quả của PyUnicode_AsUTF8AndSize() và PyUnicode_AsUTF8() hiện thuộc loại const char * thay vì char *. (Được đóng góp bởi Serhiy Storchaka trong bpo-28769.)
Kết quả của PyMapping_Keys(), PyMapping_Values() và PyMapping_Items() giờ đây luôn là một danh sách, thay vì một danh sách hoặc một bộ dữ liệu. (Được đóng góp bởi Oren Milman trong bpo-28280.)
Đã thêm chức năng PySlice_Unpack() và PySlice_AdjustIndices(). (Được đóng góp bởi Serhiy Storchaka trong bpo-27867.)
PyOS_AfterFork() không còn được dùng nữa để thay thế bằng các chức năng mới PyOS_BeforeFork(), PyOS_AfterFork_Parent() và PyOS_AfterFork_Child(). (Được đóng góp bởi Antoine Pitrou trong bpo-16500.)
Singleton PyExc_RecursionErrorInst là một phần của API công khai đã bị xóa vì các thành viên của nó không bao giờ bị xóa có thể gây ra lỗi phân tách trong quá trình hoàn thiện trình thông dịch. Đóng góp của Xavier de Gaye trong bpo-22898 và bpo-30697.
Đã thêm hỗ trợ C API cho các múi giờ với các hàm tạo múi giờ PyTimeZone_FromOffset() và PyTimeZone_FromOffsetAndName(), đồng thời truy cập vào singleton UTC bằng PyDateTime_TimeZone_UTC. Đóng góp của Paul Ganssle trong bpo-10381.
Loại kết quả của PyThread_start_new_thread() và PyThread_get_thread_ident() cũng như tham số id của PyThreadState_SetAsyncExc() đã thay đổi từ long thành unsigned long. (Được đóng góp bởi Serhiy Storchaka trong bpo-6532.)
PyUnicode_AsWideCharString() hiện tăng ValueError nếu đối số thứ hai là NULL và chuỗi wchar_t* chứa các ký tự null. (Được đóng góp bởi Serhiy Storchaka trong bpo-30708.)
Những thay đổi đối với trình tự khởi động và quản lý bộ cấp phát bộ nhớ động có nghĩa là yêu cầu dài về việc gọi Py_Initialize() trước khi gọi hầu hết các hàm C API hiện được dựa nhiều hơn và việc không tuân thủ yêu cầu đó có thể dẫn đến lỗi phân tách trong các ứng dụng nhúng. Xem phần Chuyển sang Python 3.7 trong tài liệu này và phần Trước khi khởi tạo Python trong tài liệu C API để biết thêm chi tiết.
Zz000zz mới trả về ID duy nhất cho một trình thông dịch nhất định. (Được đóng góp bởi Eric Snow trong bpo-29102.)
Py_DecodeLocale(), Py_EncodeLocale() hiện sử dụng mã hóa UTF-8 khi UTF-8 mode được bật. (Được đóng góp bởi Victor Stinner trong bpo-29240.)
PyUnicode_DecodeLocaleAndSize() và PyUnicode_EncodeLocale() hiện sử dụng mã hóa ngôn ngữ hiện tại cho trình xử lý lỗi surrogateescape. (Được đóng góp bởi Victor Stinner trong bpo-29240.)
Các tham số start và end của PyUnicode_FindChar() hiện được điều chỉnh để hoạt động giống như các lát chuỗi. (Được đóng góp bởi Xiang Zhang trong bpo-28822.)
Xây dựng thay đổi¶
Hỗ trợ xây dựng --without-threads đã bị xóa. Mô-đun threading hiện luôn có sẵn. (Được đóng góp bởi Antoine Pitrou trong bpo-31370.).
Bản sao đầy đủ của libffi không còn được đóng gói để sử dụng khi xây dựng mô-đun _ctypes trên nền tảng không phải OSX UNIX. Hiện cần có bản sao libffi đã cài đặt khi xây dựng _ctypes trên các nền tảng như vậy. (Được đóng góp bởi Zachary Ware trong bpo-27979.)
Quá trình xây dựng Windows không còn phụ thuộc vào Subversion để lấy các nguồn bên ngoài nữa, thay vào đó, tập lệnh Python được sử dụng để tải xuống các tệp zip từ GitHub. Nếu không tìm thấy Python 3.6 trên hệ thống (thông qua py -3.6), NuGet được sử dụng để tải xuống bản sao Python 32-bit cho mục đích này. (Được đóng góp bởi Zachary Ware trong bpo-30450.)
Mô-đun ssl yêu cầu libssl tương thích OpenSSL 1.0.2 hoặc 1.1. OpenSSL 1.0.1 đã hết vòng đời vào ngày 31/12/2016 và không còn được hỗ trợ nữa. LibreSSL tạm thời không được hỗ trợ. Các bản phát hành LibreSSL lên tới phiên bản 2.6.4 thiếu các API OpenSSL 1.0.2 bắt buộc.
Tối ưu hóa¶
Chi phí gọi nhiều phương thức của các lớp thư viện tiêu chuẩn khác nhau được triển khai trong C đã giảm đáng kể bằng cách chuyển nhiều mã hơn để sử dụng quy ước METH_FASTCALL. (Được đóng góp bởi Victor Stinner trong bpo-29300, bpo-29507, bpo-29452 và bpo-29286.)
Nhiều cách tối ưu hóa khác nhau đã giảm 10% thời gian khởi động Python trên Linux và tới 30% trên macOS. (Được đóng góp bởi Victor Stinner, INADA Naoki trong bpo-29585 và Ivan Levkivskyi trong bpo-31333.)
Các cuộc gọi phương thức hiện nhanh hơn tới 20% do những thay đổi về mã byte giúp tránh tạo ra các phiên bản phương thức bị ràng buộc. (Được đóng góp bởi Yury Selivanov và INADA Naoki trong bpo-26110.)
Mô-đun asyncio đã nhận được một số cải tiến đáng chú ý cho các chức năng thường được sử dụng:
Chức năng
asyncio.get_event_loop()đã được triển khai lại trong C để nhanh hơn tới 15 lần. (Được đóng góp bởi Yury Selivanov trong bpo-32296.)Quản lý gọi lại
asyncio.Futuređã được tối ưu hóa. (Được đóng góp bởi Yury Selivanov trong bpo-32348.)asyncio.gather()hiện nhanh hơn tới 15%. (Được đóng góp bởi Yury Selivanov trong bpo-32355.)asyncio.sleep()hiện nhanh hơn tới 2 lần khi đối số delay bằng 0 hoặc âm. (Được đóng góp bởi Andrew Svetlov trong bpo-32351.)Chi phí hoạt động của chế độ gỡ lỗi asyncio đã giảm. (Được đóng góp bởi Antoine Pitrou trong bpo-31970.)
Nhờ có PEP 560 work, thời gian nhập của typing đã giảm đi 7 lần và nhiều thao tác gõ giờ đây nhanh hơn. (Được đóng góp bởi Ivan Levkivskyi trong bpo-32226.)
sorted() và list.sort() đã được tối ưu hóa cho các trường hợp thông thường để nhanh hơn tới 40-75%. (Được đóng góp bởi Elliot Gorokhovsky trong bpo-28685.)
dict.copy() hiện nhanh hơn tới 5,5 lần. (Được đóng góp bởi Yury Selivanov trong bpo-31179.)
hasattr() và getattr() hiện nhanh hơn khoảng 4 lần khi không tìm thấy name và obj không ghi đè object.__getattr__() hoặc object.__getattribute__(). (Được đóng góp bởi INADA Naoki trong bpo-32544.)
Việc tìm kiếm các ký tự Unicode nhất định (chẳng hạn như chữ viết hoa "Є" trong tiếng Ukraina trong một chuỗi chậm hơn tới 25 lần so với việc tìm kiếm các ký tự khác. Bây giờ nó chỉ chậm hơn 3 lần trong trường hợp xấu nhất. (Được đóng góp bởi Serhiy Storchaka trong bpo-24821.)
Nhà máy collections.namedtuple() đã được triển khai lại để giúp việc tạo các bộ dữ liệu được đặt tên nhanh hơn từ 4 đến 6 lần. (Được đóng góp bởi Jelle Zijlstra với những cải tiến hơn nữa của INADA Naoki, Serhiy Storchaka và Raymond Hettinger trong bpo-28638.)
datetime.date.fromordinal() và datetime.date.fromtimestamp() hiện nhanh hơn tới 30% trong trường hợp thông thường. (Được đóng góp bởi Paul Ganssle trong bpo-32403.)
Chức năng os.fwalk() hiện nhanh hơn tới 2 lần nhờ sử dụng os.scandir(). (Được đóng góp bởi Serhiy Storchaka trong bpo-25996.)
Tốc độ của chức năng shutil.rmtree() đã được cải thiện 20--40% nhờ sử dụng chức năng os.scandir(). (Được đóng góp bởi Serhiy Storchaka trong bpo-28564.)
Tối ưu hóa kết hợp và tìm kiếm không phân biệt chữ hoa chữ thường của regular expressions. Giờ đây, việc tìm kiếm một số mẫu có thể nhanh hơn tới 20 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-30285.)
re.compile() bây giờ chuyển đổi tham số flags thành đối tượng int nếu nó là RegexFlag. Hiện tại nó nhanh bằng Python 3.5 và nhanh hơn Python 3.6 khoảng 10% tùy theo mẫu. (Được đóng góp bởi INADA Naoki trong bpo-31671.)
Các phương thức modify() của các lớp selectors.EpollSelector, selectors.PollSelector và selectors.DevpollSelector có thể nhanh hơn khoảng 10% khi tải nặng. (Được đóng góp bởi Giampaolo Rodola' trong bpo-30014)
Tính năng gập liên tục đã được chuyển từ trình tối ưu hóa lỗ nhìn trộm sang trình tối ưu hóa AST mới, có thể thực hiện tối ưu hóa một cách nhất quán hơn. (Được đóng góp bởi Eugene Toder và INADA Naoki trong bpo-29469 và bpo-11549.)
Hầu hết các hàm và phương thức trong abc đã được viết lại bằng C. Điều này giúp việc tạo các lớp cơ sở trừu tượng và gọi isinstance() và issubclass() trên chúng nhanh hơn 1,5 lần. Điều này cũng giúp giảm thời gian khởi động Python tới 10%. (Được đóng góp bởi Ivan Levkivskyi và INADA Naoki trong bpo-31333)
Cải thiện tốc độ đáng kể cho các hàm tạo thay thế cho datetime.date và datetime.datetime bằng cách sử dụng các hàm tạo đường dẫn nhanh khi không xây dựng các lớp con. (Được đóng góp bởi Paul Ganssle trong bpo-32403)
Tốc độ so sánh của các phiên bản array.array đã được cải thiện đáng kể trong một số trường hợp nhất định. Hiện tại, nó nhanh hơn từ 10 đến 70 lần khi so sánh các mảng chứa các giá trị có cùng loại số nguyên. (Được đóng góp bởi Adrian Wielgosik trong bpo-24700.)
Các hàm math.erf() và math.erfc() hiện sử dụng triển khai thư viện C (nhanh hơn) trên hầu hết các nền tảng. (Được đóng góp bởi Serhiy Storchaka trong bpo-26121.)
Những thay đổi triển khai CPython khác¶
Giờ đây, móc theo dõi có thể chọn không tham gia nhận
linevà chọn tham gia nhận các sự kiệnopcodetừ trình thông dịch bằng cách đặt các thuộc tínhf_trace_linesvàf_trace_opcodesmới tương ứng trên khung được theo dõi. (Được đóng góp bởi Nick Coghlan trong bpo-31344.)Đã khắc phục một số vấn đề về tính nhất quán với các thuộc tính mô-đun gói không gian tên. Các đối tượng mô-đun không gian tên hiện có
__file__được đặt thànhNone(trước đây chưa được đặt) và__spec__.origincủa chúng cũng được đặt thànhNone(trước đây là chuỗi"namespace"). Xem bpo-32305. Ngoài ra,__spec__.loadercủa đối tượng mô-đun không gian tên được đặt thành cùng giá trị với__loader__(trước đây, giá trị trước đây được đặt thànhNone). Xem bpo-32303.Từ điển
locals()hiện hiển thị theo thứ tự từ vựng mà các biến đã được xác định. Trước đây, thứ tự không được xác định. (Được đóng góp bởi Raymond Hettinger trong bpo-32690.)Lệnh
distutilsuploadkhông còn cố gắng thay đổi các ký tự cuối dòng CR thành CRLF nữa. Điều này khắc phục sự cố hỏng với các sdist kết thúc bằng byte tương đương với CR. (Được đóng góp bởi Bo Bayles trong bpo-32304.)
Hành vi Python không được dùng nữa¶
Biểu thức lợi nhuận (cả mệnh đề yield và yield from) hiện không còn được dùng trong biểu thức hiểu và biểu thức trình tạo (ngoài biểu thức có thể lặp lại trong mệnh đề for ngoài cùng bên trái). Điều này đảm bảo rằng khả năng hiểu luôn trả về ngay lập tức một vùng chứa thuộc loại thích hợp (thay vì có khả năng trả về một đối tượng generator iterator), trong khi các biểu thức trình tạo sẽ không cố gắng xen kẽ đầu ra ngầm định của chúng với đầu ra từ bất kỳ biểu thức lợi nhuận rõ ràng nào. Trong Python 3.7, các biểu thức như vậy phát ra DeprecationWarning khi được biên dịch, trong Python 3.8 đây sẽ là SyntaxError. (Được đóng góp bởi Serhiy Storchaka trong bpo-10544.)
Việc trả về lớp con của complex từ object.__complex__() không được dùng nữa và sẽ là lỗi trong các phiên bản Python trong tương lai. Điều này làm cho __complex__() nhất quán với object.__int__() và object.__float__(). (Được đóng góp bởi Serhiy Storchaka trong bpo-28894.)
Các mô-đun, hàm và phương thức Python không được dùng nữa¶
aifc¶
aifc.openfp() không được dùng nữa và sẽ bị xóa trong Python 3.9. Thay vào đó hãy sử dụng aifc.open(). (Được đóng góp bởi Brian Curtin trong bpo-31985.)
asyncio¶
Hỗ trợ trực tiếp cho các phiên bản await-ing của asyncio.Lock và các nguyên tắc đồng bộ hóa asyncio khác đã không còn được dùng nữa. Trình quản lý bối cảnh không đồng bộ phải được sử dụng để thu thập và giải phóng tài nguyên đồng bộ hóa. (Được đóng góp bởi Andrew Svetlov trong bpo-32253.)
Các phương thức asyncio.Task.current_task() và asyncio.Task.all_tasks() không còn được dùng nữa. (Được đóng góp bởi Andrew Svetlov trong bpo-32250.)
bộ sưu tập¶
Trong Python 3.8, các lớp cơ sở trừu tượng trong collections.abc sẽ không còn hiển thị trong mô-đun collections thông thường nữa. Điều này sẽ giúp tạo ra sự phân biệt rõ ràng hơn giữa các lớp cụ thể và các lớp cơ sở trừu tượng. (Được đóng góp bởi Serhiy Storchaka trong bpo-25988.)
dbm¶
dbm.dumb hiện hỗ trợ đọc các tệp chỉ đọc và không còn ghi tệp chỉ mục khi nó không bị thay đổi. Cảnh báo không dùng nữa hiện được phát ra nếu tệp chỉ mục bị thiếu và được tạo lại ở chế độ 'r' và 'w' (đây sẽ là lỗi trong các bản phát hành Python trong tương lai). (Được đóng góp bởi Serhiy Storchaka trong bpo-28847.)
liệt kê¶
Trong Python 3.8, việc cố gắng kiểm tra các đối tượng không phải Enum trong các lớp Enum sẽ tạo ra TypeError (ví dụ: 1 in Color); tương tự, cố gắng kiểm tra các đối tượng không phải Flag trong thành viên Flag sẽ tăng TypeError (ví dụ: 1 in Perm.RW); hiện tại, cả hai thao tác đều trả về False. (Được đóng góp bởi Ethan Furman trong bpo-33217.)
nhận được văn bản¶
Việc sử dụng giá trị không nguyên để chọn dạng số nhiều trong gettext hiện không còn được dùng nữa. Nó không bao giờ hoạt động chính xác. (Được đóng góp bởi Serhiy Storchaka trong bpo-28692.)
nhập khẩu¶
Các phương thức MetaPathFinder.find_module() (được thay thế bằng MetaPathFinder.find_spec()) và PathEntryFinder.find_loader() (được thay thế bằng PathEntryFinder.find_spec()) đều không được dùng nữa trong Python 3.4 hiện phát ra DeprecationWarning. (Được đóng góp bởi Matthias Bussonnier trong bpo-29576.)
importlib.abc.ResourceLoader ABC không được dùng nữa để thay thế cho importlib.abc.ResourceReader.
ngôn ngữ¶
locale.format() không được dùng nữa, thay vào đó hãy sử dụng locale.format_string(). (Được đóng góp bởi Garvit trong bpo-10379.)
macpath¶
Zz000zz hiện không được dùng nữa và sẽ bị xóa trong Python 3.8. (Được đóng góp bởi Chí Hsuan Yen trong bpo-9850.)
luồng¶
dummy_threading và _dummy_thread không còn được dùng nữa. Không thể xây dựng Python khi tắt luồng được nữa. Thay vào đó hãy sử dụng threading. (Được đóng góp bởi Antoine Pitrou trong bpo-31370.)
ổ cắm¶
Việc cắt bớt giá trị đối số im lặng trong socket.htons() và socket.ntohs() đã không còn được dùng nữa. Trong các phiên bản Python sau này, nếu đối số được truyền lớn hơn 16 bit thì sẽ xuất hiện một ngoại lệ. (Được đóng góp bởi Oren Milman trong bpo-28332.)
ssl¶
ssl.wrap_socket() không được dùng nữa. Thay vào đó hãy sử dụng ssl.SSLContext.wrap_socket(). (Được đóng góp bởi Christian Heimes trong bpo-28124.)
tắm nắng¶
sunau.openfp() không được dùng nữa và sẽ bị xóa trong Python 3.9. Thay vào đó hãy sử dụng sunau.open(). (Được đóng góp bởi Brian Curtin trong bpo-31985.)
hệ thống¶
sys.set_coroutine_wrapper() và sys.get_coroutine_wrapper() không được dùng nữa.
Hàm sys.callstats() không có giấy tờ đã không được dùng nữa và sẽ bị xóa trong phiên bản Python trong tương lai. (Được đóng góp bởi Victor Stinner trong bpo-28799.)
làn sóng¶
wave.openfp() không được dùng nữa và sẽ bị xóa trong Python 3.9. Thay vào đó hãy sử dụng wave.open(). (Được đóng góp bởi Brian Curtin trong bpo-31985.)
Các chức năng và loại không dùng nữa của C API¶
Hàm PySlice_GetIndicesEx() không được dùng nữa và được thay thế bằng macro nếu Py_LIMITED_API không được đặt hoặc đặt thành giá trị trong khoảng từ 0x03050400 đến 0x03060000 (không bao gồm) hoặc 0x03060100 trở lên. (Được đóng góp bởi Serhiy Storchaka trong bpo-27867.)
PyOS_AfterFork() không còn được dùng nữa. Thay vào đó hãy sử dụng PyOS_BeforeFork(), PyOS_AfterFork_Parent() hoặc PyOS_AfterFork_Child(). (Được đóng góp bởi Antoine Pitrou trong bpo-16500.)
Xóa hỗ trợ nền tảng¶
FreeBSD 9 trở lên không còn được hỗ trợ chính thức.
Để được hỗ trợ Unicode đầy đủ, kể cả trong các mô-đun mở rộng, nền tảng *nix hiện phải cung cấp ít nhất một trong số
C.UTF-8(ngôn ngữ đầy đủ),C.utf8(ngôn ngữ đầy đủ) hoặcUTF-8(ngôn ngữ chỉ dành choLC_CTYPE) thay thế cho ngôn ngữCdựa trênASCIIcũ.OpenSSL 0.9.8 và 1.0.1 không còn được hỗ trợ, điều đó có nghĩa là việc xây dựng CPython 3.7 với hỗ trợ SSL/TLS trên các nền tảng cũ vẫn sử dụng các phiên bản này yêu cầu các tùy chọn xây dựng tùy chỉnh liên kết đến phiên bản OpenSSL mới hơn.
Đáng chú ý, sự cố này ảnh hưởng đến các bản phân phối Linux Debian 8 (còn gọi là "jessie") và Ubuntu 14.04 (còn gọi là "Trusty") LTS vì chúng vẫn sử dụng OpenSSL 1.0.1 theo mặc định.
Debian 9 ("stretch") và Ubuntu 16.04 ("xenial"), cũng như các bản phát hành gần đây của các bản phát hành Linux LTS khác (ví dụ: RHEL/CentOS 7.5, SLES 12-SP3), sử dụng OpenSSL 1.0.2 trở lên và vẫn được hỗ trợ trong cấu hình bản dựng mặc định.
CI configuration file của CPython cung cấp một ví dụ về cách sử dụng SSL compatibility testing infrastructure trong bộ thử nghiệm của CPython để xây dựng và liên kết với OpenSSL 1.1.0 thay vì hệ thống lỗi thời được cung cấp OpenSSL.
API và loại bỏ tính năng¶
Các tính năng và API sau đã bị xóa khỏi Python 3.7:
Chức năng
os.stat_float_times()đã bị loại bỏ. Nó được giới thiệu trong Python 2.3 để tương thích ngược với Python 2.2 và không được dùng nữa kể từ Python 3.1.Các lối thoát không xác định bao gồm
'\'và một chữ cái ASCII trong các mẫu thay thế chore.sub()đã không được dùng nữa trong Python 3.5 và giờ đây sẽ gây ra lỗi.Đã xóa hỗ trợ đối số exclude trong
tarfile.TarFile.add(). Nó không được dùng nữa trong Python 2.7 và 3.2. Thay vào đó hãy sử dụng đối số filter.Hàm
ntpath.splitunc()không được dùng nữa trong Python 3.1 và hiện đã bị xóa. Thay vào đó hãy sử dụngsplitdrive().collections.namedtuple()không còn hỗ trợ tham số verbose hoặc thuộc tính_sourcehiển thị mã nguồn được tạo cho lớp tuple được đặt tên. Đây là một phần của quá trình tối ưu hóa được thiết kế để tăng tốc độ tạo lớp. (Được đóng góp bởi Jelle Zijlstra với những cải tiến hơn nữa của INADA Naoki, Serhiy Storchaka và Raymond Hettinger trong bpo-28638.)Các hàm
bool(),float(),list()vàtuple()không còn nhận đối số từ khóa nữa. Đối số đầu tiên củaint()hiện chỉ có thể được chuyển dưới dạng đối số vị trí.Đã xóa trước đây không được dùng nữa trong các lớp Python 2.4
Plist,Dictvà_InternalDicttrong mô-đunplistlib. Các giá trị dict trong kết quả của hàmreadPlist()vàreadPlistFromBytes()hiện là các giá trị dict thông thường. Bạn không còn có thể sử dụng quyền truy cập thuộc tính để truy cập các mục của những từ điển này.Chức năng
asyncio.windows_utils.socketpair()đã bị loại bỏ. Thay vào đó, hãy sử dụng hàmsocket.socketpair(), hàm này có sẵn trên tất cả các nền tảng kể từ Python 3.5.asyncio.windows_utils.socketpairchỉ là bí danh củasocket.socketpairtrên Python 3.5 trở lên.asynciokhông còn xuất các mô-đunselectorsvà_overlappeddưới dạngasyncio.selectorsvàasyncio._overlappednữa. Thay thếfrom asyncio import selectorsbằngimport selectors.Việc khởi tạo trực tiếp các đối tượng
ssl.SSLSocketvàssl.SSLObjecthiện bị cấm. Các nhà xây dựng chưa bao giờ được ghi lại, thử nghiệm hoặc thiết kế như các nhà xây dựng công cộng. Người dùng được yêu cầu sử dụngssl.wrap_socket()hoặcssl.SSLContext. (Được đóng góp bởi Christian Heimes trong bpo-32951.)Lệnh
distutilsinstall_misckhông được sử dụng đã bị xóa. (Được đóng góp bởi Eric N. Vander Weele trong bpo-29218.)
Loại bỏ mô-đun¶
Mô-đun fpectl đã bị xóa. Nó không bao giờ được bật theo mặc định, không bao giờ hoạt động chính xác trên x86-64 và nó đã thay đổi ABI của Python theo những cách gây ra sự cố bất ngờ cho các phần mở rộng C. (Được đóng góp bởi Nathaniel J. Smith trong bpo-29137.)
Những thay đổi chỉ dành cho Windows¶
Trình khởi chạy python, (py.exe), có thể chấp nhận các thông số 32 & 64 bit without cũng phải chỉ định một phiên bản nhỏ. Vì vậy, py -3-32 và py -3-64 trở nên hợp lệ cũng như py -3.7-32, các dạng -m-64 và -m.n-64 hiện được chấp nhận để buộc trăn 64 bit ngay cả khi 32 bit lẽ ra đã được sử dụng. Nếu không có phiên bản được chỉ định, py.exe sẽ thoát lỗi. (Được đóng góp bởi Steve Barnes trong bpo-30291.)
Trình khởi chạy có thể chạy dưới dạng py -0 để tạo danh sách các python đã cài đặt, with default marked with an asterisk. Chạy py -0p sẽ bao gồm các đường dẫn. Nếu py được chạy với một công cụ xác định phiên bản không thể khớp, nó cũng sẽ in danh sách short form gồm các công cụ xác định có sẵn. (Được đóng góp bởi Steve Barnes trong bpo-30362.)
Chuyển sang Python 3.7¶
Phần này liệt kê các thay đổi được mô tả trước đây và các bản sửa lỗi khác có thể yêu cầu thay đổi mã của bạn.
Những thay đổi trong hành vi Python¶
Tên
asyncvàawaithiện là từ khóa dành riêng. Mã sử dụng những tên này làm mã định danh giờ đây sẽ tạo raSyntaxError. (Được đóng góp bởi Jelle Zijlstra trong bpo-30406.)PEP 479 được bật cho tất cả mã trong Python 3.7, nghĩa là các ngoại lệ
StopIterationđược đưa ra trực tiếp hoặc gián tiếp trong coroutine và trình tạo sẽ được chuyển thành ngoại lệRuntimeError. (Được đóng góp bởi Yury Selivanov trong bpo-32670.)Các phương thức
object.__aiter__()không còn có thể được khai báo là không đồng bộ nữa. (Được đóng góp bởi Yury Selivanov trong bpo-31709.)Do sơ suất, các phiên bản Python trước đó đã chấp nhận sai cú pháp sau:
f(1 cho x trong [1],) lớp C(1 cho x trong [1]): vượt qua
Python 3.7 hiện tăng
SyntaxErrormột cách chính xác, vì biểu thức trình tạo luôn cần phải nằm ngay bên trong một tập hợp dấu ngoặc đơn và không thể có dấu phẩy ở hai bên và chỉ có thể bỏ qua dấu ngoặc đơn trong các cuộc gọi. (Được đóng góp bởi Serhiy Storchaka trong bpo-32012 và bpo-32023.)Khi sử dụng khóa chuyển
-m, thư mục làm việc ban đầu hiện được thêm vàosys.path, thay vì một chuỗi trống (biểu thị động thư mục làm việc hiện tại tại thời điểm mỗi lần nhập). Bất kỳ chương trình nào đang kiểm tra chuỗi trống hoặc dựa vào hành vi trước đó sẽ cần phải được cập nhật tương ứng (ví dụ: bằng cách kiểm tra cảos.getcwd()hoặcos.path.dirname(__main__.__file__), tùy thuộc vào lý do mã lại kiểm tra chuỗi trống ngay từ đầu).
Những thay đổi trong Python API¶
socketserver.ThreadingMixIn.server_closehiện đợi cho đến khi tất cả các luồng không phải daemon hoàn tất. Đặt thuộc tính lớpsocketserver.ThreadingMixIn.block_on_closemới thànhFalseđể có hành vi trước 3.7. (Được đóng góp bởi Victor Stinner trong bpo-31233 và bpo-33540.)socketserver.ForkingMixIn.server_closebây giờ đợi cho đến khi tất cả các tiến trình con hoàn tất. Đặt thuộc tính lớpsocketserver.ForkingMixIn.block_on_closemới thànhFalseđể có hành vi trước 3.7. (Được đóng góp bởi Victor Stinner trong bpo-31151 và bpo-33540.)Hàm
locale.localeconv()hiện tạm thời đặt ngôn ngữLC_CTYPEthành giá trịLC_NUMERICtrong một số trường hợp. (Được đóng góp bởi Victor Stinner trong bpo-31900.)pkgutil.walk_packages()hiện tăngValueErrornếu path là một chuỗi. Trước đây một danh sách trống đã được trả về. (Được đóng góp bởi Sanyam Khurana trong bpo-24744.)Đối số chuỗi định dạng cho
string.Formatter.format()hiện là positional-only. Việc chuyển nó làm đối số từ khóa không được dùng nữa trong Python 3.5. (Được đóng góp bởi Serhiy Storchaka trong bpo-29193.)Các thuộc tính
key,valuevàcoded_valuecủa lớphttp.cookies.Morselhiện ở chế độ chỉ đọc. Việc gán chúng không được dùng nữa trong Python 3.5. Sử dụng phương phápset()để cài đặt chúng. (Được đóng góp bởi Serhiy Storchaka trong bpo-29192.)Đối số mode của
os.makedirs()không còn ảnh hưởng đến các bit cấp phép tệp của các thư mục cấp trung gian mới được tạo. Để đặt bit quyền cho tệp của chúng, bạn có thể đặt ô trước khi gọimakedirs(). (Được đóng góp bởi Serhiy Storchaka trong bpo-19930.)Loại
struct.Struct.formatbây giờ làstrthay vìbytes. (Được đóng góp bởi Victor Stinner trong bpo-21071.)cgi.parse_multipart()hiện chấp nhận các đối số encoding và errors và trả về kết quả tương tự nhưFieldStorage: đối với các trường không phải tệp, giá trị được liên kết với khóa là danh sách các chuỗi chứ không phải byte. (Được đóng góp bởi Pierre Quentel trong bpo-29979.)Do những thay đổi nội bộ trong
socket, việc gọisocket.fromshare()trên ổ cắm được tạo bởisocket.sharetrong các phiên bản Python cũ hơn không được hỗ trợ.reprchoBaseExceptionđã thay đổi để không bao gồm dấu phẩy ở cuối. Hầu hết các trường hợp ngoại lệ đều bị ảnh hưởng bởi sự thay đổi này. (Được đóng góp bởi Serhiy Storchaka trong bpo-30399.)reprchodatetime.timedeltađã thay đổi để bao gồm các đối số từ khóa trong đầu ra. (Được đóng góp bởi Utkarsh Upadhyay trong bpo-30302.)Vì
shutil.rmtree()hiện được triển khai bằng hàmos.scandir()nên trình xử lý onerror do người dùng chỉ định hiện được gọi với đối số đầu tiên làos.scandirthay vìos.listdirkhi danh sách thư mục không thành công.Hỗ trợ cho các tập hợp lồng nhau và các thao tác tập hợp trong các biểu thức thông thường như trong Unicode Technical Standard #18 có thể được thêm vào trong tương lai. Điều này sẽ thay đổi cú pháp. Để tạo điều kiện cho sự thay đổi trong tương lai này,
FutureWarningsẽ được nêu ra trong những trường hợp không rõ ràng vào thời điểm hiện tại. Điều đó bao gồm các bộ bắt đầu bằng'['theo nghĩa đen hoặc chứa các chuỗi ký tự theo nghĩa đen'--','&&','~~'và'||'. Để tránh cảnh báo, hãy thoát chúng bằng dấu gạch chéo ngược. (Được đóng góp bởi Serhiy Storchaka trong bpo-30349.)Kết quả của việc tách một chuỗi trên
regular expressioncó thể khớp với một chuỗi trống đã được thay đổi. Ví dụ: việc phân tách trênr'\s*'giờ đây sẽ không chỉ phân tách trên các khoảng trắng như đã làm trước đây mà còn phân tách trên các chuỗi trống trước tất cả các ký tự không phải khoảng trắng và ngay trước phần cuối của chuỗi. Hành vi trước đó có thể được khôi phục bằng cách thay đổi mẫu thànhr'\s+'. MộtFutureWarningđã được phát ra cho các mẫu như vậy kể từ Python 3.5.Đối với các mẫu khớp với cả chuỗi trống và chuỗi không trống, kết quả tìm kiếm tất cả kết quả khớp cũng có thể bị thay đổi trong các trường hợp khác. Ví dụ: trong chuỗi
'a\n\n', mẫur'(?m)^\s*?$'sẽ không chỉ khớp với các chuỗi trống ở vị trí 2 và 3 mà còn khớp với chuỗi'\n'ở vị trí 2--3. Để chỉ khớp các dòng trống, mẫu phải được viết lại thànhr'(?m)^[^\S\n]*$'.re.sub()hiện thay thế các kết quả trống liền kề với một kết quả không trống trước đó. Ví dụ:re.sub('x*', '-', 'abxd')bây giờ trả về'-a-b--d-'thay vì'-a-b-d-'(dấu trừ đầu tiên giữa 'b' và 'd' thay thế 'x' và dấu trừ thứ hai thay thế một chuỗi trống giữa 'x' và 'd').(Được đóng góp bởi Serhiy Storchaka trong bpo-25054 và bpo-32308.)
Thay đổi
re.escape()để chỉ thoát các ký tự đặc biệt của biểu thức chính quy thay vì thoát tất cả các ký tự không phải là chữ cái, số và'_'của ASCII. (Được đóng góp bởi Serhiy Storchaka trong bpo-29995.)Các khung
tracemalloc.Tracebackhiện được sắp xếp từ cũ nhất đến mới nhất để nhất quán hơn vớitraceback. (Được đóng góp bởi Jesse Bakker trong bpo-32121.)Trên các hệ điều hành hỗ trợ cờ bit
socket.SOCK_NONBLOCKhoặcsocket.SOCK_CLOEXEC,socket.typekhông còn áp dụng chúng nữa. Do đó, các bước kiểm tra nhưif sock.type == socket.SOCK_STREAMhoạt động như mong đợi trên tất cả các nền tảng. (Được đóng góp bởi Yury Selivanov trong bpo-32331.)Trên Windows, mặc định cho đối số close_fds của
subprocess.Popenđã được thay đổi từFalsethànhTruekhi chuyển hướng các thẻ điều khiển tiêu chuẩn. Nếu trước đây bạn phụ thuộc vào các thẻ điều khiển được kế thừa khi sử dụngsubprocess.Popenvới chuyển hướng io tiêu chuẩn, thì bạn sẽ phải chuyểnclose_fds=Falseđể duy trì hành vi trước đó hoặc sử dụngSTARTUPINFO.lpAttributeList.importlib.machinery.PathFinder.invalidate_caches()-- ngầm ảnh hưởng đếnimportlib.invalidate_caches()-- hiện xóa các mục trongsys.path_importer_cacheđược đặt thànhNone. (Được đóng góp bởi Brett Cannon trong bpo-33169.)Trong
asyncio,loop.sock_recv(),loop.sock_sendall(),loop.sock_accept(),loop.getaddrinfo(),loop.getnameinfo()đã được thay đổi thành các phương thức coroutine thích hợp để phù hợp với tài liệu của chúng. Trước đây, các phương thức này trả về các phiên bảnasyncio.Future. (Được đóng góp bởi Yury Selivanov trong bpo-32327.)asyncio.Server.socketshiện trả về bản sao của danh sách ổ cắm máy chủ nội bộ, thay vì trả lại trực tiếp. (Được đóng góp bởi Yury Selivanov trong bpo-32662.)Struct.formathiện là phiên bảnstrthay vì phiên bảnbytes. (Được đóng góp bởi Victor Stinner trong bpo-21071.)Giờ đây, bạn có thể bắt buộc phải thực hiện phân tích cú pháp con
argparsebằng cách chuyểnrequired=TruesangArgumentParser.add_subparsers(). (Được đóng góp bởi Anthony Sottile trong bpo-26510.)ast.literal_eval()bây giờ chặt chẽ hơn. Việc cộng và trừ các số tùy ý không còn được phép nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-31778.)Calendar.itermonthdatesgiờ đây sẽ liên tục đưa ra một ngoại lệ khi một ngày nằm ngoài phạm vi0001-01-01đến9999-12-31. Để hỗ trợ các ứng dụng không thể chấp nhận các ngoại lệ như vậy, có thể sử dụngCalendar.itermonthdays3vàCalendar.itermonthdays4mới. Các phương thức mới trả về các bộ dữ liệu và không bị giới hạn bởi phạm vi đượcdatetime.datehỗ trợ. (Được đóng góp bởi Alexander Belopolsky trong bpo-28292.)collections.ChainMaphiện giữ nguyên thứ tự của ánh xạ cơ bản. (Được đóng góp bởi Raymond Hettinger trong bpo-32792.)Phương thức
submit()củaconcurrent.futures.ThreadPoolExecutorvàconcurrent.futures.ProcessPoolExecutorhiện tăngRuntimeErrornếu được gọi trong khi tắt trình thông dịch. (Được đóng góp bởi Mark Nemec trong bpo-33097.)Hàm tạo
configparser.ConfigParserhiện sử dụngread_dict()để xử lý các giá trị mặc định, làm cho hành vi của nó nhất quán với phần còn lại của trình phân tích cú pháp. Các khóa và giá trị không phải chuỗi trong từ điển mặc định hiện đang được chuyển đổi hoàn toàn thành chuỗi. (Được đóng góp bởi James Tocknell trong bpo-23835.)Một số hàng nhập khẩu nội bộ không có giấy tờ đã bị loại bỏ. Một ví dụ là
os.errnokhông còn nữa; thay vào đó hãy sử dụngimport errnotrực tiếp. Lưu ý rằng các hoạt động nhập nội bộ không có giấy tờ như vậy có thể bị xóa bất kỳ lúc nào mà không cần thông báo, ngay cả trong các bản phát hành phiên bản vi mô.
Những thay đổi trong C API¶
Hàm PySlice_GetIndicesEx() được coi là không an toàn đối với các chuỗi có thể thay đổi kích thước. Nếu các chỉ mục lát cắt không phải là phiên bản của int mà là các đối tượng triển khai phương thức __index__(), thì chuỗi có thể được thay đổi kích thước sau khi chuyển độ dài của nó sang PySlice_GetIndicesEx(). Điều này có thể dẫn đến việc trả về các chỉ số nằm ngoài độ dài của chuỗi. Để tránh các sự cố có thể xảy ra, hãy sử dụng các hàm mới PySlice_Unpack() và PySlice_AdjustIndices(). (Được đóng góp bởi Serhiy Storchaka trong bpo-27867.)
Thay đổi mã byte CPython¶
Có hai opcode mới: LOAD_METHOD và CALL_METHOD. (Được đóng góp bởi Yury Selivanov và INADA Naoki trong bpo-26110.)
Mã hoạt động STORE_ANNOTATION đã bị xóa. (Được đóng góp bởi Mark Shannon trong bpo-32550.)
Những thay đổi chỉ dành cho Windows¶
Tệp được sử dụng để ghi đè sys.path hiện được gọi là <python-executable>._pth thay vì 'sys.path'. Xem Tìm mô-đun để biết thêm thông tin. (Được đóng góp bởi Steve Dower trong bpo-28137.)
Các thay đổi triển khai CPython khác¶
Để chuẩn bị cho những thay đổi tiềm ẩn trong tương lai đối với quá trình khởi tạo thời gian chạy CPython công khai API (xem PEP 432 để biết bản dự thảo ban đầu nhưng hơi lỗi thời), logic quản lý cấu hình và khởi động nội bộ của CPython đã được tái cấu trúc đáng kể. Mặc dù các bản cập nhật này nhằm mục đích hoàn toàn minh bạch đối với cả ứng dụng nhúng và người dùng CPython CLI thông thường, nhưng chúng được đề cập ở đây vì quá trình tái cấu trúc thay đổi thứ tự nội bộ của các hoạt động khác nhau trong quá trình khởi động trình thông dịch và do đó có thể phát hiện ra các lỗi tiềm ẩn trước đó, trong các ứng dụng nhúng hoặc trong chính CPython. (Ban đầu được đóng góp bởi Nick Coghlan và Eric Snow như một phần của bpo-22257, sau đó được Nick, Eric và Victor Stinner cập nhật thêm trong một số số khác). Một số chi tiết đã biết bị ảnh hưởng:
PySys_AddWarnOptionUnicode()hiện không thể sử dụng được bằng cách nhúng các ứng dụng do yêu cầu tạo đối tượng Unicode trước khi gọiPy_Initialize. Thay vào đó hãy sử dụngPySys_AddWarnOption().các bộ lọc cảnh báo được thêm bởi ứng dụng nhúng với
PySys_AddWarnOption()giờ đây sẽ được ưu tiên nhất quán hơn các bộ lọc mặc định do trình thông dịch đặt
Do những thay đổi trong cách định cấu hình bộ lọc cảnh báo mặc định, việc đặt Py_BytesWarningFlag thành giá trị lớn hơn một không còn đủ để vừa phát ra thông báo BytesWarning vừa chuyển đổi chúng thành ngoại lệ. Thay vào đó, cờ phải được đặt (để khiến cảnh báo được phát ra ngay từ đầu) và thêm bộ lọc cảnh báo error::BytesWarning rõ ràng để chuyển chúng thành ngoại lệ.
Do có sự thay đổi trong cách trình biên dịch xử lý chuỗi tài liệu, return None ẩn trong nội dung hàm chỉ bao gồm một chuỗi tài liệu hiện được đánh dấu là xuất hiện trên cùng một dòng với chuỗi tài liệu, không phải trên dòng tiêu đề của hàm.
Trạng thái ngoại lệ hiện tại đã được chuyển từ đối tượng khung sang đồng quy trình. Điều này đã đơn giản hóa trình thông dịch và sửa một số lỗi khó hiểu do có trạng thái ngoại lệ hoán đổi khi vào hoặc thoát trình tạo. (Được đóng góp bởi Mark Shannon trong bpo-25612.)
Những thay đổi đáng chú ý trong Python 3.7.1¶
Bắt đầu từ 3.7.1, Py_Initialize() giờ đây luôn đọc và tôn trọng tất cả các cài đặt môi trường giống như Py_Main() (trong các phiên bản Python trước đó, nó tôn trọng một tập hợp con không xác định của các biến môi trường đó, trong khi ở Python 3.7.0, nó không đọc bất kỳ cài đặt nào trong số đó do bpo-34247). Nếu hành vi này là không mong muốn, hãy đặt Py_IgnoreEnvironmentFlag thành 1 trước khi gọi Py_Initialize().
Trong 3.7.1, C API cho Biến ngữ cảnh was updated sử dụng con trỏ PyObject. Xem thêm bpo-34762.
Trong 3.7.1, mô-đun tokenize hiện ngầm phát ra mã thông báo NEWLINE khi được cung cấp đầu vào không có dòng mới ở cuối. Hành vi này hiện khớp với những gì mã thông báo C thực hiện trong nội bộ. (Được đóng góp bởi Ammar Askar trong bpo-33899.)
Những thay đổi đáng chú ý trong Python 3.7.2¶
Trong 3.7.2, venv trên Windows không còn sao chép các tệp nhị phân gốc nữa mà thay vào đó tạo các tập lệnh chuyển hướng có tên python.exe và pythonw.exe. Điều này giải quyết một vấn đề tồn tại lâu dài trong đó tất cả các môi trường ảo sẽ phải được nâng cấp hoặc tạo lại với mỗi bản cập nhật Python. Tuy nhiên, hãy lưu ý rằng bản phát hành này vẫn sẽ yêu cầu tạo lại môi trường ảo để có được các tập lệnh mới.
Những thay đổi đáng chú ý trong Python 3.7.6¶
Do những lo ngại đáng kể về bảo mật, tham số reuse_address của asyncio.loop.create_datagram_endpoint() không còn được hỗ trợ. Điều này là do hoạt động của tùy chọn ổ cắm SO_REUSEADDR trong UDP. Để biết thêm chi tiết, hãy xem tài liệu về loop.create_datagram_endpoint(). (Được đóng góp bởi Kyle Stanley, Antoine Pitrou và Yury Selivanov trong bpo-37228.)
Những thay đổi đáng chú ý trong Python 3.7.10¶
Các phiên bản Python trước đó cho phép sử dụng cả ; và & làm dấu tách tham số truy vấn trong urllib.parse.parse_qs() và urllib.parse.parse_qsl(). Do lo ngại về bảo mật và để phù hợp với các đề xuất W3C mới hơn, điều này đã được thay đổi để chỉ cho phép một khóa phân tách duy nhất, với & làm mặc định. Thay đổi này cũng ảnh hưởng đến cgi.parse() và cgi.parse_multipart() khi chúng sử dụng các chức năng bị ảnh hưởng trong nội bộ. Để biết thêm chi tiết, vui lòng xem tài liệu tương ứng của họ. (Được đóng góp bởi Adam Goldschmidt, Senthil Kumaran và Ken Jin trong bpo-42967.)
Những thay đổi đáng chú ý trong Python 3.7.11¶
Bản sửa lỗi bảo mật sẽ thay đổi hành vi của ftplib.FTP để không tin cậy địa chỉ IPv4 được gửi từ máy chủ từ xa khi thiết lập kênh dữ liệu thụ động. Thay vào đó, chúng tôi sử dụng lại địa chỉ IP của máy chủ ftp. Đối với mã bất thường yêu cầu hành vi cũ, hãy đặt thuộc tính trust_server_pasv_ipv4_address trên phiên bản FTP của bạn thành True. (Xem gh-87451)
Sự hiện diện của các ký tự tab hoặc dòng mới trong các phần của URL cho phép thực hiện một số hình thức tấn công. Theo thông số kỹ thuật WHATWG cập nhật RFC 3986, các ký tự dòng mới \n, \r và tab \t bị loại bỏ khỏi URL bởi trình phân tích cú pháp urllib.parse() để ngăn chặn các cuộc tấn công như vậy. Các ký tự loại bỏ được điều khiển bởi biến cấp độ mô-đun mới urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (Xem gh-88048)
Tính năng bảo mật đáng chú ý trong 3.7.14¶
Chuyển đổi giữa int và str ở các cơ số không phải 2 (nhị phân), 4, 8 (bát phân), 16 (thập lục phân) hoặc 32, chẳng hạn như cơ sở 10 (thập phân) hiện sẽ tăng ValueError nếu số chữ số ở dạng chuỗi vượt quá giới hạn để tránh các cuộc tấn công từ chối dịch vụ tiềm ẩn do độ phức tạp của thuật toán. Đây là biện pháp giảm nhẹ cho CVE 2020-10735. Giới hạn này có thể được định cấu hình hoặc vô hiệu hóa bằng biến môi trường, cờ dòng lệnh hoặc API sys. Xem tài liệu integer string conversion length limitation. Giới hạn mặc định là 4300 chữ số ở dạng chuỗi.