Có gì mới trong Python 3.4

tác giả:

R. David Murray <rdmurray@bitdance.com> (Biên tập viên)

Bài viết này giải thích các tính năng mới trong Python 3.4, so với 3.3. Python 3.4 được phát hành vào ngày 16 tháng 3 năm 2014. Để biết chi tiết đầy đủ, hãy xem changelog.

Xem thêm

PEP 429 -- Lịch phát hành Python 3.4

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:

  • Không có tính năng cú pháp mới nào được thêm vào trong Python 3.4.

Các tính năng mới khác:

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

Các mô-đun thư viện được cải thiện đáng kể:

Cải tiến bảo mật:

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

Vui lòng đọc tiếp để biết danh sách đầy đủ các thay đổi đối với người dùng, bao gồm nhiều cải tiến nhỏ khác, tối ưu hóa CPython, ngừng sử dụng và các sự cố chuyển tiềm ẩn.

Tính năng mới

PEP 453: Khởi động rõ ràng PIP trong cài đặt Python

Khởi động pip theo mặc định

Mô-đun ensurepip mới (được xác định trong PEP 453) cung cấp cơ chế đa nền tảng tiêu chuẩn để khởi động trình cài đặt pip vào bản cài đặt Python và môi trường ảo. Phiên bản pip đi kèm với Python 3.4.0 là pip 1.5.4 và các bản phát hành bảo trì 3.4.x trong tương lai sẽ cập nhật phiên bản đi kèm lên phiên bản mới nhất của pip hiện có tại thời điểm tạo ứng cử viên phát hành.

Theo mặc định, các lệnh pipXpipX.Y sẽ được cài đặt trên tất cả các nền tảng (trong đó X.Y là viết tắt của phiên bản cài đặt Python), cùng với gói Python pip và các phần phụ thuộc của nó. Trên Windows và trong môi trường ảo trên tất cả các nền tảng, lệnh pip không phiên bản cũng sẽ được cài đặt. Trên các nền tảng khác, lệnh pip không phiên bản trên toàn hệ thống thường đề cập đến phiên bản Python 2 được cài đặt riêng.

Tiện ích dòng lệnh pyvenv và mô-đun venv sử dụng mô-đun ensurepip để làm cho pip có sẵn trong môi trường ảo. Khi sử dụng tiện ích dòng lệnh, pip được cài đặt theo mặc định, trong khi khi sử dụng mô-đun venv, việc cài đặt API của pip phải được yêu cầu rõ ràng.

Đối với CPython source builds on POSIX systems, lệnh make installmake altinstall bootstrap pip theo mặc định. Hành vi này có thể được kiểm soát thông qua các tùy chọn cấu hình và được ghi đè thông qua các tùy chọn Makefile.

Trên Windows và Mac OS X, trình cài đặt CPython hiện mặc định cài đặt pip cùng với chính CPython (người dùng có thể chọn không cài đặt nó trong quá trình cài đặt). Người dùng Windows sẽ cần chọn tham gia sửa đổi PATH tự động để có sẵn pip từ dòng lệnh theo mặc định, nếu không, nó vẫn có thể được truy cập thông qua trình khởi chạy Python dành cho Windows dưới dạng py -m pip.

Vì các nhà đóng gói nền tảng discussed in the PEP có thể chọn không cài đặt các lệnh này theo mặc định, miễn là khi được gọi, chúng cung cấp hướng dẫn rõ ràng và đơn giản về cách cài đặt chúng trên nền tảng đó (thường sử dụng trình quản lý gói hệ thống).

Ghi chú

Để tránh xung đột giữa các bản cài đặt Python 2 và Python 3 song song, chỉ các lệnh pip3pip3.4 đã được phiên bản mới được khởi động theo mặc định khi ensurepip được gọi trực tiếp - tùy chọn --default-pip cũng cần thiết để yêu cầu lệnh pip không phiên bản. pyvenv và trình cài đặt Windows đảm bảo rằng lệnh pip không đủ tiêu chuẩn được cung cấp trong các môi trường đó và pip luôn có thể được gọi thông qua bộ chuyển đổi -m thay vì trực tiếp để tránh sự mơ hồ trên các hệ thống có nhiều cài đặt Python.

Thay đổi tài liệu

Là một phần của thay đổi này, các phần Cài đặt mô-đun PythonPhân phối các mô-đun Python của tài liệu đã được thiết kế lại hoàn toàn dưới dạng tài liệu bắt đầu ngắn và tài liệu FAQ. Hầu hết các tài liệu đóng gói hiện đã được chuyển đến Cơ quan quản lý đóng gói Python được duy trì Python Packaging User Guide và tài liệu của từng dự án.

Tuy nhiên, vì quá trình di chuyển này hiện vẫn chưa hoàn tất nên các phiên bản cũ của những hướng dẫn đó vẫn có sẵn dưới dạng Xây dựng tiện ích mở rộng C và C++ bằng setuptoolsXây dựng tiện ích mở rộng C và C++ bằng setuptools.

Xem thêm

PEP 453 -- Khởi động rõ ràng pip trong cài đặt Python

PEP được viết bởi Donald Stufft và Nick Coghlan, được thực hiện bởi Donald Stufft, Nick Coghlan, Martin von Löwis và Ned Deily.

PEP 446: Bộ mô tả tệp mới được tạo là không thể kế thừa

PEP 446 tạo bộ mô tả tệp mới được tạo non-inheritable. Nói chung, đây là hành vi mà một ứng dụng sẽ mong muốn: khi khởi chạy một quy trình mới, việc mở các tệp hiện đang mở trong quy trình mới có thể dẫn đến đủ loại lỗi khó tìm và có thể dẫn đến các vấn đề bảo mật.

Tuy nhiên, có những trường hợp mong muốn được thừa kế. Để hỗ trợ những trường hợp này, có sẵn các hàm và phương thức mới sau:

Xem thêm

PEP 446 -- Làm cho các bộ mô tả tệp mới được tạo không thể kế thừa

PEP được viết và triển khai bởi Victor Stinner.

Những cải tiến trong xử lý Codec

Kể từ lần đầu tiên được giới thiệu, mô-đun codecs luôn được thiết kế để hoạt động như một hệ thống mã hóa và giải mã động loại trung tính. Tuy nhiên, sự kết hợp chặt chẽ của nó với mô hình văn bản Python, đặc biệt là các phương thức tiện lợi hạn chế kiểu trên các kiểu str, bytesbytearray dựng sẵn, về mặt lịch sử đã che khuất thực tế đó.

Là một bước quan trọng trong việc làm rõ tình hình, các hàm tiện lợi codecs.encode()codecs.decode() hiện đã được ghi lại chính xác trong Python 2.7, 3.3 và 3.4. Các hàm này đã tồn tại trong mô-đun codecs (và đã được bao gồm trong bộ kiểm tra hồi quy) kể từ Python 2.4, nhưng trước đây chỉ có thể được phát hiện thông qua quá trình xem xét nội bộ thời gian chạy.

Không giống như các phương thức tiện lợi trên str, bytesbytearray, các hàm tiện lợi codecs hỗ trợ codec tùy ý trong cả Python 2 và Python 3, thay vì bị giới hạn ở mã hóa văn bản Unicode (trong Python 3) hoặc chuyển đổi basestring <-> basestring (trong Python 2).

Trong Python 3.4, trình thông dịch có thể xác định các mã hóa phi văn bản đã biết được cung cấp trong thư viện chuẩn và hướng người dùng tới các chức năng tiện lợi cho mục đích chung này khi thích hợp:

>>> b"abcdef".decode("hex")
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
LookupError: 'hex' không phải là mã hóa văn bản; sử dụng codecs.decode() để xử lý các codec tùy ý

>>> "xin chào".encode("rot13")
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
LookupError: 'rot13' không phải là mã hóa văn bản; sử dụng codecs.encode() để xử lý các codec tùy ý

>>> open("foo.txt",  hóa="hex")
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
LookupError: 'hex' không phải là mã hóa văn bản; sử dụng codecs.open() để xử lý các codec tùy ý

Trong một thay đổi có liên quan, bất cứ khi nào có thể thực hiện được mà không phá vỡ khả năng tương thích ngược, các ngoại lệ được tạo ra trong quá trình mã hóa và giải mã sẽ được bao bọc trong một chuỗi ngoại lệ cùng loại có đề cập đến tên của codec chịu trách nhiệm tạo ra lỗi:

>>> nhập codec

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (cuộc gọi gần đây nhất):
  Tệp "/usr/lib/python3.4/encodings/hex_codec.py", dòng 20, ở dạng hex_decode
    trả về (binascii.a2b_hex(đầu vào), len(đầu vào))
binascii.Error: Tìm thấy chữ số không phải thập lục phân

Ngoại lệ trên là nguyên nhân trực tiếp của ngoại lệ sau:

Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
binascii.Error: giải mã bằng codec 'hex' không thành công (Lỗi: Tìm thấy chữ số không phải thập lục phân)

>>> codecs.encode("xin chào", "bz2")
Traceback (cuộc gọi gần đây nhất):
  Tệp "/usr/lib/python3.4/encodings/bz2_codec.py", dòng 17, trong bz2_encode
    trả về (bz2.compress(đầu vào), len(đầu vào))
  Tệp "/usr/lib/python3.4/bz2.py", dòng 498, ở dạng nén
    trả về comp.compress(data) + comp.flush()
TypeError: 'str' không hỗ trợ giao diện bộ đệm

Ngoại lệ trên là nguyên nhân trực tiếp của ngoại lệ sau:

Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
TypeError: mã hóa bằng codec 'bz2' không thành công (TypeError: 'str' không hỗ trợ giao diện bộ đệm)

Cuối cùng, như các ví dụ trên cho thấy, những cải tiến này đã cho phép khôi phục các bí danh tiện lợi cho các codec không phải Unicode mà bản thân chúng đã được khôi phục trong Python 3.2. Điều này có nghĩa là việc mã hóa dữ liệu nhị phân đến và đi từ biểu diễn thập lục phân của nó (ví dụ) hiện có thể được viết là:

>>> từ codec nhập  hóa, giải 
>>>  hóa(b"xin chào", "hex")
b'68656c6c6f'
>>> giải (b"68656c6c6f", "hex")
b'xin chào'

Các phép biến đổi nhị phân và văn bản được cung cấp trong thư viện chuẩn được trình bày chi tiết bằng Biến đổi nhị phânChuyển đổi văn bản.

(Được đóng góp bởi Nick Coghlan trong bpo-7475, bpo-17827, bpo-17828bpo-19619.)

PEP 451: Loại ModuleSpec cho Hệ thống Nhập

PEP 451 cung cấp sự đóng gói thông tin về một mô-đun mà máy nhập sẽ sử dụng để tải nó (nghĩa là thông số kỹ thuật của mô-đun). Điều này giúp đơn giản hóa cả việc triển khai nhập và một số API liên quan đến nhập. Sự thay đổi cũng là bước đệm cho several future import-related improvements.

Những thay đổi đối với công chúng từ PEP hoàn toàn tương thích ngược. Hơn nữa, chúng phải minh bạch với tất cả mọi người trừ các tác giả nhập khẩu. Các phương thức trình tìm và tải khóa không còn được dùng nữa nhưng chúng sẽ tiếp tục hoạt động. Các nhà nhập khẩu mới nên sử dụng các phương pháp mới được mô tả trong PEP. Các nhà nhập khẩu hiện tại cần được cập nhật để thực hiện các phương pháp mới. Xem phần Không được dùng nữa để biết danh sách các phương pháp nên được thay thế và các phương pháp thay thế chúng.

Những thay đổi ngôn ngữ khác

Một số thay đổi nhỏ hơn được thực hiện đối với ngôn ngữ Python cốt lõi là:

  • Cơ sở dữ liệu Unicode được cập nhật lên phiên bản UCD 6.3.

  • min()max() hiện chấp nhận đối số chỉ từ khóa default có thể được sử dụng để chỉ định giá trị mà chúng trả về nếu iterable mà chúng đang đánh giá không có phần tử. (Được đóng góp bởi Julian Berman trong bpo-18111.)

  • Đối tượng mô-đun bây giờ là weakly referenceable.

  • Các thuộc tính __file__ của mô-đun (và các giá trị liên quan) giờ đây phải luôn chứa các đường dẫn tuyệt đối theo mặc định, ngoại trừ __main__.__file__ khi tập lệnh được thực thi trực tiếp bằng đường dẫn tương đối. (Được đóng góp bởi Brett Cannon trong bpo-18416.)

  • Tất cả các codec UTF-* (ngoại trừ UTF-7) hiện từ chối các chất thay thế trong cả quá trình mã hóa và giải mã trừ khi trình xử lý lỗi surrogatepass được sử dụng, ngoại trừ bộ giải mã UTF-16 (chấp nhận các cặp thay thế hợp lệ) và bộ mã hóa UTF-16 (tạo ra chúng trong khi mã hóa các ký tự không phải BMP). (Được đóng góp bởi Victor Stinner, Kang-Hao (Kenny) Lu và Serhiy Storchaka trong bpo-12892.)

  • Zz003zz codec cp273 mới của Đức. (Được đóng góp bởi Michael Bierenfeld và Andrew Kuchling trong bpo-1097797.)

  • Zz000zz cp1125 tiếng Ukraina mới. (Được đóng góp bởi Serhiy Storchaka trong bpo-19668.)

  • bytes.join() và bytearray.join() hiện chấp nhận các đối tượng đệm tùy ý làm đối số. (Được đóng góp bởi Antoine Pitrou trong bpo-15958.)

  • Hàm tạo int hiện chấp nhận bất kỳ đối tượng nào có phương thức __index__ cho đối số base của nó. (Được đóng góp bởi Mark Dickinson trong bpo-16772.)

  • Các đối tượng khung hiện có phương thức clear() để xóa tất cả các tham chiếu đến các biến cục bộ khỏi khung. (Được đóng góp bởi Antoine Pitrou trong bpo-17934.)

  • memoryview hiện đã được đăng ký là Sequence và hỗ trợ nội dung reversed(). (Được đóng góp bởi Nick Coghlan và Claudiu Popa trong bpo-18690bpo-19078.)

  • Chữ ký do help() báo cáo đã được sửa đổi và cải thiện trong một số trường hợp do sự ra đời của Phòng khám đối số và các thay đổi khác đối với mô-đun inspectpydoc.

  • __length_hint__() hiện là một phần của đặc tả ngôn ngữ chính thức (xem PEP 424). (Được đóng góp bởi Armin Ronacher trong bpo-16148.)

Mô-đun mới

asyncio

Mô-đun asyncio mới (được định nghĩa trong PEP 3156) cung cấp mô hình vòng lặp sự kiện có thể cắm tiêu chuẩn cho Python, cung cấp hỗ trợ IO không đồng bộ vững chắc trong thư viện tiêu chuẩn và giúp việc triển khai vòng lặp sự kiện khác tương tác với thư viện tiêu chuẩn và với nhau dễ dàng hơn.

Đối với Python 3.4, mô-đun này được coi là provisional API.

Xem thêm

PEP 3156 -- Hỗ trợ IO không đồng bộ được khởi động lại: Mô-đun "asyncio"

PEP được viết và triển khai bởi Guido van Rossum.

đảm bảopip

Mô-đun ensurepip mới là cơ sở hạ tầng chính để triển khai PEP 453. Trong quá trình diễn ra sự kiện thông thường, người dùng cuối sẽ không cần phải tương tác với mô-đun này, nhưng nó có thể được sử dụng để khởi động pip theo cách thủ công nếu quá trình khởi động tự động vào cài đặt hoặc môi trường ảo bị từ chối.

ensurepip bao gồm một bản sao đi kèm của pip, được cập nhật kể từ bản phát hành đầu tiên của bản phát hành CPython mà nó gửi kèm (điều này áp dụng cho cả bản phát hành bảo trì và bản phát hành tính năng). ensurepip không truy cập được internet. Nếu quá trình cài đặt có quyền truy cập internet, sau khi chạy ensurepip, pip đi kèm có thể được sử dụng để nâng cấp pip lên bản phát hành mới hơn bản phát hành đi kèm. (Lưu ý rằng phiên bản nâng cấp như vậy của pip được coi là gói được cài đặt riêng và sẽ không bị xóa nếu gỡ cài đặt Python.)

Mô-đun này được đặt tên là ensurepip vì nếu được gọi khi pip đã được cài đặt thì nó sẽ không làm gì cả. Nó cũng có một tùy chọn --upgrade sẽ khiến nó cài đặt bản sao đi kèm của pip nếu phiên bản cài đặt hiện tại của pip cũ hơn bản sao đi kèm.

liệt kê

Mô-đun enum mới (được xác định trong PEP 435) cung cấp triển khai tiêu chuẩn cho các kiểu liệt kê, cho phép các mô-đun khác (chẳng hạn như socket) cung cấp nhiều thông báo lỗi hơn và hỗ trợ gỡ lỗi tốt hơn bằng cách thay thế các hằng số nguyên mờ bằng các giá trị liệt kê tương thích ngược.

Xem thêm

PEP 435 -- Thêm loại Enum vào thư viện chuẩn Python

PEP được viết bởi Barry Warsaw, Eli Bendersky và Ethan Furman, do Ethan Furman thực hiện.

đường dẫn

Mô-đun pathlib mới cung cấp các lớp biểu thị đường dẫn hệ thống tệp với ngữ nghĩa phù hợp cho các hệ điều hành khác nhau. Các lớp đường dẫn được phân chia giữa pure paths, cung cấp các hoạt động tính toán thuần túy không có I/O và concrete paths, kế thừa từ các đường dẫn thuần túy nhưng cũng cung cấp các hoạt động I/O.

Đối với Python 3.4, mô-đun này được coi là provisional API.

Xem thêm

PEP 428 -- Mô-đun pathlib -- đường dẫn hệ thống tệp hướng đối tượng

PEP được viết và triển khai bởi Antoine Pitrou.

bộ chọn

Mô-đun selectors mới (được tạo như một phần của quá trình triển khai PEP 3156) cho phép ghép kênh I/O cấp cao và hiệu quả, được xây dựng dựa trên mô-đun gốc select.

thống kê

Mô-đun statistics mới (được xác định trong PEP 450) cung cấp một số chức năng thống kê cốt lõi trực tiếp trong thư viện tiêu chuẩn. Mô-đun này hỗ trợ tính toán giá trị trung bình, trung vị, mode, phương sai và độ lệch chuẩn của chuỗi dữ liệu.

Xem thêm

PEP 450 -- Thêm mô-đun thống kê vào thư viện chuẩn

PEP được viết và triển khai bởi Steven D'Aprano

dấu vết

Mô-đun tracemalloc mới (được xác định trong PEP 454) là một công cụ gỡ lỗi để theo dõi các khối bộ nhớ được Python phân bổ. Nó cung cấp các thông tin sau:

  • Theo dõi nơi một đối tượng được phân bổ

  • Thống kê về khối bộ nhớ được phân bổ cho mỗi tên tệp và số dòng: tổng kích thước, số lượng và kích thước trung bình của các khối bộ nhớ được phân bổ

  • Tính toán sự khác biệt giữa hai ảnh chụp nhanh để phát hiện rò rỉ bộ nhớ

Xem thêm

PEP 454 -- Thêm mô-đun tracemalloc mới để theo dõi việc phân bổ bộ nhớ Python

PEP được viết và triển khai bởi Victor Stinner

Mô-đun cải tiến

abc

Chức năng mới abc.get_cache_token() có thể được sử dụng để biết khi nào nên vô hiệu hóa bộ đệm bị ảnh hưởng bởi những thay đổi trong biểu đồ đối tượng. (Được đóng góp bởi Łukasz Langa trong bpo-16832.)

Lớp mới ABCABCMeta là lớp meta của nó. Việc sử dụng ABC làm lớp cơ sở về cơ bản có tác dụng tương tự như việc chỉ định metaclass=abc.ABCMeta, nhưng gõ đơn giản hơn và dễ đọc hơn. (Được đóng góp bởi Bruno Dupuis trong bpo-16049.)

aifc

Phương thức getparams() hiện trả về một bộ có tên thay vì một bộ đơn giản. (Được đóng góp bởi Claudiu Popa trong bpo-17818.)

aifc.open() hiện hỗ trợ giao thức quản lý ngữ cảnh: khi được sử dụng trong khối with, phương thức close() của đối tượng được trả về sẽ được gọi tự động ở cuối khối. (Được đóng góp bởi Serhiy Storchacha trong bpo-16486.)

Các phương thức writeframesraw()writeframes() hiện chấp nhận mọi bytes-like object. (Được đóng góp bởi Serhiy Storchaka trong bpo-8311.)

phân tích cú pháp

Lớp FileType hiện chấp nhận các đối số encodingerrors, được chuyển đến open(). (Được đóng góp bởi Lucas Maystre trong bpo-11175.)

âm thanh

audioop hiện hỗ trợ các mẫu 24-bit. (Được đóng góp bởi Serhiy Storchaka trong bpo-12866.)

Chức năng byteswap() mới chuyển đổi các mẫu big-endian thành little-endian và ngược lại. (Được đóng góp bởi Serhiy Storchaka trong bpo-19641.)

Tất cả các chức năng audioop hiện chấp nhận mọi bytes-like object. Các chuỗi không được chấp nhận: trước đây chúng không hoạt động, bây giờ chúng báo lỗi ngay lập tức. (Được đóng góp bởi Serhiy Storchaka trong bpo-16685.)

cơ sở64

Các chức năng mã hóa và giải mã trong base64 hiện chấp nhận mọi bytes-like object trong trường hợp trước đây nó yêu cầu phiên bản bytes hoặc bytearray. (Được đóng góp bởi Nick Coghlan trong bpo-17839.)

Các chức năng mới a85encode(), a85decode(), b85encode()b85decode() cung cấp khả năng mã hóa và giải mã dữ liệu nhị phân từ và đến Ascii85 và các định dạng git/mercurial Base85 tương ứng. Các hàm a85 có các tùy chọn có thể được sử dụng để làm cho chúng tương thích với các biến thể của mã hóa Ascii85, bao gồm cả biến thể Adobe. (Được đóng góp bởi Martin Morrison, dự án Mercurial, Serhiy Storchaka và Antoine Pitrou trong bpo-17618.)

bộ sưu tập

Phương thức ChainMap.new_child() hiện chấp nhận đối số m chỉ định bản đồ con để thêm vào chuỗi. Điều này cho phép sử dụng ánh xạ hiện có và/hoặc loại ánh xạ tùy chỉnh cho trẻ. (Được đóng góp bởi Vinay Sajip trong bpo-16613.)

hệ màu

Số chữ số trong các hệ số dành cho chuyển đổi RGB --- YIQ đã được mở rộng để khớp với các phiên bản FCC NTSC. Sự thay đổi trong kết quả phải nhỏ hơn 1% và có thể phù hợp hơn với kết quả được tìm thấy ở nơi khác. (Được đóng góp bởi Brian Landers và Serhiy Storchaka trong bpo-14323.)

bối cảnh

Trình quản lý bối cảnh contextlib.suppress mới giúp làm rõ mục đích của mã cố tình ngăn chặn các ngoại lệ từ một câu lệnh. (Được đóng góp bởi Raymond Hettinger trong bpo-15806 và Zero Piraeus trong bpo-19266.)

Trình quản lý bối cảnh contextlib.redirect_stdout() mới giúp các tập lệnh tiện ích xử lý các API không linh hoạt ghi đầu ra của chúng vào sys.stdout dễ dàng hơn và không cung cấp bất kỳ tùy chọn nào để chuyển hướng nó. Bằng cách sử dụng trình quản lý bối cảnh, đầu ra sys.stdout có thể được chuyển hướng đến bất kỳ luồng nào khác hoặc kết hợp với io.StringIO tới một chuỗi. Cái sau có thể đặc biệt hữu ích, chẳng hạn như để nắm bắt đầu ra từ một hàm được viết để triển khai giao diện dòng lệnh. Nó chỉ được khuyến nghị cho các tập lệnh tiện ích vì nó ảnh hưởng đến trạng thái chung của sys.stdout. (Được đóng góp bởi Raymond Hettinger trong bpo-15805.)

Tài liệu contextlib cũng đã được cập nhật để bao gồm discussion về sự khác biệt giữa các trình quản lý bối cảnh sử dụng một lần, có thể tái sử dụng và được cấp lại.

dbm

Các đối tượng dbm.open() hiện hỗ trợ giao thức quản lý ngữ cảnh. Khi được sử dụng trong câu lệnh with, phương thức close của đối tượng cơ sở dữ liệu sẽ được gọi tự động ở cuối khối. (Được đóng góp bởi Claudiu Popa và Nick Coghlan trong bpo-19282.)

dis

Các hàm show_code(), dis(), distb()disassemble() hiện chấp nhận đối số file chỉ từ khóa để kiểm soát nơi chúng ghi kết quả đầu ra.

Mô-đun dis hiện được xây dựng xung quanh lớp Instruction cung cấp quyền truy cập hướng đối tượng vào các chi tiết của từng hoạt động mã byte riêng lẻ.

Một phương thức mới, get_instructions(), cung cấp một trình vòng lặp phát ra luồng Lệnh cho một đoạn mã Python nhất định. Vì vậy, giờ đây có thể viết một chương trình kiểm tra và thao tác đối tượng mã byte theo những cách khác với những cách do chính mô-đun dis cung cấp. Ví dụ:

>>> nhập đĩa
>>> cho instr trong dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

Các công cụ hiển thị khác nhau trong mô-đun dis đã được viết lại để sử dụng các thành phần mới này.

Ngoài ra, lớp Bytecode thân thiện với ứng dụng mới cung cấp API hướng đối tượng để kiểm tra mã byte ở cả dạng mà con người có thể đọc được và để lặp lại các hướng dẫn. Hàm tạo Bytecode nhận các đối số tương tự như get_instructions() (cộng với một current_offset tùy chọn) và đối tượng kết quả có thể được lặp lại để tạo ra các đối tượng Instruction. Nhưng nó cũng có phương thức dis, tương đương với việc gọi dis trên đối số hàm tạo, nhưng được trả về dưới dạng chuỗi nhiều dòng:

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

Bytecode cũng có một phương thức lớp, from_traceback(), cung cấp khả năng thao tác truy nguyên (nghĩa là print(Bytecode.from_traceback(tb).dis()) tương đương với distb(tb)).

(Được đóng góp bởi Nick Coghlan, Ryan Kelly và Thomas Kluyver trong bpo-11816 và Claudiu Popa trong bpo-17916.)

Hàm mới stack_effect() tính toán hiệu ứng trên ngăn xếp Python của một opcode và đối số nhất định, những thông tin không có sẵn. (Được đóng góp bởi Larry Hastings trong bpo-19722.)

doc nhất

Một option flag mới, FAIL_FAST, tạm dừng chạy thử nghiệm ngay khi phát hiện thấy lỗi đầu tiên. (Được đóng góp bởi R. David Murray và Daniel Urban trong bpo-16522.)

Giao diện dòng lệnh doctest hiện sử dụng argparse và có hai tùy chọn mới là -o-f. -o cho phép doctest options được chỉ định trên dòng lệnh và -f là cách viết tắt của -o FAIL_FAST (để song song với tùy chọn tương tự được hỗ trợ bởi unittest CLI). (Được đóng góp bởi R. David Murray trong bpo-11390.)

doctest bây giờ sẽ tìm thấy các tài liệu trong chuỗi __doc__ của mô-đun mở rộng. (Được đóng góp bởi Zachary Ware trong bpo-3158.)

email

as_string() hiện chấp nhận đối số policy để ghi đè chính sách mặc định của tin nhắn khi tạo biểu diễn chuỗi cho nó. Điều này có nghĩa là as_string hiện có thể được sử dụng trong nhiều trường hợp hơn, thay vì phải tạo và sử dụng generator để truyền tham số định dạng cho phương thức flatten của nó. (Được đóng góp bởi R. David Murray trong bpo-18600.)

Phương thức mới as_bytes() đã được thêm vào để tạo ra biểu diễn byte của thông báo theo kiểu tương tự như cách as_string tạo ra biểu diễn chuỗi. Nó không chấp nhận đối số maxheaderlen nhưng chấp nhận đối số unixfrompolicy. Phương thức Message __bytes__() gọi nó, nghĩa là bytes(mymsg) bây giờ sẽ tạo ra kết quả trực quan: một đối tượng bytes chứa thông báo được định dạng đầy đủ. (Được đóng góp bởi R. David Murray trong bpo-18600.)

Thông báo Message.set_param() hiện chấp nhận đối số từ khóa replace. Khi được chỉ định, tiêu đề liên quan sẽ được cập nhật mà không thay đổi vị trí của nó trong danh sách tiêu đề. Để tương thích ngược, mặc định là False. (Được đóng góp bởi R. David Murray trong bpo-18891.)

Một cặp lớp con mới của Message đã được thêm vào (EmailMessageMIMEPart), cùng với một mô-đun con mới, contentmanager và thuộc tính policy mới content_manager. Tất cả tài liệu hiện có trong mô-đun mới, mô-đun này đang được thêm vào như một phần của provisional API mới của email. Các lớp này cung cấp một số phương pháp mới giúp việc trích xuất nội dung và chèn nội dung vào email dễ dàng hơn nhiều. Để biết chi tiết, hãy xem tài liệu contentmanageremail: Ví dụ. Những bổ sung API này sẽ hoàn thành phần lớn công việc đã được lên kế hoạch như một phần của dự án email6. API tạm thời hiện tại dự kiến ​​sẽ trở thành phiên bản cuối cùng trong Python 3.5 (có thể có một số bổ sung nhỏ trong lĩnh vực xử lý lỗi). (Được đóng góp bởi R. David Murray trong bpo-18891.)

filecmp

Chức năng clear_cache() mới cung cấp khả năng xóa bộ đệm so sánh filecmp, sử dụng thông tin os.stat() để xác định xem tệp có thay đổi kể từ lần so sánh cuối cùng hay không. Điều này có thể được sử dụng, ví dụ: nếu tệp có thể đã được thay đổi và kiểm tra lại trong thời gian ngắn hơn độ phân giải của trường thời gian sửa đổi tệp của hệ thống tệp cụ thể. (Được đóng góp bởi Mark Levitt trong bpo-18149.)

Thuộc tính mô-đun mới DEFAULT_IGNORES cung cấp danh sách các thư mục được sử dụng làm giá trị mặc định cho tham số ignore của hàm dircmp(). (Được đóng góp bởi Eli Bendersky trong bpo-15442.)

công cụ chức năng

Bộ mô tả partialmethod() mới mang lại ứng dụng đối số một phần cho bộ mô tả, giống như partial() cung cấp cho các lệnh gọi thông thường. Bộ mô tả mới cũng giúp dễ dàng hơn trong việc khiến các lệnh gọi tùy ý (bao gồm cả các phiên bản partial()) hoạt động giống như các phương thức phiên bản thông thường khi được đưa vào định nghĩa lớp. (Được đóng góp bởi Alon Horev và Nick Coghlan trong bpo-4331.)

Trình trang trí singledispatch() mới mang đến sự hỗ trợ cho các hàm chung gửi đơn cho thư viện chuẩn Python. Trong khi lập trình hướng đối tượng tập trung vào việc nhóm nhiều thao tác trên một tập hợp dữ liệu chung vào một lớp, thì hàm chung tập trung vào việc nhóm nhiều cách triển khai của một thao tác cho phép nó hoạt động với các loại dữ liệu different.

Xem thêm

PEP 443 -- Các hàm chung gửi một lần

PEP được viết và triển khai bởi Łukasz Langa.

total_ordering() hiện hỗ trợ giá trị trả về là NotImplemented từ hàm so sánh cơ bản. (Được đóng góp bởi Katie Miller trong bpo-10042.)

Phiên bản thuần Python của hàm partial() hiện có trong stdlib; trong CPython, nó bị ghi đè bởi phiên bản tăng tốc C, nhưng nó có sẵn cho các triển khai khác sử dụng. (Được đóng góp bởi Brian Thorne trong bpo-12428.)

gc

Hàm mới get_stats() trả về danh sách ba từ điển cho mỗi thế hệ chứa số liệu thống kê về bộ sưu tập kể từ khi khởi động trình thông dịch. (Được đóng góp bởi Antoine Pitrou trong bpo-16351.)

quả địa cầu

Hàm mới escape() cung cấp một cách để thoát các ký tự đặc biệt trong tên tệp để chúng không trở thành một phần của bản mở rộng toàn cầu mà thay vào đó được khớp theo nghĩa đen. (Được đóng góp bởi Serhiy Storchaka trong bpo-8402.)

hàm băm

Chức năng hashlib.pbkdf2_hmac() mới cung cấp PKCS#5 password-based key derivation function 2. (Được đóng góp bởi Christian Heimes trong bpo-18582.)

Thuộc tính name của đối tượng băm hashlib hiện là giao diện được hỗ trợ chính thức. Nó luôn tồn tại trong hashlib của CPython (mặc dù nó không trả về tên viết thường cho tất cả các giá trị băm được hỗ trợ), nhưng nó không phải là giao diện công cộng và do đó một số triển khai Python khác trước đây chưa hỗ trợ nó. (Được đóng góp bởi Jason R. Coombs trong bpo-18532.)

hmac

hmac hiện chấp nhận bytearray cũng như bytes cho đối số key cho hàm new() và tham số msg cho cả hàm new() và phương thức update() hiện chấp nhận bất kỳ loại nào được mô-đun hashlib hỗ trợ. (Được đóng góp bởi Jonas Borgström trong bpo-18240.)

Đối số digestmod cho hàm hmac.new() bây giờ có thể là bất kỳ tên tóm tắt băm nào được hashlib nhận ra. Ngoài ra, hành vi hiện tại trong đó giá trị mặc định của digestmodMD5 không được dùng nữa: trong phiên bản Python trong tương lai sẽ không có giá trị mặc định. (Được đóng góp bởi Christian Heimes trong bpo-17276.)

Với việc bổ sung các thuộc tính block_sizename (và tài liệu chính thức về thuộc tính digest_size), mô-đun hmac hiện hoàn toàn tuân thủ PEP 247 API. (Được đóng góp bởi Christian Heimes trong bpo-18775.)

html

Hàm mới unescape() chuyển đổi tham chiếu ký tự HTML5 thành ký tự Unicode tương ứng. (Được đóng góp bởi Ezio Melotti trong bpo-2927.)

HTMLParser chấp nhận một đối số từ khóa mới convert_charrefs, khi True, sẽ tự động chuyển đổi tất cả các tham chiếu ký tự. Để có khả năng tương thích ngược, giá trị mặc định của nó là False, nhưng nó sẽ thay đổi thành True trong phiên bản Python trong tương lai, vì vậy, bạn nên đặt giá trị này một cách rõ ràng và cập nhật mã của mình để sử dụng tính năng mới này. (Được đóng góp bởi Ezio Melotti trong bpo-13633.)

Đối số strict của HTMLParser hiện không được dùng nữa. (Được đóng góp bởi Ezio Melotti trong bpo-15114.)

http

send_error() hiện chấp nhận tham số explain bổ sung tùy chọn có thể được sử dụng để cung cấp mô tả lỗi mở rộng, ghi đè mặc định được mã hóa cứng nếu có. Mô tả lỗi mở rộng này sẽ được định dạng bằng thuộc tính error_message_format và được gửi dưới dạng nội dung của phản hồi lỗi. (Được đóng góp bởi Karl Cow trong bpo-12921.)

http.server command line interface hiện có tùy chọn -b/--bind khiến máy chủ lắng nghe một địa chỉ cụ thể. (Được đóng góp bởi Malte Swart trong bpo-17764.)

nhàn rỗi và IDLE

Vì Idlelib triển khai shell và trình soạn thảo IDLE và không dành cho các chương trình khác nhập nên nó sẽ được cải thiện sau mỗi lần phát hành. Xem Lib/idlelib/NEWS.txt để biết danh sách tích lũy các thay đổi kể từ phiên bản 3.3.0 cũng như các thay đổi được thực hiện trong các bản phát hành 3.4.x trong tương lai. Tệp này cũng có sẵn trong hộp thoại IDLE Help ‣ About IDLE.

nhập khẩu

InspectLoader ABC định nghĩa một phương thức mới, source_to_code() chấp nhận dữ liệu nguồn và đường dẫn rồi trả về một đối tượng mã. Việc triển khai mặc định tương đương với compile(data, path, 'exec', dont_inherit=True). (Được đóng góp bởi Eric Snow và Brett Cannon trong bpo-15627.)

InspectLoader hiện cũng có cách triển khai mặc định cho phương thức get_code(). Tuy nhiên, thông thường nên ghi đè cài đặt mặc định vì lý do hiệu suất. (Được đóng góp bởi Brett Cannon trong bpo-18072.)

Hàm reload() đã được chuyển từ imp sang importlib như một phần của việc ngừng sử dụng mô-đun imp. (Được đóng góp bởi Berker Peksag trong bpo-18193.)

importlib.util hiện có thuộc tính MAGIC_NUMBER cung cấp quyền truy cập vào số phiên bản mã byte. Điều này thay thế chức năng get_magic() trong mô-đun imp không được dùng nữa. (Được đóng góp bởi Brett Cannon trong bpo-18192.)

Các hàm importlib.util mới cache_from_source()source_from_cache() thay thế các hàm cùng tên trong mô-đun imp không được dùng nữa. (Được đóng góp bởi Brett Cannon trong bpo-18194.)

importlib bootstrap NamespaceLoader hiện phù hợp với InspectLoader ABC, có nghĩa là runpypython -m hiện có thể được sử dụng với các gói không gian tên. (Được đóng góp bởi Brett Cannon trong bpo-18058.)

importlib.util có chức năng mới decode_source() giải mã nguồn từ byte bằng cách sử dụng xử lý dòng mới phổ quát. Điều này rất hữu ích cho việc thực hiện các phương pháp InspectLoader.get_source().

importlib.machinery.ExtensionFileLoader hiện có phương thức get_filename(). Điều này đã vô tình bị bỏ qua trong quá trình triển khai ban đầu. (Được đóng góp bởi Eric Snow trong bpo-19152.)

kiểm tra

Mô-đun inspect hiện cung cấp command line interface cơ bản để hiển thị nhanh mã nguồn và thông tin khác cho mô-đun, lớp và chức năng. (Được đóng góp bởi Claudiu Popa và Nick Coghlan trong bpo-18626.)

unwrap() giúp dễ dàng làm sáng tỏ các chuỗi hàm bao bọc được tạo bởi functools.wraps() (và bất kỳ API nào khác đặt thuộc tính __wrapped__ trên hàm bao bọc). (Được đóng góp bởi Daniel Urban, Aaron Iles và Nick Coghlan trong bpo-13266.)

Là một phần trong quá trình triển khai mô-đun enum mới, mô-đun inspect hiện hỗ trợ tốt hơn đáng kể cho các phương thức __dir__ tùy chỉnh và thuộc tính lớp động được cung cấp thông qua siêu dữ liệu. (Được đóng góp bởi Ethan Furman trong bpo-18929bpo-19030.)

getfullargspec()getargspec() hiện sử dụng signature() API. Điều này cho phép họ hỗ trợ phạm vi có thể gọi rộng hơn nhiều, bao gồm những thuộc tính có thuộc tính __signature__, những thuộc tính có siêu dữ liệu được cung cấp bởi phòng khám đối số, đối tượng functools.partial(), v.v. Lưu ý rằng, không giống như signature(), các hàm này vẫn bỏ qua các thuộc tính __wrapped__ và báo cáo đối số đầu tiên đã bị ràng buộc cho các phương thức bị ràng buộc, do đó, vẫn cần phải cập nhật mã của bạn để sử dụng trực tiếp signature() nếu muốn những tính năng đó. (Được đóng góp bởi Yury Selivanov trong bpo-17481.)

signature() hiện hỗ trợ các loại hàm CPython vịt, bổ sung hỗ trợ cho các hàm được biên dịch bằng Cython. (Được đóng góp bởi Stefan Behnel và Yury Selivanov trong bpo-17159.)

váy ipad

ipaddress đã được thêm vào thư viện chuẩn trong Python 3.3 dưới dạng provisional API. Với việc phát hành Python 3.4, tiêu chuẩn này đã bị loại bỏ: ipaddress hiện được coi là API ổn định, đáp ứng các yêu cầu thư viện tiêu chuẩn thông thường để duy trì khả năng tương thích ngược.

Thuộc tính is_global mới là True nếu một địa chỉ có thể định tuyến trên toàn cầu. (Được đóng góp bởi Peter Moody trong bpo-17400.)

khai thác gỗ

Zz000zz có tham số atTime mới có thể được sử dụng để chỉ định thời gian trong ngày khi quá trình chuyển đổi sẽ xảy ra. (Được đóng góp bởi Ronald Oussoren trong bpo-9556.)

SocketHandlerDatagramHandler hiện hỗ trợ ổ cắm tên miền Unix (bằng cách đặt port thành None). (Được đóng góp bởi Vinay Sajip trong cam kết ce46195b56a9.)

fileConfig() hiện chấp nhận phiên bản lớp con configparser.RawConfigParser cho tham số fname. Điều này tạo điều kiện thuận lợi cho việc sử dụng tệp cấu hình khi cấu hình ghi nhật ký chỉ là một phần của cấu hình ứng dụng tổng thể hoặc khi ứng dụng sửa đổi cấu hình trước khi chuyển nó tới fileConfig(). (Được đóng góp bởi Vinay Sajip trong bpo-16110.)

Giờ đây, dữ liệu cấu hình ghi nhật ký nhận được từ ổ cắm thông qua hàm logging.config.listen() có thể được xác thực trước khi được xử lý bằng cách cung cấp hàm xác minh làm đối số cho đối số từ khóa verify mới. (Được đóng góp bởi Vinay Sajip trong bpo-15452.)

nguyên soái

Phiên bản marshal mặc định đã được nâng lên thành 3. Mã triển khai phiên bản mới khôi phục hành vi Python2 chỉ ghi lại một bản sao của các chuỗi nội bộ và duy trì nội bộ trong quá trình khử tuần tự hóa, đồng thời mở rộng khả năng "một bản sao" này cho bất kỳ loại đối tượng nào (bao gồm cả việc xử lý các tham chiếu đệ quy). Điều này làm giảm cả kích thước của tệp .pyc và dung lượng bộ nhớ mà mô-đun chiếm trong bộ nhớ khi nó được tải từ tệp .pyc (hoặc .pyo). (Được đóng góp bởi Kristján Valur Jónsson trong bpo-16475, với sự tăng tốc bổ sung của Antoine Pitrou trong bpo-19219.)

mmap

đối tượng mmap bây giờ là weakly referenceable. (Được đóng góp bởi Valerie Lambert trong bpo-4885.)

đa xử lý

Trên Unix hai start methods mới, spawnforkserver, đã được thêm vào để bắt đầu quá trình sử dụng multiprocessing. Những điều này làm cho việc trộn các tiến trình với các luồng trở nên mạnh mẽ hơn và phương thức spawn phù hợp với ngữ nghĩa mà đa xử lý luôn sử dụng trên Windows. Chức năng mới get_all_start_methods() báo cáo tất cả các phương thức bắt đầu có sẵn trên nền tảng, get_start_method() báo cáo phương thức bắt đầu hiện tại và set_start_method() đặt phương thức bắt đầu. (Được đóng góp bởi Richard Oudkerk trong bpo-8713.)

multiprocessing hiện cũng có khái niệm về context, xác định cách tạo các tiến trình con. Hàm mới get_context() trả về ngữ cảnh sử dụng phương thức bắt đầu được chỉ định. Nó có cùng API với chính mô-đun multiprocessing, vì vậy bạn có thể sử dụng nó để tạo Pools và các đối tượng khác sẽ hoạt động trong bối cảnh đó. Điều này cho phép một khung và một ứng dụng hoặc các phần khác nhau của cùng một ứng dụng sử dụng đa xử lý mà không can thiệp lẫn nhau. (Được đóng góp bởi Richard Oudkerk trong bpo-18999.)

Ngoại trừ khi sử dụng phương thức khởi động fork cũ, các tiến trình con không còn kế thừa các bộ mô tả tệp/điều khiển không cần thiết từ cấp độ gốc của chúng (một phần của bpo-8713).

multiprocessing hiện dựa vào runpy (triển khai khóa chuyển -m) để khởi tạo __main__ một cách thích hợp trong các tiến trình con khi sử dụng phương thức khởi động spawn hoặc forkserver. Điều này giải quyết một số trường hợp đặc biệt trong đó việc kết hợp đa xử lý, chuyển đổi dòng lệnh -m và nhập tương đối rõ ràng có thể gây ra lỗi khó hiểu trong các tiến trình con. (Được đóng góp bởi Nick Coghlan trong bpo-19946.)

toán tử

Hàm mới length_hint() cung cấp cách triển khai đặc tả về cách sử dụng phương thức đặc biệt __length_hint__(), như một phần của đặc tả chính thức PEP 424 của tính năng ngôn ngữ này. (Được đóng góp bởi Armin Ronacher trong bpo-16148.)

Hiện đã có phiên bản thuần Python của mô-đun operator để tham khảo và sử dụng bằng cách triển khai Python thay thế. (Được đóng góp bởi Zachary Ware trong bpo-16694.)

hệ điều hành

Có các chức năng mới để lấy và đặt inheritable flag của bộ mô tả tệp (os.get_inheritable(), os.set_inheritable()) hoặc bộ điều khiển Windows (os.get_handle_inheritable(), os.set_handle_inheritable()).

Hàm mới cpu_count() báo cáo số lượng CPU có sẵn trên nền tảng mà Python đang chạy (hoặc None nếu không thể xác định được số lượng). Chức năng multiprocessing.cpu_count() hiện được triển khai theo chức năng này). (Được đóng góp bởi Trent Nelson, Yogesh Chaudhari, Victor Stinner và Charles-François Natali trong bpo-17914.)

os.path.samestat() hiện có sẵn trên nền tảng Windows (và việc triển khai os.path.samefile() hiện được chia sẻ giữa Unix và Windows). (Được đóng góp bởi Brian Curtin trong bpo-11939.)

os.path.ismount() hiện nhận dạng các ổ đĩa được gắn bên dưới gốc ổ đĩa trên Windows. (Được đóng góp bởi Tim Golden trong bpo-9035.)

os.open() hỗ trợ hai cờ mới trên các nền tảng cung cấp chúng, O_PATH (bộ mô tả tệp chưa mở) và O_TMPFILE (tệp tạm thời chưa được đặt tên; kể từ bản phát hành 3.4.0 chỉ có sẵn trên các hệ thống Linux có phiên bản kernel 3.11 trở lên có tiêu đề uapi). (Được đóng góp bởi Christian Heimes lần lượt trong bpo-18673 và Benjamin Peterson.)

pdb

pdb đã được cải tiến để xử lý các trình tạo, yieldyield from theo cách hữu ích hơn. Điều này đặc biệt hữu ích khi gỡ lỗi các chương trình dựa trên asyncio. (Được đóng góp bởi Andrew Svetlov và Xavier de Gaye trong bpo-16596.)

Lệnh print đã bị xóa khỏi pdb, khôi phục quyền truy cập vào hàm Python print() từ dòng lệnh pdb. pdb của Python2 không có lệnh print; thay vào đó, nhập print sẽ thực thi câu lệnh print. Trong Python3 print đã bị đặt nhầm thành bí danh cho lệnh pdb p. Tuy nhiên, p in repr đối số của nó chứ không phải str như lệnh Python2 print đã làm. Tệ hơn nữa, lệnh Python3 pdb print đã che khuất hàm Python3 print, khiến nó không thể truy cập được tại dấu nhắc pdb. (Được đóng góp bởi Connor Osborn trong bpo-18764.)

dưa chua

pickle hiện hỗ trợ (nhưng không sử dụng theo mặc định) giao thức dưa chua mới, giao thức 4. Giao thức mới này giải quyết một số vấn đề tồn tại trong các giao thức trước đó, chẳng hạn như tuần tự hóa các lớp lồng nhau, chuỗi và vùng chứa rất lớn cũng như các lớp có phương thức __new__() chỉ nhận các đối số từ khóa. Nó cũng cung cấp một số cải tiến hiệu quả.

Xem thêm

PEP 3154 -- Giao thức dưa chua 4

PEP được viết bởi Antoine Pitrou và được thực hiện bởi Alexandre Vassalotti.

plistlib

plistlib hiện có API tương tự như mẫu tiêu chuẩn cho các giao thức tuần tự hóa stdlib, với các hàm load(), dump(), loads()dumps() mới. (Zz009zz cũ hơn hiện không được dùng nữa.) Ngoài định dạng plist XML đã được hỗ trợ (FMT_XML), giờ đây nó còn hỗ trợ định dạng plist nhị phân (FMT_BINARY). (Được đóng góp bởi Ronald Oussoren và những người khác trong bpo-14455.)

poplib

Hai phương thức mới đã được thêm vào poplib: capa(), trả về danh sách các khả năng được quảng cáo bởi máy chủ POP và stls(), chuyển phiên POP3 văn bản rõ thành phiên POP3 được mã hóa nếu máy chủ POP hỗ trợ nó. (Được đóng góp bởi Lorenzo Catucci trong bpo-4473.)

in ấn

Lớp PrettyPrinter của mô-đun pprint cũng như các hàm pformat()pprint() của nó có một tùy chọn mới, compact, kiểm soát cách định dạng đầu ra. Hiện tại, việc đặt compact thành True có nghĩa là các chuỗi sẽ được in với số lượng thành phần chuỗi phù hợp với width trên mỗi dòng (thụt lề). (Được đóng góp bởi Serhiy Storchaka trong bpo-19132.)

Các chuỗi dài hiện được gói bằng cú pháp tiếp tục dòng thông thường của Python. (Được đóng góp bởi Antoine Pitrou trong bpo-17150.)

pty

pty.spawn() hiện trả về giá trị trạng thái từ os.waitpid() trên tiến trình con, thay vì None. (Được đóng góp bởi Gregory P. Smith.)

pydoc

Mô-đun pydoc hiện dựa trực tiếp vào API nội quan inspect.signature(), cho phép nó cung cấp thông tin chữ ký cho nhiều đối tượng có thể gọi được hơn. Thay đổi này cũng có nghĩa là các thuộc tính __wrapped__ hiện được tính đến khi hiển thị thông tin trợ giúp. (Được đóng góp bởi Larry Hastings trong bpo-19674.)

Mô-đun pydoc không còn hiển thị tham số self cho các phương thức đã bị ràng buộc. Thay vào đó, nó nhằm mục đích luôn hiển thị chữ ký hiện tại chính xác của lệnh gọi được cung cấp. (Được đóng góp bởi Larry Hastings trong bpo-20710.)

Ngoài những thay đổi được thực hiện trực tiếp với pydoc, việc xử lý các phương thức __dir__ tùy chỉnh và các hành vi mô tả khác nhau cũng đã được cải thiện đáng kể nhờ những thay đổi cơ bản trong mô-đun inspect.

Vì nội dung help() dựa trên pydoc nên những thay đổi trên cũng ảnh hưởng đến hoạt động của help().

lại

Hàm fullmatch() mới và phương thức Pattern.fullmatch() neo mẫu ở cả hai đầu của chuỗi để khớp. Điều này cung cấp một cách để trình bày rõ ràng về mục tiêu của trận đấu, giúp tránh được một loại lỗi tinh vi trong đó các ký tự $ bị mất trong quá trình thay đổi mã hoặc bổ sung các lựa chọn thay thế cho biểu thức chính quy hiện có. (Được đóng góp bởi Matthew Barnett trong bpo-16203.)

Repr của regex objects hiện bao gồm mẫu và cờ; đại diện của match objects hiện bao gồm phần đầu, phần cuối và phần của chuỗi khớp. (Được đóng góp bởi Hugo Lopes Tavares và Serhiy Storchaka trong bpo-13592bpo-17087.)

tài nguyên

Chức năng prlimit() mới, có sẵn trên nền tảng Linux với phiên bản kernel từ 2.6.36 trở lên và glibc từ 2.13 trở lên, cung cấp khả năng truy vấn hoặc đặt giới hạn tài nguyên cho các quy trình không phải là quy trình thực hiện cuộc gọi. (Được đóng góp bởi Christian Heimes trong bpo-16595.)

Trên nhân Linux phiên bản 2.6.36 trở lên, cũng có một số hằng số mới dành riêng cho Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIMERLIMIT_SIGPENDING. (Được đóng góp bởi Christian Heimes trong bpo-19324.)

Trên FreeBSD phiên bản 9 trở lên, có một số hằng số cụ thể mới của FreeBSD: RLIMIT_SBSIZE, RLIMIT_SWAPRLIMIT_NPTS. (Được đóng góp bởi Claudiu Popa trong bpo-19343.)

chọn

Các đối tượng epoll hiện hỗ trợ giao thức quản lý ngữ cảnh. Khi được sử dụng trong câu lệnh with, phương thức close() sẽ được gọi tự động ở cuối khối. (Được đóng góp bởi Serhiy Storchaka trong bpo-16488.)

Các đối tượng devpoll hiện có các phương thức fileno()close(), cũng như một thuộc tính mới closed. (Được đóng góp bởi Victor Stinner trong bpo-18794.)

kệ

Các phiên bản Shelf hiện có thể được sử dụng trong câu lệnh with và sẽ tự động đóng ở cuối khối with. (Được đóng góp bởi Filip Gruszczyński trong bpo-13896.)

im lặng

copyfile() hiện tạo ra một lớp con Error cụ thể, SameFileError, khi nguồn và đích là cùng một tệp, cho phép ứng dụng thực hiện hành động thích hợp đối với lỗi cụ thể này. (Được đóng góp bởi Atsuo Ishimoto và Hynek Schlawack trong bpo-1492704.)

smtpd

Các lớp SMTPServerSMTPChannel hiện chấp nhận đối số từ khóa map, nếu được chỉ định, sẽ được chuyển vào asynchat.async_chat làm đối số map của nó. Điều này cho phép ứng dụng tránh ảnh hưởng đến bản đồ ổ cắm toàn cầu. (Được đóng góp bởi Vinay Sajip trong bpo-11959.)

smtplib

SMTPException hiện là một lớp con của OSError, cho phép phát hiện cả lỗi cấp độ ổ cắm và lỗi cấp độ giao thức SMTP trong một câu lệnh thử/ngoại trừ bằng mã chỉ quan tâm xem có xảy ra lỗi hay không. (Được đóng góp bởi Ned Jackson Lovely trong bpo-2118.)

ổ cắm

Mô-đun ổ cắm hiện hỗ trợ giao thức CAN_BCM trên các nền tảng hỗ trợ nó. (Được đóng góp bởi Brian Thorne trong bpo-15359.)

Các đối tượng socket có các phương thức mới để lấy hoặc đặt inheritable flag, get_inheritable()set_inheritable() của chúng.

Các hằng số socket.AF_*socket.SOCK_* hiện là giá trị liệt kê bằng mô-đun enum mới. Điều này cho phép in các tên có ý nghĩa trong quá trình gỡ lỗi, thay vì "số ma thuật" số nguyên.

Hằng số AF_LINK hiện có sẵn trên BSD và OSX.

inet_pton()inet_ntop() hiện được hỗ trợ trên Windows. (Được đóng góp bởi Atsuo Ishimoto trong bpo-7171.)

sqlite3

Một tham số boolean mới cho hàm connect(), uri, có thể được sử dụng để chỉ ra rằng tham số databaseuri (xem SQLite URI documentation). (Được đóng góp bởi poq trong bpo-13773.)

ssl

PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2 (hỗ trợ TLSv1.1 và TLSv1.2) đã được thêm vào; hỗ trợ cho các giao thức này chỉ khả dụng nếu Python được liên kết với OpenSSL 1.0.1 trở lên. (Được đóng góp bởi Michele Orrù và Antoine Pitrou trong bpo-16692.)

Chức năng mới create_default_context() cung cấp một cách tiêu chuẩn để có được SSLContext có cài đặt nhằm mục đích cân bằng hợp lý giữa khả năng tương thích và bảo mật. Các cài đặt này nghiêm ngặt hơn các cài đặt mặc định do hàm tạo SSLContext cung cấp và có thể được điều chỉnh trong tương lai mà không bị phản đối trước nếu các yêu cầu bảo mật phương pháp tốt nhất thay đổi. Cách tốt nhất mới được đề xuất để sử dụng thư viện stdlib hỗ trợ SSL là sử dụng create_default_context() để lấy đối tượng SSLContext, sửa đổi nó nếu cần và sau đó chuyển nó làm đối số context của stdlib API thích hợp. (Được đóng góp bởi Christian Heimes trong bpo-19689.)

Phương thức SSLContext load_verify_locations() chấp nhận một đối số tùy chọn mới cadata, đối số này có thể được sử dụng để cung cấp chứng chỉ được mã hóa PEM hoặc DER trực tiếp thông qua chuỗi hoặc byte tương ứng. (Được đóng góp bởi Christian Heimes trong bpo-18138.)

Hàm mới get_default_verify_paths() trả về một bộ có tên gồm các đường dẫn và biến môi trường mà phương thức set_default_verify_paths() sử dụng để đặt cafilecapath mặc định của OpenSSL. Điều này có thể hỗ trợ trong việc gỡ lỗi các vấn đề xác minh mặc định. (Được đóng góp bởi Christian Heimes trong bpo-18143.)

SSLContext có một phương thức mới, cert_store_stats(), báo cáo số lượng chứng chỉ X.509, chứng chỉ X.509 CA và danh sách thu hồi chứng chỉ (crls), cũng như phương thức get_ca_certs() trả về danh sách các chứng chỉ CA đã tải. (Được đóng góp bởi Christian Heimes trong bpo-18147.)

Nếu OpenSSL 0.9.8 trở lên khả dụng, SSLContext có một thuộc tính mới verify_flags có thể được sử dụng để kiểm soát quá trình xác minh chứng chỉ bằng cách đặt nó thành một số kết hợp của các hằng số mới VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN hoặc VERIFY_X509_STRICT. OpenSSL không thực hiện bất kỳ xác minh CRL nào theo mặc định. (Được đóng góp bởi Christien Heimes trong bpo-8813.)

Phương thức SSLContext mới load_default_certs() tải một bộ chứng chỉ "cơ quan cấp chứng chỉ" (CA) mặc định từ các vị trí mặc định, các chứng chỉ này khác nhau tùy theo nền tảng. Nó có thể được sử dụng để tải cả chứng chỉ xác thực máy chủ web TLS (purpose=SERVER_AUTH) cho khách hàng sử dụng để xác minh máy chủ và chứng chỉ cho máy chủ sử dụng để xác minh chứng chỉ ứng dụng khách (purpose=CLIENT_AUTH). (Được đóng góp bởi Christian Heimes trong bpo-19292.)

Hai chức năng mới chỉ dành cho windows, enum_certificates()enum_crls() cung cấp khả năng truy xuất chứng chỉ, thông tin chứng chỉ và CRL từ kho chứng chỉ Windows. (Được đóng góp bởi Christian Heimes trong bpo-17134.)

Hỗ trợ SNI phía máy chủ (Chỉ báo tên máy chủ) bằng phương pháp ssl.SSLContext.set_servername_callback() mới. (Được đóng góp bởi Daniel Black trong bpo-8109.)

Từ điển được trả về bởi SSLSocket.getpeercert() chứa các mục mở rộng X509v3 bổ sung: URI crlDistributionPoints, calIssuersOCSP. (Được đóng góp bởi Christian Heimes trong bpo-18379.)

chỉ số

Mô-đun stat hiện được hỗ trợ bằng cách triển khai C trong _stat. Cần phải triển khai C vì hầu hết các giá trị không được chuẩn hóa và phụ thuộc vào nền tảng. (Được đóng góp bởi Christian Heimes trong bpo-11016.)

Mô-đun này hỗ trợ các cờ ST_MODE mới, S_IFDOOR, S_IFPORTS_IFWHT. (Được đóng góp bởi Christian Hiemes trong bpo-11016.)

cấu trúc

Hàm mới iter_unpack và phương thức struct.Struct.iter_unpack() mới trên các định dạng được biên dịch cung cấp khả năng giải nén trực tiếp bộ đệm chứa các phiên bản lặp lại của một định dạng dữ liệu nhất định. (Được đóng góp bởi Antoine Pitrou trong bpo-17804.)

quy trình con

check_output() hiện chấp nhận đối số input có thể được sử dụng để cung cấp nội dung của stdin cho lệnh được chạy. (Được đóng góp bởi Zack Weinberg trong bpo-16624.)

getoutput()getstatusoutput() hiện hoạt động trên Windows. Thay đổi này thực sự đã vô tình được thực hiện trong 3.3.4. (Được đóng góp bởi Tim Golden trong bpo-10197.)

tắm nắng

Phương thức getparams() hiện trả về một bộ có tên thay vì một bộ đơn giản. (Được đóng góp bởi Claudiu Popa trong bpo-18901.)

sunau.open() hiện hỗ trợ giao thức quản lý ngữ cảnh: khi được sử dụng trong khối with, phương thức close của đối tượng được trả về sẽ được gọi tự động ở cuối khối. (Được đóng góp bởi Serhiy Storchaka trong bpo-18878.)

AU_write.setsampwidth() hiện hỗ trợ các mẫu 24 bit, do đó bổ sung thêm hỗ trợ ghi 24 mẫu bằng mô-đun. (Được đóng góp bởi Serhiy Storchaka trong bpo-19261.)

Các phương thức writeframesraw()writeframes() hiện chấp nhận mọi bytes-like object. (Được đóng góp bởi Serhiy Storchaka trong bpo-8311.)

hệ thống

Hàm mới sys.getallocatedblocks() trả về số khối hiện tại được trình thông dịch phân bổ. (Trong CPython với cài đặt --with-pymalloc mặc định, đây là sự phân bổ được thực hiện thông qua PyObject_Malloc() API.) Điều này có thể hữu ích để theo dõi rò rỉ bộ nhớ, đặc biệt nếu được tự động hóa thông qua bộ kiểm tra. (Được đóng góp bởi Antoine Pitrou trong bpo-13390.)

Khi trình thông dịch Python khởi động bằng interactive mode, nó sẽ kiểm tra thuộc tính __interactivehook__ trên mô-đun sys. Nếu thuộc tính tồn tại, giá trị của nó sẽ được gọi mà không có đối số ngay trước khi chế độ tương tác được bắt đầu. Việc kiểm tra được thực hiện sau khi tệp PYTHONSTARTUP được đọc, vì vậy nó có thể được đặt ở đó. Mô-đun site sets it thành chức năng cho phép hoàn thành tab và lưu lịch sử (trong ~/.python-history) nếu nền tảng hỗ trợ readline. Nếu bạn không muốn hành vi (mới) này, bạn có thể ghi đè nó trong PYTHONSTARTUP, sitecustomize hoặc usercustomize bằng cách xóa thuộc tính này khỏi sys (hoặc đặt nó thành một số lệnh gọi khác). (Được đóng góp bởi Éric Araujo và Antoine Pitrou trong bpo-5845.)

hồ dầu

Mô-đun tarfile hiện hỗ trợ Giao diện dòng lệnh đơn giản khi được gọi trực tiếp dưới dạng tập lệnh hoặc thông qua -m. Điều này có thể được sử dụng để tạo và trích xuất các kho lưu trữ tarfile. (Được đóng góp bởi Berker Peksag trong bpo-13477.)

bọc văn bản

Lớp TextWrapper có hai đối số thuộc tính/hàm tạo mới: max_lines, giới hạn số dòng ở đầu ra và placeholder, là một chuỗi sẽ xuất hiện ở cuối đầu ra nếu nó bị cắt bớt vì max_lines. Dựa trên những khả năng này, một chức năng tiện lợi mới shorten() sẽ thu gọn tất cả khoảng trắng trong đầu vào thành các khoảng trắng đơn và tạo ra một dòng duy nhất của width nhất định kết thúc bằng placeholder (theo mặc định là [...]). (Được đóng góp bởi Antoine Pitrou và Serhiy Storchaka trong bpo-18585bpo-18725.)

luồng

Đối tượng Thread đại diện cho luồng chính có thể được lấy từ hàm main_thread() mới. Trong điều kiện bình thường, đây sẽ là luồng mà trình thông dịch Python được khởi động. (Được đóng góp bởi Andrew Svetlov trong bpo-18882.)

truy nguyên

Hàm traceback.clear_frames() mới lấy một đối tượng truy nguyên và xóa các biến cục bộ trong tất cả các khung mà nó tham chiếu, giảm lượng bộ nhớ tiêu thụ. (Được đóng góp bởi Andrew Kuchling trong bpo-1565525.)

các loại

Bộ mô tả DynamicClassAttribute() mới cung cấp cách xác định thuộc tính hoạt động bình thường khi tra cứu thông qua một đối tượng phiên bản, nhưng được chuyển đến class __getattr__ khi tra cứu qua lớp. Điều này cho phép một người có các thuộc tính hoạt động trên một lớp và có các thuộc tính ảo trên lớp có cùng tên (xem enum để biết ví dụ). (Được đóng góp bởi Ethan Furman trong bpo-19030.)

urllib

urllib.request hiện hỗ trợ URL data: thông qua lớp DataHandler. (Được đóng góp bởi Mathias Panzenböck trong bpo-16423.)

Phương thức http sẽ được lớp Request sử dụng hiện có thể được chỉ định bằng cách đặt thuộc tính lớp method trên lớp con. (Được đóng góp bởi Jason R Coombs trong bpo-18978.)

Các đối tượng Request hiện có thể tái sử dụng được: nếu thuộc tính full_url hoặc data được sửa đổi, tất cả các thuộc tính bên trong có liên quan sẽ được cập nhật. Ví dụ: điều này có nghĩa là hiện tại có thể sử dụng cùng một đối tượng Request trong nhiều lệnh gọi OpenerDirector.open() với các đối số data khác nhau hoặc sửa đổi url của Requestthay vì tính toán lại từ đầu. Ngoài ra còn có một phương pháp remove_header() mới có thể được sử dụng để xóa tiêu đề khỏi Request. (Được đóng góp bởi Alexey Kachayev trong bpo-16464, Daniel Wozniak trong bpo-17485, và Damien Brecht và Senthil Kumaran trong bpo-17272.)

Các đối tượng HTTPError hiện có thuộc tính headers cung cấp quyền truy cập vào tiêu đề phản hồi HTTP liên quan đến lỗi. (Được đóng góp bởi Berker Peksag trong bpo-15701.)

nhỏ nhất

Lớp TestCase có một phương thức mới, subTest(), tạo ra một trình quản lý bối cảnh có khối with trở thành "thử nghiệm phụ". Trình quản lý bối cảnh này cho phép một phương thức thử nghiệm tự động tạo ra các thử nghiệm phụ bằng cách gọi trình quản lý bối cảnh subTest bên trong một vòng lặp. Do đó, một phương pháp thử nghiệm duy nhất có thể tạo ra số lượng không xác định các thử nghiệm được xác định và tính riêng biệt, tất cả các thử nghiệm đó sẽ chạy ngay cả khi một hoặc nhiều thử nghiệm trong số đó thất bại. Ví dụ:

lớp NumbersTest(unittest.TestCase):
    def test_even(tự):
        cho tôi trong phạm vi (6):
            với self.subTest(i=i):
                self.assertEqual(i % 2, 0)

sẽ dẫn đến sáu phép thử phụ, mỗi phép thử được xác định trong đầu ra dài dòng nhất với nhãn bao gồm tên biến i và một giá trị cụ thể cho biến đó (i=0, i=1, v.v.). Xem Phân biệt các lần lặp lại thử nghiệm bằng cách sử dụng các phép trừ để biết phiên bản đầy đủ của ví dụ này. (Được đóng góp bởi Antoine Pitrou trong bpo-16997.)

unittest.main() hiện chấp nhận nhiều tên thử nghiệm lặp lại cho defaultTest, trong đó trước đây nó chỉ chấp nhận một tên thử nghiệm duy nhất dưới dạng chuỗi. (Được đóng góp bởi Jyrki Pulliainen trong bpo-15132.)

Nếu SkipTest được nêu ra trong quá trình khám phá thử nghiệm (nghĩa là ở cấp độ mô-đun trong tệp thử nghiệm), thì hiện tại nó được báo cáo là bỏ qua thay vì lỗi. (Được đóng góp bởi Zach Ware trong bpo-16935.)

discover() hiện sắp xếp các tệp được phát hiện để cung cấp thứ tự kiểm tra nhất quán. (Được đóng góp bởi Martin Melin và Jeff Ramnani trong bpo-16709.)

TestSuite hiện sẽ loại bỏ các tham chiếu đến các bài kiểm tra ngay khi quá trình kiểm tra được chạy, nếu kiểm tra thành công. Trên các trình thông dịch Python thực hiện thu thập rác, điều này cho phép các bài kiểm tra được thu thập rác nếu không có gì khác chứa tham chiếu đến bài kiểm tra. Có thể ghi đè hành vi này bằng cách tạo một lớp con TestSuite xác định phương thức _removeTestAtIndex tùy chỉnh. (Được đóng góp bởi Tom Wardill, Matt McClure và Andrew Svetlov trong bpo-11798.)

Trình quản lý bối cảnh xác nhận thử nghiệm mới, assertLogs(), sẽ đảm bảo rằng một khối mã nhất định sẽ phát ra thông báo tường trình bằng mô-đun logging. Theo mặc định, thông báo có thể đến từ bất kỳ trình ghi nhật ký nào và có mức độ ưu tiên là INFO trở lên, nhưng cả tên trình ghi nhật ký và mức ghi nhật ký tối thiểu thay thế đều có thể được chỉ định. Đối tượng được trình quản lý bối cảnh trả về có thể được truy vấn về các thông báo LogRecords và/hoặc được định dạng đã được ghi lại. (Được đóng góp bởi Antoine Pitrou trong bpo-18937.)

Khám phá thử nghiệm hiện hoạt động với các gói không gian tên (Được đóng góp bởi Claudiu Popa trong bpo-17457.)

Các đối tượng unittest.mock hiện kiểm tra chữ ký thông số kỹ thuật của chúng khi khớp các lệnh gọi, điều đó có nghĩa là một đối số hiện có thể được khớp theo vị trí hoặc tên, thay vì chỉ theo vị trí. (Được đóng góp bởi Antoine Pitrou trong bpo-17015.)

Các đối tượng mock_open() hiện có các phương thức readlinereadlines. (Được đóng góp bởi Toshio Kuratomi trong bpo-17467.)

venv

venv hiện bao gồm các tập lệnh kích hoạt cho shell cshfish. (Được đóng góp bởi Andrew Svetlov trong bpo-15417.)

EnvBuilder và hàm tiện lợi create() lấy một đối số từ khóa mới with_pip, mặc định là False, để kiểm soát xem EnvBuilder có đảm bảo rằng pip được cài đặt trong môi trường ảo hay không. (Được đóng góp bởi Nick Coghlan trong bpo-19552 như một phần của quá trình triển khai PEP 453.)

làn sóng

Phương thức getparams() hiện trả về một bộ có tên thay vì một bộ đơn giản. (Được đóng góp bởi Claudiu Popa trong bpo-17487.)

wave.open() hiện hỗ trợ giao thức quản lý ngữ cảnh. (Được đóng góp bởi Claudiu Popa trong bpo-17616.)

wave bây giờ có thể write output to unseekable files. (Được đóng góp bởi David Jones, Guilherme Polo và Serhiy Storchaka trong bpo-5202.)

Các phương thức writeframesraw()writeframes() hiện chấp nhận mọi bytes-like object. (Được đóng góp bởi Serhiy Storchaka trong bpo-8311.)

điểm yếu

Lớp WeakMethod mới mô phỏng các tham chiếu yếu đến các phương thức bị ràng buộc. (Được đóng góp bởi Antoine Pitrou trong bpo-14631.)

Lớp finalize mới cho phép đăng ký một lệnh gọi lại để gọi khi một đối tượng được thu gom rác mà không cần quản lý cẩn thận vòng đời của chính tham chiếu yếu. (Được đóng góp bởi Richard Oudkerk trong bpo-15528.)

Lệnh gọi lại, nếu có, được liên kết với ref hiện được hiển thị thông qua thuộc tính __callback__. (Được đóng góp bởi Mark Dickinson trong bpo-17643.)

xml.etree

Trình phân tích cú pháp mới, XMLPullParser, cho phép các ứng dụng không chặn phân tích các tài liệu XML. Một ví dụ có thể được nhìn thấy tại Kéo API để phân tích cú pháp không chặn. (Được đóng góp bởi Antoine Pitrou trong bpo-17741.)

Các hàm xml.etree.ElementTree tostring()tostringlist() cũng như phương thức ElementTree write() hiện có short_empty_elements keyword-only parameter cung cấp quyền kiểm soát xem các phần tử không có nội dung được viết ở dạng viết tắt (<tag />) hay mở rộng (<tag></tag>). (Được đóng góp bởi Ariel Poliak và Serhiy Storchaka trong bpo-14377.)

tập tin zip

Phương thức writepy() của lớp PyZipFile có tùy chọn filterfunc mới có thể được sử dụng để kiểm soát thư mục và tệp nào được thêm vào kho lưu trữ. Ví dụ: điều này có thể được sử dụng để loại trừ các tệp thử nghiệm khỏi kho lưu trữ. (Được đóng góp bởi Christian Tismer trong bpo-19274.)

Tham số allowZip64 cho ZipFilePyZipFile hiện tại là True theo mặc định. (Được đóng góp bởi William Mallard trong bpo-17201.)

Thay đổi triển khai CPython

PEP 445: Tùy chỉnh bộ cấp phát bộ nhớ CPython

PEP 445 bổ sung các giao diện cấp độ C mới để tùy chỉnh việc phân bổ bộ nhớ trong trình thông dịch CPython.

Xem thêm

PEP 445 -- Thêm API mới để tùy chỉnh bộ cấp phát bộ nhớ Python

PEP được viết và triển khai bởi Victor Stinner.

PEP 442: Hoàn thiện đối tượng an toàn

PEP 442 loại bỏ các hạn chế và nhược điểm hiện tại của việc hoàn thiện đối tượng trong CPython. Với nó, các đối tượng có phương thức __del__(), cũng như các trình tạo có mệnh đề finally, có thể được hoàn thiện khi chúng là một phần của chu trình tham chiếu.

Là một phần của thay đổi này, các phần tổng thể của mô-đun không còn bị buộc phải đặt thành None trong khi tắt trình thông dịch trong hầu hết các trường hợp, thay vào đó dựa vào hoạt động bình thường của trình thu gom rác tuần hoàn. Điều này tránh được toàn bộ loại lỗi thời gian tắt trình thông dịch, thường liên quan đến các phương thức __del__, đã gây khó khăn cho Python kể từ khi GC tuần hoàn được giới thiệu lần đầu tiên.

Xem thêm

PEP 442 -- Quyết toán đối tượng an toàn

PEP được viết và triển khai bởi Antoine Pitrou.

PEP 456: Thuật toán băm an toàn và có thể hoán đổi cho nhau

PEP 456 tiếp nối công việc sửa lỗi bảo mật trước đó được thực hiện trên thuật toán băm của Python để giải quyết một số cuộc tấn công DOS nhất định mà các API công khai được hỗ trợ bởi tra cứu từ điển có thể phải đối mặt. (Xem bpo-14621 để bắt đầu vòng cải tiến hiện tại.) PEP hợp nhất mã băm của CPython để giúp trình đóng gói thay thế thuật toán băm khác dễ dàng hơn và chuyển cách triển khai mặc định của Python sang triển khai SipHash trên nền tảng có loại dữ liệu 64 bit. Mọi khác biệt về hiệu suất so với thuật toán FNV cũ hơn đều không đáng kể.

PEP thêm các trường bổ sung vào bộ dữ liệu có tên sys.hash_info để mô tả thuật toán băm được sử dụng bởi tệp nhị phân hiện đang thực thi. Mặt khác, PEP không thay đổi bất kỳ API CPython hiện có nào.

PEP 436: Phòng khám tranh luận

"Phòng khám đối số" (PEP 436) hiện là một phần của quy trình xây dựng CPython và có thể được sử dụng để đơn giản hóa quy trình xác định và duy trì chữ ký chính xác cho nội trang và mô-đun mở rộng thư viện tiêu chuẩn được triển khai trong C.

Một số mô-đun mở rộng thư viện tiêu chuẩn đã được chuyển đổi để sử dụng Argument Clinic trong Python 3.4, đồng thời pydocinspect cũng đã được cập nhật tương ứng.

Dự kiến, siêu dữ liệu chữ ký để xem xét nội tâm theo chương trình sẽ được thêm vào các lệnh gọi bổ sung được triển khai trong C như một phần của bản phát hành bảo trì Python 3.4.

Ghi chú

Phòng khám Lập luận PEP không được cập nhật đầy đủ về trạng thái triển khai. Điều này đã được người quản lý phát hành và nhóm phát triển cốt lõi coi là chấp nhận được trong trường hợp này, vì Argument Clinic sẽ không được cung cấp dưới dạng API công khai để bên thứ ba sử dụng trong Python 3.4.

Xem thêm

PEP 436 -- Phòng khám tranh luận DSL

PEP được viết và triển khai bởi Larry Hastings.

Các thay đổi khác về Build và C API

  • Chức năng PyType_GetSlot() mới đã được thêm vào ABI ổn định, cho phép truy xuất các con trỏ hàm từ các khe loại được đặt tên khi sử dụng API giới hạn. (Được đóng góp bởi Martin von Löwis trong bpo-17162.)

  • Quá trình khởi tạo trước Py_SetStandardStreamEncoding() API mới cho phép các ứng dụng nhúng trình thông dịch CPython buộc một trình xử lý lỗi và mã hóa cụ thể cho các luồng tiêu chuẩn một cách đáng tin cậy. (Được đóng góp bởi Bastien Montagne và Nick Coghlan trong bpo-16129.)

  • Hầu hết các API Python C không thay đổi đối số chuỗi hiện được đánh dấu chính xác là chấp nhận const char * thay vì char *. (Được đóng góp bởi Serhiy Storchaka trong bpo-1772673.)

  • Phiên bản shell mới của python-config có thể được sử dụng ngay cả khi không có trình thông dịch python (ví dụ: trong các tình huống biên dịch chéo).

  • PyUnicode_FromFormat() hiện hỗ trợ các thông số kỹ thuật về chiều rộng và độ chính xác cho %s, %A, %U, %V, %S%R. (Được đóng góp bởi Ysj Ray và Victor Stinner trong bpo-7330.)

  • Chức năng mới PyStructSequence_InitType2() bổ sung cho chức năng PyStructSequence_InitType() hiện có. Sự khác biệt là nó trả về 0 nếu thành công và -1 nếu thất bại.

  • Nguồn CPython hiện có thể được biên dịch bằng cách sử dụng tính năng kiểm tra độ chính xác của địa chỉ của các phiên bản gần đây của GCC và clang: các cảnh báo sai trong bộ cấp phát đối tượng nhỏ đã bị tắt tiếng. (Được đóng góp bởi Dhiru Kholia trong bpo-18596.)

  • Bản dựng Windows hiện sử dụng Address Space Layout RandomizationData Execution Prevention. (Được đóng góp bởi Christian Heimes trong bpo-16632.)

  • Chức năng mới PyObject_LengthHint() là C API tương đương với operator.length_hint(). (Được đóng góp bởi Armin Ronacher trong bpo-16148.)

Những cải tiến khác

  • Lệnh python có một option mới, -I, khiến lệnh này chạy ở "chế độ biệt lập", có nghĩa là sys.path không chứa thư mục của tập lệnh cũng như thư mục site-packages của người dùng và tất cả các biến môi trường PYTHON* đều bị bỏ qua (ngụ ý cả -s-E). Các hạn chế khác cũng có thể được áp dụng trong tương lai, với mục tiêu là tách biệt việc thực thi tập lệnh khỏi môi trường của người dùng. Điều này phù hợp, chẳng hạn như khi Python được sử dụng để chạy tập lệnh hệ thống. Trên hầu hết các hệ thống POSIX, nó có thể và nên được sử dụng trong dòng tập lệnh hệ thống #!. (Được đóng góp bởi Christian Heimes trong bpo-16499.)

  • Tính năng hoàn thành tab hiện được bật theo mặc định trong trình thông dịch tương tác trên các hệ thống hỗ trợ readline. Lịch sử cũng được bật theo mặc định và được ghi vào (và đọc từ) tệp ~/.python-history. (Được đóng góp bởi Antoine Pitrou và Éric Araujo trong bpo-5845.)

  • Việc gọi trình thông dịch Python bằng --version hiện xuất phiên bản thành đầu ra tiêu chuẩn thay vì lỗi tiêu chuẩn (bpo-18338). Những thay đổi tương tự cũng được thực hiện đối với argparse (bpo-18920) và các mô-đun khác có khả năng gọi giống như tập lệnh (bpo-18922).

  • Trình cài đặt CPython Windows hiện thêm .py vào biến PATHEXT khi tiện ích mở rộng được đăng ký, cho phép người dùng chạy tập lệnh python tại dấu nhắc lệnh của windows bằng cách chỉ cần nhập tên của nó mà không cần tiện ích mở rộng .py. (Được đóng góp bởi Paul Moore trong bpo-18569.)

  • Mục tiêu make mới coverage-report sẽ xây dựng python, chạy bộ thử nghiệm và tạo báo cáo phạm vi bảo hiểm HTML cho cơ sở mã C bằng cách sử dụng gcovlcov.

  • Tùy chọn -R cho python regression test suite hiện cũng kiểm tra rò rỉ phân bổ bộ nhớ bằng cách sử dụng sys.getallocatedblocks(). (Được đóng góp bởi Antoine Pitrou trong bpo-13390.)

  • python -m hiện hoạt động với các gói không gian tên.

  • Mô-đun stat hiện được triển khai trong C, có nghĩa là nó nhận các giá trị cho các hằng số từ tệp tiêu đề C, thay vì có các giá trị được mã hóa cứng trong mô-đun python như trường hợp trước đây.

  • Đang tải nhiều mô-đun python từ một mô-đun hệ điều hành duy nhất (.so, .dll) hiện hoạt động chính xác (trước đây nó đã âm thầm trả về mô-đun python đầu tiên trong tệp). (Được đóng góp bởi Václav Šmilauer trong bpo-16421.)

  • Một opcode mới, LOAD_CLASSDEREF, đã được thêm vào để sửa lỗi trong quá trình tải các biến miễn phí trong nội dung lớp có thể được kích hoạt bởi một số cách sử dụng nhất định của __prepare__. (Được đóng góp bởi Benjamin Peterson trong bpo-17853.)

  • Một số sự cố liên quan đến MemoryError đã được Victor Stinner xác định và khắc phục bằng cách sử dụng công cụ pyfailmalloc dựa trên PEP 445 của mình (bpo-18408, bpo-18520).

  • Lệnh pyvenv hiện chấp nhận tùy chọn --copies để sử dụng các bản sao thay vì liên kết tượng trưng ngay cả trên các hệ thống có liên kết tượng trưng là mặc định. (Được đóng góp bởi Vinay Sajip trong bpo-18807.)

  • Lệnh pyvenv cũng chấp nhận tùy chọn --without-pip để ngăn chặn quá trình khởi động tự động của pip vào môi trường ảo. (Được đóng góp bởi Nick Coghlan trong bpo-19552 như một phần của quá trình triển khai PEP 453.)

  • Tên mã hóa hiện là tùy chọn trong giá trị được đặt cho biến môi trường PYTHONIOENCODING. Điều này giúp bạn chỉ có thể đặt trình xử lý lỗi mà không thay đổi mã hóa mặc định. (Được đóng góp bởi Serhiy Storchaka trong bpo-18818.)

  • Các chức năng open của mô-đun bz2, lzmagzip hiện hỗ trợ chế độ x (tạo độc quyền). (Được đóng góp bởi Tim Heaney và Vajrasky Kok trong bpo-19201, bpo-19222bpo-19223.)

Tối ưu hóa đáng kể

  • Bộ giải mã UTF-32 hiện nhanh hơn gấp 3 đến 4 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-14625.)

  • Chi phí va chạm băm cho các bộ hiện đã giảm. Giờ đây, mỗi đầu dò bảng băm sẽ kiểm tra một loạt các cặp khóa/băm liền kề, liên tiếp trước khi tiếp tục thực hiện các thăm dò ngẫu nhiên thông qua bảng băm. Điều này khai thác vị trí bộ đệm để làm cho việc giải quyết xung đột ít tốn kém hơn. Sơ đồ giải quyết xung đột có thể được mô tả như là sự kết hợp giữa thăm dò tuyến tính và địa chỉ mở. Số lượng đầu dò tuyến tính bổ sung được mặc định là chín. Điều này có thể được thay đổi tại thời điểm biên dịch bằng cách xác định LINEAR_PROBES là bất kỳ giá trị nào. Đặt LINEAR_PROBES=0 để tắt hoàn toàn việc thăm dò tuyến tính. (Được đóng góp bởi Raymond Hettinger trong bpo-18771.)

  • Trình thông dịch bắt đầu nhanh hơn khoảng 30%. Một vài biện pháp dẫn đến tăng tốc. Trình thông dịch tải ít mô-đun hơn khi khởi động, ví dụ: các mô-đun re, collectionslocale và các phần phụ thuộc của chúng không còn được nhập theo mặc định nữa. Mô-đun soái ca đã được cải tiến để tải mã Python đã biên dịch nhanh hơn. (Được đóng góp bởi Antoine Pitrou, Christian Heimes và Victor Stinner trong bpo-19219, bpo-19218, bpo-19209, bpo-19205bpo-9548.)

  • bz2.BZ2File hiện nhanh hoặc nhanh hơn phiên bản Python2 trong hầu hết các trường hợp. lzma.LZMAFile cũng đã được tối ưu hóa. (Được đóng góp bởi Serhiy Storchaka và Nadeem Vawda trong bpo-16034.)

  • random.getrandbits() nhanh hơn 20%-40% đối với số nguyên nhỏ (trường hợp sử dụng phổ biến nhất). (Được đóng góp bởi Serhiy Storchaka trong bpo-16674.)

  • Bằng cách tận dụng định dạng lưu trữ mới cho chuỗi, việc xử lý chuỗi giờ đây nhanh hơn đáng kể. (Được đóng góp bởi Victor Stinner và Antoine Pitrou trong bpo-15596.)

  • Vấn đề về hiệu suất trong io.FileIO.readall() đã được giải quyết. Điều này đặc biệt ảnh hưởng đến Windows và tăng tốc đáng kể trường hợp truyền lượng dữ liệu đáng kể thông qua subprocess. (Được đóng góp bởi Richard Oudkerk trong bpo-15758.)

  • html.escape() hiện nhanh hơn gấp 10 lần. (Được đóng góp bởi Matt Bryant trong bpo-18020.)

  • Trên Windows, VirtualAlloc gốc hiện được sử dụng thay vì CRT malloc trong obmalloc. Điểm chuẩn nhân tạo cho thấy mức tiết kiệm bộ nhớ khoảng 3%.

  • os.urandom() hiện sử dụng bộ mô tả tệp liên tục được mở một cách lười biếng để tránh sử dụng nhiều bộ mô tả tệp khi chạy song song từ nhiều luồng. (Được đóng góp bởi Antoine Pitrou trong bpo-18756.)

Không được dùng nữa

Phần này bao gồm nhiều API và các tính năng khác không được dùng nữa trong Python 3.4 và sẽ bị xóa trong Python 3.5 trở lên. Trong hầu hết (nhưng không phải tất cả) trường hợp, việc sử dụng các API không được dùng nữa sẽ tạo ra DeprecationWarning khi trình thông dịch chạy với cảnh báo không được dùng nữa (ví dụ: bằng cách sử dụng -Wd).

Ngừng sử dụng trong Python API

  • Như đã đề cập trong PEP 451: Loại ModuleSpec cho Hệ thống Nhập, một số phương thức và hàm importlib không được dùng nữa: importlib.find_loader() được thay thế bằng importlib.util.find_spec(); importlib.machinery.PathFinder.find_module() được thay thế bằng importlib.machinery.PathFinder.find_spec(); importlib.abc.MetaPathFinder.find_module() được thay thế bằng importlib.abc.MetaPathFinder.find_spec(); importlib.abc.PathEntryFinder.find_loader()find_module() được thay thế bằng importlib.abc.PathEntryFinder.find_spec(); tất cả các phương thức xxxLoader ABC load_module (importlib.abc.Loader.load_module(), importlib.abc.InspectLoader.load_module(), importlib.abc.FileLoader.load_module(), importlib.abc.SourceLoader.load_module()) sẽ không còn được triển khai nữa, thay vào đó, trình tải nên triển khai phương thức exec_module (importlib.abc.Loader.exec_module(), importlib.abc.InspectLoader.exec_module() importlib.abc.SourceLoader.exec_module()) và để hệ thống nhập lo phần còn lại; và importlib.abc.Loader.module_repr(), importlib.util.module_for_loader(), importlib.util.set_loader()importlib.util.set_package() không còn cần thiết nữa vì chức năng của chúng hiện đã được hệ thống nhập tự động xử lý.

  • Mô-đun imp đang chờ ngừng hoạt động. Để duy trì khả năng tương thích với cơ sở mã Python 2/3, việc xóa mô-đun hiện chưa được lên lịch.

  • Mô-đun formatter đang chờ ngừng sử dụng và dự kiến sẽ bị xóa trong Python 3.6.

  • MD5digestmod mặc định cho hàm hmac.new() không được dùng nữa. Python 3.6 sẽ yêu cầu tên hoặc hàm tạo rõ ràng làm đối số digestmod.

  • Lớp Netrc nội bộ trong mô-đun ftplib đã được ghi nhận là không được dùng nữa trong chuỗi tài liệu của nó trong một thời gian. Bây giờ nó phát ra DeprecationWarning và sẽ bị xóa hoàn toàn trong Python 3.5.

  • Đối số endtime không có giấy tờ cho subprocess.Popen.wait() lẽ ra không bị lộ và hy vọng là không được sử dụng; nó không được dùng nữa và rất có thể sẽ bị xóa trong Python 3.5.

  • Đối số strict của HTMLParser không được dùng nữa.

  • Các hàm plistlib readPlist(), writePlist(), readPlistFromBytes()writePlistToBytes() không được dùng nữa mà thay vào đó là các hàm mới tương ứng load(), dump(), loads()dumps(). Data() không được dùng nữa mà chỉ sử dụng hàm tạo bytes.

  • Khóa sysconfig SO không được dùng nữa và đã được thay thế bằng EXT_SUFFIX.

  • Chế độ U được nhiều chức năng open chấp nhận không còn được dùng nữa. Trong Python3, nó không làm được điều gì hữu ích và nên được thay thế bằng cách sử dụng thích hợp io.TextIOWrapper (nếu cần) và đối số newline của nó.

  • Đối số parser của xml.etree.ElementTree.iterparse() không được dùng nữa, cũng như đối số html của XMLParser(). Để chuẩn bị cho việc loại bỏ cái sau, tất cả các đối số của XMLParser phải được chuyển theo từ khóa.

Tính năng không được dùng nữa

  • Việc chạy IDLE --- Trình soạn thảo và shell Python với cờ -n (không có quy trình con) không được dùng nữa. Tuy nhiên, tính năng này sẽ không bị xóa cho đến khi bpo-18823 được giải quyết.

  • Mô-đun trang web thêm thư mục "site-python" vào sys.path, nếu nó tồn tại, sẽ không được dùng nữa (bpo-19375).

Đã xóa

Hệ điều hành không còn được hỗ trợ

Hỗ trợ cho các hệ điều hành sau đã bị xóa khỏi nguồn và công cụ xây dựng:

  • OS/2 (bpo-16135).

  • Windows 2000 (bộ thay đổi e52df05b496a).

  • Các hệ thống Windows nơi COMSPEC trỏ tới command.com (bpo-14470).

  • VMS (bpo-16136).

API và loại bỏ tính năng

Các API và tính năng lỗi thời và không được dùng nữa sau đây đã bị xóa:

  • Các thư mục Misc/TextMateMisc/vim không được bảo trì đã bị xóa (xem devguide để biết gợi ý về những gì nên sử dụng thay thế).

  • Macro tạo tệp SO bị xóa (nó được thay thế bằng macro SHLIB_SUFFIXEXT_SUFFIX) (bpo-16754).

  • Trường PyThreadState.tick_counter đã bị xóa; giá trị của nó đã trở nên vô nghĩa kể từ Python 3.2, khi "GIL mới" được giới thiệu (bpo-19199).

  • PyLoaderPyPycLoader đã bị xóa khỏi importlib. (Được đóng góp bởi Taras Lyapun trong bpo-15641.)

  • Đối số strict cho HTTPConnectionHTTPSConnection đã bị xóa. "Phản hồi đơn giản" kiểu HTTP 0.9 không còn được hỗ trợ.

  • Các phương thức getter và setter urllib.request.Request không được dùng nữa add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_hostis_unverifiable đã bị xóa (thay vào đó hãy sử dụng quyền truy cập thuộc tính trực tiếp).

  • Hỗ trợ tải TYPE_INT64 không được dùng nữa đã bị xóa khỏi marshal. (Được đóng góp bởi Dan Riti trong bpo-15480.)

  • inspect.Signature: các tham số chỉ có vị trí hiện được yêu cầu phải có tên hợp lệ.

  • object.__format__() không còn chấp nhận các chuỗi định dạng không trống nữa, thay vào đó, nó sẽ tăng TypeError. Việc sử dụng chuỗi không trống đã không được dùng nữa kể từ Python 3.2. Thay đổi này được thực hiện để ngăn chặn trường hợp mã hoạt động trước đó (nhưng không chính xác) bắt đầu bị lỗi nếu một đối tượng nhận được phương thức __format__, nghĩa là mã của bạn hiện có thể tăng TypeError nếu bạn đang sử dụng mã định dạng 's' với các đối tượng không có phương thức __format__ xử lý mã đó. Xem bpo-7994 để biết thông tin cơ bản.

  • difflib.SequenceMatcher.isbjunk()difflib.SequenceMatcher.isbpopular() không được dùng nữa trong phiên bản 3.2 và hiện đã bị xóa: sử dụng x in sm.bjunkx in sm.bpopular, trong đó sm là đối tượng SequenceMatcher (bpo-13248).

Dọn dẹp mã

  • Lớp Scanner nội bộ không được sử dụng và không có giấy tờ đã bị xóa khỏi mô-đun pydoc.

  • Mô-đun _gestalt riêng tư và không được sử dụng hiệu quả đã bị xóa, cùng với các chức năng platform riêng tư _mac_ver_lookup, _mac_ver_gstalt_bcd2str, vốn chỉ được gọi trên các hệ thống OSX bị hỏng nặng (xem bpo-18393).

  • Các bản sao được mã hóa cứng của các hằng số stat nhất định có trong không gian tên mô-đun tarfile đã bị xóa.

Chuyển sang Python 3.4

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 lệnh 'python'

  • Trong shell posix, việc đặt biến môi trường PATH thành giá trị trống tương đương với việc không đặt biến nào cả. Tuy nhiên, việc đặt PYTHONPATH thành một giá trị trống là not tương đương với việc không đặt nó: đặt PYTHONPATH thành một giá trị trống tương đương với việc đặt nó thành ., điều này dẫn đến nhầm lẫn khi suy luận bằng cách tương tự với cách hoạt động của PATH. Hành vi hiện tuân theo quy ước posix cho PATH.

  • Đầu ra [X refs, Y Blocks] của bản dựng gỡ lỗi (--with-pydebug) của trình thông dịch CPython hiện bị tắt theo mặc định. Nó có thể được kích hoạt lại bằng tùy chọn -X showrefcount. (Được đóng góp bởi Ezio Melotti trong bpo-17323.)

  • Lệnh python và hầu hết các tập lệnh stdlib (cũng như argparse) hiện xuất thông tin --version thành stdout thay vì stderr (để biết danh sách vấn đề, hãy xem Những cải tiến khác ở trên).

Những thay đổi trong Python API

  • Các ABC được xác định trong importlib.abc hiện đưa ra ngoại lệ thích hợp hoặc trả về giá trị mặc định thay vì tăng NotImplementedError một cách mù quáng. Điều này sẽ chỉ ảnh hưởng đến việc gọi mã super() và chuyển sang ABC. Để tương thích, hãy bắt cả NotImplementedError hoặc ngoại lệ thích hợp nếu cần.

  • Loại mô-đun hiện khởi tạo các thuộc tính __package____loader__ thành None theo mặc định. Để xác định xem các thuộc tính này có được đặt theo kiểu tương thích ngược hay không, hãy sử dụng ví dụ: getattr(module, '__loader__', None) is not None. (bpo-17115.)

  • importlib.util.module_for_loader() hiện đặt __loader____package__ vô điều kiện để hỗ trợ tải lại đúng cách. Nếu không muốn điều này thì bạn sẽ cần phải đặt các thuộc tính này theo cách thủ công. Bạn có thể sử dụng importlib.util.module_to_load() để quản lý mô-đun.

  • Nhập hiện đặt lại các thuộc tính có liên quan (ví dụ: __name__, __loader__, __package__, __file__, __cached__) vô điều kiện khi tải lại. Lưu ý rằng điều này khôi phục hành vi trước 3.3 theo nghĩa là mô-đun được tìm thấy lại khi được tải lại (bpo-19413).

  • Các gói đông lạnh không còn đặt __path__ vào danh sách chứa tên gói nữa mà giờ đây chúng đặt nó vào danh sách trống. Hành vi trước đó có thể khiến hệ thống nhập thực hiện sai thao tác nhập mô-đun con nếu cũng có thư mục có cùng tên với gói cố định. Cách chính xác để xác định xem mô-đun có phải là gói hay không là sử dụng hasattr(module, '__path__') (bpo-18065).

  • Các mô-đun cố định không còn xác định thuộc tính __file__ nữa. Về mặt ngữ nghĩa, việc đặt thuộc tính cho các mô-đun cố định là không chính xác về mặt ngữ nghĩa vì chúng không được tải từ bất kỳ vị trí rõ ràng nào. Nếu bạn phải biết rằng một mô-đun đến từ mã bị đóng băng thì bạn có thể xem liệu __spec__.location của mô-đun có được đặt thành 'frozen' hay không, kiểm tra xem trình tải có phải là lớp con của importlib.machinery.FrozenImporter hay không, hoặc nếu cần khả năng tương thích Python 2, bạn có thể sử dụng imp.is_frozen().

  • py_compile.compile() bây giờ sẽ tăng FileExistsError nếu đường dẫn tệp mà nó ghi vào là một liên kết tượng trưng hoặc một tệp không thông thường. Điều này nhằm cảnh báo rằng quá trình nhập sẽ ghi đè các tệp đó bằng một tệp thông thường bất kể chúng là loại đường dẫn tệp ban đầu nào.

  • importlib.abc.SourceLoader.get_source() không còn tăng ImportError khi mã nguồn đang được tải kích hoạt SyntaxError hoặc UnicodeDecodeError. Vì ImportError chỉ được nâng lên khi không thể tìm thấy mã nguồn nhưng nó phải như vậy, nên người ta cảm thấy nó đã vượt quá/quá tải ý nghĩa đó khi mã nguồn được tìm thấy nhưng có cấu trúc không đúng. Nếu trước đây bạn đã gặp phải lỗi ImportError và muốn tiếp tục bỏ qua các vấn đề về cú pháp hoặc giải mã, hãy nắm bắt cả ba ngoại lệ ngay bây giờ.

  • functools.update_wrapper()functools.wraps() hiện đã đặt chính xác thuộc tính __wrapped__ cho hàm đang được gói, ngay cả khi hàm đó cũng đã đặt thuộc tính __wrapped__. Điều này có nghĩa là các thuộc tính __wrapped__ hiện liên kết chính xác một chồng các hàm được trang trí thay vì mọi thuộc tính __wrapped__ trong chuỗi tham chiếu đến hàm trong cùng. Các thư viện xem xét nội tâm cho rằng hành vi trước đó là có chủ ý có thể sử dụng inspect.unwrap() để truy cập hàm đầu tiên trong chuỗi không có thuộc tính __wrapped__.

  • inspect.getfullargspec() đã được triển khai lại trên inspect.signature() và do đó xử lý nhiều đối tượng có thể gọi được hơn nhiều so với trước đây. Dự kiến ​​​​các lệnh gọi mô-đun mở rộng và dựng sẵn bổ sung sẽ nhận được siêu dữ liệu chữ ký trong suốt chuỗi Python 3.4. Mã giả định rằng inspect.getfullargspec() sẽ không thành công trên các lệnh gọi không phải Python có thể cần phải được điều chỉnh cho phù hợp.

  • importlib.machinery.PathFinder hiện chuyển thư mục làm việc hiện tại tới các đối tượng trong sys.path_hooks cho chuỗi trống. Điều này dẫn đến sys.path_importer_cache không bao giờ chứa '', do đó việc lặp qua sys.path_importer_cache dựa trên sys.path sẽ không tìm thấy tất cả các khóa. __file__ của mô-đun khi được nhập vào thư mục làm việc hiện tại giờ đây cũng sẽ có đường dẫn tuyệt đối, kể cả khi sử dụng -m với trình thông dịch (ngoại trừ __main__.__file__ khi tập lệnh được thực thi trực tiếp bằng đường dẫn tương đối) (Được đóng góp bởi Brett Cannon trong bpo-18416). được chỉ định trên dòng lệnh) (bpo-18416).

  • Việc loại bỏ đối số strict thành HTTPConnectionHTTPSConnection sẽ thay đổi ý nghĩa của các đối số còn lại nếu bạn chỉ định chúng theo vị trí thay vì theo từ khóa. Nếu bạn chú ý đến cảnh báo không dùng nữa, mã của bạn hẳn đã chỉ định bất kỳ đối số bổ sung nào thông qua từ khóa.

  • Các chuỗi giữa các câu lệnh from __future__ import ... bây giờ always sẽ tạo ra SyntaxError. Trước đây, nếu không có chuỗi tài liệu ở đầu thì đôi khi chuỗi quảng cáo xen kẽ sẽ bị bỏ qua. Điều này làm cho CPython tuân thủ thông số ngôn ngữ; Jython và PyPy đã có rồi. (bpo-17434).

  • ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake() hiện tăng OSError với ENOTCONN khi SSLSocket không được kết nối, thay vì hành vi trước đây là tăng AttributeError. Ngoài ra, getpeercert() sẽ raise ValueError nếu việc bắt tay chưa được thực hiện.

  • base64.b32decode() hiện tăng binascii.Error khi chuỗi đầu vào chứa các ký tự không phải bảng chữ cái b32, thay vì TypeError. TypeError cụ thể này đã bị bỏ sót khi các TypeError khác được chuyển đổi. (Được đóng góp bởi Serhiy Storchaka trong bpo-18011.) Lưu ý: thay đổi này cũng vô tình được áp dụng trong Python 3.3.3.

  • Thuộc tính file hiện được tự động đóng khi phiên bản cgi.FieldStorage tạo được thu thập rác. Nếu bạn đang kéo đối tượng tệp ra khỏi phiên bản cgi.FieldStorage và không giữ phiên bản đó tồn tại thì bạn nên lưu trữ toàn bộ phiên bản cgi.FieldStorage hoặc đọc nội dung của tệp trước khi phiên bản cgi.FieldStorage được thu thập rác.

  • Việc gọi read hoặc write trên ổ cắm SSL đã đóng giờ đây sẽ hiển thị một ValueError mang tính thông tin thay vì AttributeError (bpo-9177) bí ẩn hơn trước đây.

  • slice.indices() không còn tạo ra OverflowError cho các giá trị lớn nữa. Do hậu quả của việc sửa lỗi này, slice.indices() hiện tăng ValueError nếu có độ dài âm; trước đó nó trả về các giá trị vô nghĩa (bpo-14794).

  • Hàm tạo complex, không giống như các hàm cmath, đã chấp nhận không chính xác các giá trị float nếu phương thức đặc biệt __complex__ của đối tượng trả về một giá trị. Điều này bây giờ làm tăng TypeError. (bpo-16290.)

  • Hàm tạo int trong 3.2 và 3.3 chấp nhận sai các giá trị float cho tham số base. Có vẻ như không có ai đã làm điều này, nhưng nếu vậy thì giờ đây nó sẽ tăng TypeError (bpo-16772).

  • Mặc định cho các đối số chỉ từ khóa hiện được đánh giá mặc định after cho các đối số từ khóa thông thường, thay vì trước đây. Hy vọng rằng không ai viết bất kỳ mã nào phụ thuộc vào hành vi lỗi trước đó (bpo-16967).

  • Trạng thái luồng cũ hiện đã bị xóa sau fork(). Điều này có thể khiến một số tài nguyên hệ thống được giải phóng mà trước đó đã được giữ tồn tại vĩnh viễn một cách không chính xác (ví dụ: các kết nối cơ sở dữ liệu được lưu giữ trong bộ lưu trữ cục bộ theo luồng). (bpo-17094.)

  • Tên tham số trong các ký tự __annotations__ hiện được đọc sai chính xác, tương tự như __kwdefaults__. (Được đóng góp bởi Yury Selivanov trong bpo-20625.)

  • hashlib.hash.name hiện luôn trả về mã định danh bằng chữ thường. Trước đây một số hàm băm dựng sẵn có tên viết hoa, nhưng giờ đây nó là giao diện công cộng chính thức nên việc đặt tên đã được nhất quán (bpo-18532).

  • unittest.TestSuite hiện loại bỏ các tham chiếu đến các thử nghiệm sau khi chạy, nên các khai thác thử nghiệm sử dụng lại TestSuite để chạy lại một loạt thử nghiệm có thể không thành công. Không nên sử dụng lại bộ thử nghiệm theo cách này vì điều đó có nghĩa là trạng thái được giữ lại giữa các lần chạy thử nghiệm, phá vỡ sự cô lập thử nghiệm mà unittest được thiết kế để cung cấp. Tuy nhiên, nếu việc thiếu sự cách ly được coi là có thể chấp nhận được thì hành vi cũ có thể được khôi phục bằng cách tạo một lớp con TestSuite xác định một phương thức _removeTestAtIndex không thực hiện gì cả (xem TestSuite.__iter__()) (bpo-11798).

  • unittest hiện sử dụng argparse để phân tích cú pháp dòng lệnh. Có một số dạng lệnh không hợp lệ đã từng hoạt động nhưng không còn được phép sử dụng nữa; về lý thuyết, điều này sẽ không gây ra vấn đề tương thích ngược vì các dạng lệnh không được phép không có ý nghĩa gì và khó có thể được sử dụng.

  • Các hàm re.split(), re.findall()re.sub() cũng như các phương thức group()groups() của đối tượng match giờ đây luôn trả về đối tượng bytes khi chuỗi được so khớp là bytes-like object. Trước đây, kiểu trả về khớp với kiểu đầu vào, vì vậy nếu mã của bạn phụ thuộc vào giá trị trả về, chẳng hạn như bytearray, thì bạn sẽ cần phải thay đổi mã của mình.

  • Các hàm audioop giờ đây sẽ phát sinh lỗi ngay lập tức nếu thông tin đầu vào chuỗi được truyền, thay vì bị lỗi ngẫu nhiên sau này (bpo-16685).

  • Đối số convert_charrefs mới cho HTMLParser hiện được mặc định là False để tương thích ngược nhưng cuối cùng sẽ được thay đổi thành mặc định thành True. Bạn nên thêm từ khóa này với giá trị thích hợp vào bất kỳ lệnh gọi HTMLParser nào trong mã của bạn (bpo-13633).

  • Vì đối số digestmod cho hàm hmac.new() trong tương lai sẽ không có giá trị mặc định nên tất cả các lệnh gọi tới hmac.new() phải được thay đổi để chỉ định rõ ràng một digestmod (bpo-17276).

  • Việc gọi sysconfig.get_config_var() bằng phím SO hoặc tra cứu SO trong kết quả của cuộc gọi tới sysconfig.get_config_vars() không được dùng nữa. Phím này nên được thay thế bằng EXT_SUFFIX hoặc SHLIB_SUFFIX, tùy thuộc vào ngữ cảnh (bpo-19555).

  • Mọi lệnh gọi tới các hàm open chỉ định U đều phải được sửa đổi. U không hiệu quả trong Python3 và cuối cùng sẽ phát sinh lỗi nếu được sử dụng. Tùy thuộc vào hàm, có thể đạt được hành vi tương đương với hành vi Python2 cũ của nó bằng cách sử dụng đối số newline hoặc nếu cần bằng cách gói luồng trong TextIOWrapper để sử dụng đối số newline (bpo-15204).

  • Nếu bạn sử dụng pyvenv trong tập lệnh và muốn cài đặt pip not, bạn phải thêm --without-pip vào lệnh gọi lệnh của mình.

  • Hành vi mặc định của json.dump()json.dumps() khi thụt lề được chỉ định đã thay đổi: nó không còn tạo ra dấu cách ở cuối sau mục ngăn cách dấu phẩy ở cuối dòng. Điều này sẽ chỉ quan trọng nếu bạn có các bài kiểm tra đang thực hiện so sánh phân biệt khoảng trắng của đầu ra đó (bpo-16333).

  • doctest hiện tìm kiếm doctest trong các chuỗi __doc__ của mô-đun mở rộng, vì vậy nếu khám phá kiểm tra doctest của bạn bao gồm các mô-đun mở rộng có những thứ trông giống doctest trong đó, bạn có thể thấy các lỗi kiểm tra mà bạn chưa từng thấy trước đây khi chạy kiểm tra của mình (bpo-3158).

  • Mô-đun collections.abc đã được tái cấu trúc một chút như một phần của cải tiến khởi động Python. Do đó, việc nhập collections tự động nhập collections.abc không còn nữa. Nếu chương trình của bạn phụ thuộc vào quá trình nhập ngầm định (không có giấy tờ), bạn sẽ cần thêm một import collections.abc (bpo-20784) rõ ràng.

Những thay đổi trong C API

  • PyEval_EvalFrameEx(), PyObject_Repr()PyObject_Str(), cùng với một số API C nội bộ khác, hiện bao gồm xác nhận gỡ lỗi để đảm bảo chúng không được sử dụng trong các tình huống mà chúng có thể âm thầm loại bỏ một ngoại lệ hiện đang hoạt động. Trong trường hợp việc loại bỏ ngoại lệ đang hoạt động được mong đợi và mong muốn (ví dụ: vì nó đã được lưu cục bộ bằng PyErr_Fetch() hoặc đang được cố tình thay thế bằng một ngoại lệ khác), sẽ cần một lệnh gọi PyErr_Clear() rõ ràng để tránh kích hoạt xác nhận khi gọi các thao tác này (trực tiếp hoặc gián tiếp) và chạy trên một phiên bản Python được biên dịch với các xác nhận được kích hoạt.

  • PyErr_SetImportError() hiện đặt TypeError khi đối số msg của nó không được đặt. Trước đây chỉ có NULL được trả về mà không có ngoại lệ nào được đặt ra.

  • Kết quả của lệnh gọi lại PyOS_ReadlineFunctionPointer bây giờ phải là một chuỗi được phân bổ bởi PyMem_RawMalloc() hoặc PyMem_RawRealloc() hoặc NULL nếu xảy ra lỗi, thay vì một chuỗi được phân bổ bởi PyMem_Malloc() hoặc PyMem_Realloc() (bpo-16742)

  • PyThread_set_key_value() bây giờ luôn đặt giá trị. Trong Python 3.3, hàm này không làm gì nếu khóa đã tồn tại (nếu giá trị hiện tại là con trỏ không phải NULL).

  • Trường f_tstate (trạng thái luồng) của cấu trúc PyFrameObject đã bị xóa để sửa lỗi: xem bpo-14432 để biết lý do.

Đã thay đổi trong 3.4.3

PEP 476: Bật xác minh chứng chỉ theo mặc định cho máy khách http stdlib

http.client và các mô-đun sử dụng nó, chẳng hạn như urllib.requestxmlrpc.client, giờ đây sẽ xác minh rằng máy chủ xuất trình chứng chỉ được CA ký trong kho tin cậy của nền tảng và tên máy chủ của nó khớp với tên máy chủ được yêu cầu theo mặc định, cải thiện đáng kể tính bảo mật cho nhiều ứng dụng.

Đối với các ứng dụng yêu cầu hành vi cũ trước đó, chúng có thể chuyển ngữ cảnh thay thế:

nhập urllib.request
nhập khẩu ssl

# This vô hiệu hóa tất cả xác minh
bối cảnh = ssl._create_unverified_context()

# This cho phép sử dụng chứng chỉ cụ thể cho máy chủ mà không cần
# to hãy vào cửa hàng ủy thác
bối cảnh = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)