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:
Newly created file descriptors are non-inheritable (PEP 446).
tùy chọn dòng lệnh cho isolated mode (bpo-16499).
improvements in the handling of codecs không phải là mã hóa văn bản (nhiều vấn đề).
A ModuleSpec Type cho Hệ thống nhập (PEP 451). (Ảnh hưởng đến tác giả nhập khẩu.)
Định dạng
marshalđã được tạo thành more compact and efficient (bpo-16475).
Các mô-đun thư viện mới:
asyncio: New provisional API for asynchronous IO (PEP 3156).selectors: High-level and efficient I/O multiplexing, được xây dựng dựa trên mô-đun nguyên thủyselect(một phần của PEP 3156).statistics: Một numerically stable statistics library cơ bản (PEP 450).
Các mô-đun thư viện được cải thiện đáng kể:
Single-dispatch generic functions trong
functools(PEP 443).Zz000zz protocol 4 (PEP 3154) mới.
multiprocessinghiện có an option to avoid using os.fork on Unix (bpo-8713).emailcó một mô-đun con mới,contentmanagervà một lớp conMessagemới (EmailMessage) là simplify MIME handling (bpo-18891).Các mô-đun
inspectvàpydochiện có khả năng xem xét nội tâm chính xác của nhiều đối tượng có thể gọi được rộng hơn nhiều, giúp cải thiện đầu ra của hệ thống Pythonhelp().Mô-đun
ipaddressAPI đã được tuyên bố là ổn định
Cải tiến bảo mật:
Make newly created file descriptors non-inheritable (PEP 446) để tránh rò rỉ bộ mô tả tệp cho các tiến trình con.
Tùy chọn dòng lệnh mới cho isolated mode, (bpo-16499).
multiprocessinghiện có an option to avoid using os.fork on Unix. spawn và forkserver an toàn hơn vì chúng tránh chia sẻ dữ liệu với các tiến trình con.Các tiến trình con
multiprocessingtrên Windows không còn kế thừa tất cả các thẻ điều khiển có thể kế thừa của cấp độ gốc mà chỉ kế thừa các thẻ điều khiển cần thiết.Chức năng
hashlib.pbkdf2_hmac()mới cung cấp PKCS#5 password-based key derivation function 2.Retrieving certificates from the Windows system cert store support cho
ssl.Lớp
ssl.SSLContextcó lot of improvements.Tất cả các mô-đun trong thư viện tiêu chuẩn hỗ trợ SSL hiện hỗ trợ xác minh chứng chỉ máy chủ, bao gồm khớp tên máy chủ (
ssl.match_hostname()) và CRL (danh sách Thu hồi chứng chỉ, xemssl.SSLContext.load_verify_locations()).
Cải tiến triển khai CPython:
Tận dụng PEP 442, trong hầu hết các trường hợp là module globals are no longer set to None during finalization (bpo-18214).
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 pipX và pipX.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 install và make 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 pip3 và pip3.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 Python và Phâ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 setuptools và Xâ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, bytes và bytearray 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() và 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, bytes và bytearray, 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", mã 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 mã hóa, giải mã
>>> mã hóa(b"xin chào", "hex")
b'68656c6c6f'
>>> giải mã(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ân và Chuyển đổi văn bản.
(Được đóng góp bởi Nick Coghlan trong bpo-7475, bpo-17827, bpo-17828 và bpo-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()và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
cp273mới của Đức. (Được đóng góp bởi Michael Bierenfeld và Andrew Kuchling trong bpo-1097797.)Zz000zz
cp1125tiế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
inthiệ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.)memoryviewhiện đã được đăng ký làSequencevà hỗ trợ nội dungreversed(). (Được đóng góp bởi Nick Coghlan và Claudiu Popa trong bpo-18690 và bpo-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ô-đuninspectvàpydoc.__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 ABC có ABCMeta 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() và 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ố encoding và errors, đượ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() và 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() và 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 và -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ố unixfrom và policy. 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 (EmailMessage và MIMEPart), 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 contentmanager và email: 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 digestmod là MD5 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_size và name (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 .
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() và 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à runpy và python -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-18929 và bpo-19030.)
getfullargspec() và 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.)
SocketHandler và DatagramHandler 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, spawn và forkserver, đã đượ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, yield và yield 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() và 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() và 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-13592 và bpo-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_RTTIME và RLIMIT_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_SWAP và RLIMIT_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() và 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 SMTPServer và SMTPChannel 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() và set_inheritable() của chúng.
Các hằng số socket.AF_* và 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() và 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ố database là uri (xem SQLite URI documentation). (Được đóng góp bởi poq trong bpo-13773.)
ssl¶
PROTOCOL_TLSv1_1 và PROTOCOL_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 cafile và capath 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() và 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, calIssuers và OCSP. (Đượ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_IFPORT và S_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() và 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() và 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-18585 và bpo-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 readline và readlines. (Đượ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 csh và fish. (Đượ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() và 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() và 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 ZipFile và PyZipFile 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 pydoc và inspect 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-configcó 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,%Svà%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ăngPyStructSequence_InitType()hiện có. Sự khác biệt là nó trả về0nếu thành công và-1nế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 Randomization và Data 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ớioperator.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.pathkhông chứa thư mục của tập lệnh cũng như thư mụcsite-packagescủa người dùng và tất cả các biến môi trườngPYTHON*đều bị bỏ qua (ngụ ý cả-svà-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
--versionhiệ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ớiargparse(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
.pyvào biếnPATHEXTkhi 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
makemớ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ụnggcovvà lcov.Tùy chọn
-Rcho python regression test suite hiện cũng kiểm tra rò rỉ phân bổ bộ nhớ bằng cách sử dụngsys.getallocatedblocks(). (Được đóng góp bởi Antoine Pitrou trong bpo-13390.)python -mhiện hoạt động với các gói không gian tên.Mô-đun
stathiệ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ụ
pyfailmallocdựa trên PEP 445 của mình (bpo-18408, bpo-18520).Lệnh
pyvenvhiệ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
pyvenvcũ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
opencủa mô-đunbz2,lzmavàgziphiệ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-19222 và bpo-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,collectionsvàlocalevà 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-19205 và bpo-9548.)bz2.BZ2Filehiện nhanh hoặc nhanh hơn phiên bản Python2 trong hầu hết các trường hợp.lzma.LZMAFilecũ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 quasubprocess. (Đượ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,
VirtualAllocgốc hiện được sử dụng thay vì CRTmalloctrongobmalloc. Đ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
importlibkhông được dùng nữa:importlib.find_loader()được thay thế bằngimportlib.util.find_spec();importlib.machinery.PathFinder.find_module()được thay thế bằngimportlib.machinery.PathFinder.find_spec();importlib.abc.MetaPathFinder.find_module()được thay thế bằngimportlib.abc.MetaPathFinder.find_spec();importlib.abc.PathEntryFinder.find_loader()vàfind_module()được thay thế bằngimportlib.abc.PathEntryFinder.find_spec(); tất cả các phương thứcxxxLoaderABCload_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ứcexec_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()và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.MD5vì digestmod mặc định cho hàmhmac.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
Netrcnội bộ trong mô-đunftplibđã đượ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 raDeprecationWarningvà 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
HTMLParserkhông được dùng nữa.Các hàm
plistlibreadPlist(),writePlist(),readPlistFromBytes()vàwritePlistToBytes()không được dùng nữa mà thay vào đó là các hàm mới tương ứngload(),dump(),loads()vàdumps().Data()không được dùng nữa mà chỉ sử dụng hàm tạobytes.Khóa
sysconfigSOkhông được dùng nữa và đã được thay thế bằngEXT_SUFFIX.Chế độ
Uđược nhiều chức năngopenchấ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ợpio.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ủaXMLParser(). Để chuẩn bị cho việc loại bỏ cái sau, tất cả các đối số củaXMLParserphả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:
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/TextMatevàMisc/vimkhô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
SObị xóa (nó được thay thế bằng macroSHLIB_SUFFIXvàEXT_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).PyLoadervàPyPycLoaderđã bị xóa khỏiimportlib. (Được đóng góp bởi Taras Lyapun trong bpo-15641.)Đối số strict cho
HTTPConnectionvàHTTPSConnectionđã 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.Requestkhông được dùng nữaadd_data,has_data,get_data,get_type,get_host,get_selector,set_proxy,get_origin_req_hostvàis_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_INT64không được dùng nữa đã bị xóa khỏimarshal. (Đượ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ăngTypeError. 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ăngTypeErrornế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()và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ụngx in sm.bjunkvàx in sm.bpopular, trong đó sm là đối tượngSequenceMatcher(bpo-13248).
Dọn dẹp mã¶
Lớp
Scannernội bộ không được sử dụng và không có giấy tờ đã bị xóa khỏi mô-đunpydoc.Mô-đun
_gestaltriêng tư và không được sử dụng hiệu quả đã bị xóa, cùng với các chức năngplatformriêng tư_mac_ver_lookup,_mac_ver_gstaltvà_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ố
statnhất định có trong không gian tên mô-đuntarfileđã 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
PATHthà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 đặtPYTHONPATHthành một giá trị trống là not tương đương với việc không đặt nó: đặtPYTHONPATHthà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ủaPATH. Hành vi hiện tuân theo quy ước posix choPATH.Đầ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--versionthànhstdoutthay 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.abchiện đưa ra ngoại lệ thích hợp hoặc trả về giá trị mặc định thay vì tăngNotImplementedErrormộ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ảNotImplementedErrorhoặ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__và__loader__thànhNonetheo 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__và__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ụngimportlib.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ụnghasattr(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__.locationcủ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ủaimportlib.machinery.FrozenImporterhay không, hoặc nếu cần khả năng tương thích Python 2, bạn có thể sử dụngimp.is_frozen().py_compile.compile()bây giờ sẽ tăngFileExistsErrornế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ăngImportErrorkhi mã nguồn đang được tải kích hoạtSyntaxErrorhoặcUnicodeDecodeError. VìImportErrorchỉ đượ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()và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ụnginspect.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êninspect.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ằnginspect.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.PathFinderhiện chuyển thư mục làm việc hiện tại tới các đối tượng trongsys.path_hookscho chuỗi trống. Điều này dẫn đếnsys.path_importer_cachekhông bao giờ chứa'', do đó việc lặp quasys.path_importer_cachedựa trênsys.pathsẽ 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-mvớ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
HTTPConnectionvàHTTPSConnectionsẽ 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 raSyntaxError. 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()vàssl.SSLSocket.do_handshake()hiện tăngOSErrorvớiENOTCONNkhiSSLSocketkhông được kết nối, thay vì hành vi trước đây là tăngAttributeError. Ngoài ra,getpeercert()sẽ raiseValueErrornếu việc bắt tay chưa được thực hiện.base64.b32decode()hiện tăngbinascii.Errorkhi chuỗi đầu vào chứa các ký tự không phải bảng chữ cái b32, thay vìTypeError.TypeErrorcụ thể này đã bị bỏ sót khi cácTypeErrorkhá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
filehiện được tự động đóng khi phiên bảncgi.FieldStoragetạ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ảncgi.FieldStoragevà 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ảncgi.FieldStoragehoặc đọc nội dung của tệp trước khi phiên bảncgi.FieldStorageđược thu thập rác.Việc gọi
readhoặcwritetrên ổ cắm SSL đã đóng giờ đây sẽ hiển thị mộtValueErrormang 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 raOverflowErrorcho 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ăngValueErrornế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àmcmath, đã chấp nhận không chính xác các giá trịfloatnế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ăngTypeError. (bpo-16290.)Hàm tạo
inttrong 3.2 và 3.3 chấp nhận sai các giá trịfloatcho 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ăngTypeError(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.namehiệ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).Vì
unittest.TestSuitehiệ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ạiTestSuiteđể 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 conTestSuitexác định một phương thức_removeTestAtIndexkhông thực hiện gì cả (xemTestSuite.__iter__()) (bpo-11798).unittesthiện sử dụngargparseđể 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()vàre.sub()cũng như các phương thứcgroup()vàgroups()của đối tượngmatchgiờ đâ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
audioopgiờ đâ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
HTMLParserhiệ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ànhTrue. 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ọiHTMLParsernà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ớihmac.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ímSOhoặc tra cứuSOtrong kết quả của cuộc gọi tớisysconfig.get_config_vars()không được dùng nữa. Phím này nên được thay thế bằngEXT_SUFFIXhoặcSHLIB_SUFFIX, tùy thuộc vào ngữ cảnh (bpo-19555).Mọi lệnh gọi tới các hàm
openchỉ địnhUđều phải được sửa đổi.Ukhô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 trongTextIOWrapperđể sử dụng đối số newline (bpo-15204).Nếu bạn sử dụng
pyvenvtrong tập lệnh và muốn cài đặt pip not, bạn phải thêm--without-pipvào lệnh gọi lệnh của mình.Hành vi mặc định của
json.dump()và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).doctesthiệ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ậpcollectionstự động nhậpcollections.abckhô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ộtimport collections.abc(bpo-20784) rõ ràng.
Những thay đổi trong C API¶
PyEval_EvalFrameEx(),PyObject_Repr()và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ằngPyErr_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ọiPyErr_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 đặtTypeErrorkhi đố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_ReadlineFunctionPointerbây giờ phải là một chuỗi được phân bổ bởiPyMem_RawMalloc()hoặcPyMem_RawRealloc()hoặcNULLnếu xảy ra lỗi, thay vì một chuỗi được phân bổ bởiPyMem_Malloc()hoặcPyMem_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ảiNULL).Trường
f_tstate(trạng thái luồng) của cấu trúcPyFrameObjectđã 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.request và xmlrpc.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)