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:

  • asyncawait hiện là từ khóa dành riêng.

Các mô-đun thư viện mới:

Các tính năng tích hợp 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:

Cải tiến triển khai CPython:

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 stdinstdout 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.utf8UTF-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.stdinsys.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____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ành DeprecationWarning hoặc FutureWarning.

Trước đây cả DeprecationWarningPendingDeprecationWarning 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__()__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:

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 await và cách hiểu có chứa mệnh đề async for là 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-12844bpo-18896.)

  • bytes.fromhex()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, bytesbytearray đã nhận được hỗ trợ cho phương thức isascii() 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.)

  • ImportError hiện hiển thị tên mô-đun và đường dẫn __file__ của mô-đun khi from ... 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ới str(x) chứ không phải format(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.TracebackType hiện có thể được khởi tạo từ mã Python và thuộc tính tb_next trê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 -X importtime mới hoặc biến môi trường PYTHONPROFILEIMPORTTIME có 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 asynciodecimal đã đượ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__()__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()Future.add_done_callback() có tham số context tùy chọn mới chỉ dành cho từ khóa. Tasks hiệ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 cho asyncio.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ản Task hiện đang chạy và hàm asyncio.all_tasks() mới trả về một tập hợp tất cả các phiên bản Task hiện có trong một vòng lặp nhất định. Các phương thức Task.current_task()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 BufferedProtocol mớ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ăng RuntimeError nếu không có vòng lặp nào đang chạy. Điều này trái ngược với asyncio.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áp StreamWriter.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ằng os.sendfile khi có thể. (Được đóng góp bởi Andrew Svetlov trong bpo-32410.)

  • Các phương thức Future.get_loop()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ượng asyncio.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.Server bắ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 cho loop.create_server()loop.create_unix_server(), cũng như Server.start_serving()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ức Server.is_serving() mới trả về True nếu máy chủ đang phục vụ. Các đối tượng Server hiệ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:
         # 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ức when() 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ề True nế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ới ReadTransport.resume_reading()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 WindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicy mớ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

ProcessPoolExecutorThreadPoolExecutor hiện hỗ trợ các đối số hàm tạo initializerinitargs 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(), AbstractAsyncContextManagerAsyncExitStack 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-29679bpo-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

HTTPConnectionHTTPSConnection 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-33768bpo-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-5680bpo-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()supernet_of() mới của ipaddress.IPv6Networkipaddress.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ố pathbytes. (Đượ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()os.pread()) và chức năng os.pwritev() (kết hợp chức năng của os.writev()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.LOCALEre.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()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.ForkingMixInsocketserver.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-30622bpo-33618)

SSLSocketSSLObject 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()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_versionSSLContext.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ố stdoutstderr. (Đượ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ệt time.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()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, MethodDescriptorTypeClassMethodDescriptorType 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 -b và tùy chọn -X dev dà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ính sys.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 BytesWarning cho -b (hoặc -bb)

    • bất kỳ bộ lọc nào được chỉ định bằng tùy chọn -W

    • bất kỳ bộ lọc nào được chỉ định bằng biến môi trường PYTHONWARNINGS

    • bất kỳ bộ lọc cụ thể CPython nào khác (ví dụ: bộ lọc default được thêm cho chế độ -X dev mớ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-32043bpo-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.minidomxml.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()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__startimport__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 namedoc của cấu trúc PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Descwrapperbase 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()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()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()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()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-22898bpo-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()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()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()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ố startend 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-29452bpo-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()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()getattr() hiện nhanh hơn khoảng 4 lần khi không tìm thấy nameobj 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()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.PollSelectorselectors.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-29469bpo-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()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.datedatetime.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()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 line và chọn tham gia nhận các sự kiện opcode từ trình thông dịch bằng cách đặt các thuộc tính f_trace_linesf_trace_opcodes mớ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ành None (trước đây chưa được đặt) và __spec__.origin của chúng cũng được đặt thành None (trước đây là chuỗi "namespace"). Xem bpo-32305. Ngoài ra, __spec__.loader củ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ành None). 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 distutils upload khô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 đề yieldyield 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__()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()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''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_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()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()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ặc UTF-8 (ngôn ngữ chỉ dành cho LC_CTYPE) thay thế cho ngôn ngữ C dựa trên ASCII cũ.

  • 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ế cho re.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ụng splitdrive().

  • collections.namedtuple() không còn hỗ trợ tham số verbose hoặc thuộc tính _source hiể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()tuple() không còn nhận đối số từ khóa nữa. Đối số đầu tiên của int() 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, Dict_InternalDict trong mô-đun plistlib. Các giá trị dict trong kết quả của hàm readPlist()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àm socket.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.socketpair chỉ là bí danh của socket.socketpair trên Python 3.5 trở lên.

  • asyncio không còn xuất các mô-đun selectors_overlapped dưới dạng asyncio.selectorsasyncio._overlapped nữa. Thay thế from asyncio import selectors bằng import selectors.

  • Việc khởi tạo trực tiếp các đối tượng ssl.SSLSocketssl.SSLObject hiệ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ụng ssl.wrap_socket() hoặc ssl.SSLContext. (Được đóng góp bởi Christian Heimes trong bpo-32951.)

  • Lệnh distutils install_misc khô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-32py -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 asyncawait hiệ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 ra SyntaxError. (Đượ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 SyntaxError mộ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-32012bpo-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ào sys.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ặc os.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_close hiệ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ớp socketserver.ThreadingMixIn.block_on_close mới thành False để có hành vi trước 3.7. (Được đóng góp bởi Victor Stinner trong bpo-31233bpo-33540.)

  • 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. Đặt thuộc tính lớp socketserver.ForkingMixIn.block_on_close mới thành False để có hành vi trước 3.7. (Được đóng góp bởi Victor Stinner trong bpo-31151bpo-33540.)

  • Hàm locale.localeconv() hiện tạm thời đặt ngôn ngữ LC_CTYPE thành giá trị LC_NUMERIC trong một số trường hợp. (Được đóng góp bởi Victor Stinner trong bpo-31900.)

  • pkgutil.walk_packages() hiện tăng ValueError nế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, valuecoded_value của lớp http.cookies.Morsel hiệ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áp set() để 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ọi makedirs(). (Được đóng góp bởi Serhiy Storchaka trong bpo-19930.)

  • Loại struct.Struct.format bây giờ là str thay 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ố encodingerrors 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ọi socket.fromshare() trên ổ cắm được tạo bởi socket.share trong các phiên bản Python cũ hơn không được hỗ trợ.

  • repr cho BaseException đã 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.)

  • repr cho datetime.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.)

  • shutil.rmtree() hiện được triển khai bằng hàm os.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.scandir thay vì os.listdir khi 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, FutureWarning sẽ đượ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 '--', '&&', '~~''||'. Để 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 expression có thể khớp với một chuỗi trống đã được thay đổi. Ví dụ: việc phân tách trên r'\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ành r'\s+'. Một FutureWarning đã đượ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ẫu r'(?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ành r'(?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-25054bpo-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.Traceback hiện được sắp xếp từ cũ nhất đến mới nhất để nhất quán hơn với traceback. (Đượ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_NONBLOCK hoặc socket.SOCK_CLOEXEC, socket.type không còn áp dụng chúng nữa. Do đó, các bước kiểm tra như if sock.type == socket.SOCK_STREAM hoạ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ừ False thành True khi 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ụng subprocess.Popen với chuyển hướng io tiêu chuẩn, thì bạn sẽ phải chuyển close_fds=False để duy trì hành vi trước đó hoặc sử dụng STARTUPINFO.lpAttributeList.

  • importlib.machinery.PathFinder.invalidate_caches() -- ngầm ảnh hưởng đến importlib.invalidate_caches() -- hiện xóa các mục trong sys.path_importer_cache được đặt thành None. (Đượ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ản asyncio.Future. (Được đóng góp bởi Yury Selivanov trong bpo-32327.)

  • asyncio.Server.sockets hiệ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.format hiện là phiên bản str thay vì phiên bản bytes. (Đượ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 argparse bằng cách chuyển required=True sang ArgumentParser.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.itermonthdates giờ đây sẽ liên tục đưa ra một ngoại lệ khi một ngày nằm ngoài phạm vi 0001-01-01 đến 9999-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ụng Calendar.itermonthdays3Calendar.itermonthdays4 mớ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 được datetime.date hỗ trợ. (Được đóng góp bởi Alexander Belopolsky trong bpo-28292.)

  • collections.ChainMap hiệ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ủa concurrent.futures.ThreadPoolExecutorconcurrent.futures.ProcessPoolExecutor hiện tăng RuntimeError nế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.ConfigParser hiện sử dụng read_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.errno không còn nữa; thay vào đó hãy sử dụng import errno trự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()PySlice_AdjustIndices(). (Được đóng góp bởi Serhiy Storchaka trong bpo-27867.)

Thay đổi mã byte CPython

Có hai opcode mới: LOAD_METHODCALL_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ọi Py_Initialize. Thay vào đó hãy sử dụng PySys_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.exepythonw.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ả ;& làm dấu tách tham số truy vấn trong urllib.parse.parse_qs()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()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 intstr ở 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.