Có gì mới trong Python 3.3¶
Bài viết này giải thích các tính năng mới trong Python 3.3, so với 3.2. Python 3.3 được phát hành vào ngày 29 tháng 9 năm 2012. Để biết chi tiết đầy đủ, hãy xem changelog.
Xem thêm
PEP 398 - Lịch phát hành Python 3.3
Tóm tắt -- Phát hành điểm nổi bật¶
Các tính năng cú pháp mới:
Biểu thức
yield frommới cho generator delegation.Cú pháp
u'unicode'được chấp nhận lại cho các đối tượngstr.
Các mô-đun thư viện mới:
faulthandler(giúp gỡ lỗi các sự cố ở mức độ thấp)ipaddress(đối tượng cấp cao biểu thị địa chỉ IP và mặt nạ)lzma(nén dữ liệu bằng thuật toán Oz/LZMA)unittest.mock(thay thế các bộ phận của hệ thống đang được thử nghiệm bằng các đối tượng giả)venv(Python virtual environments, như trong góivirtualenvphổ biến)
Các tính năng tích hợp mới:
Làm lại I/O exception hierarchy.
Cải tiến triển khai:
Viết lại import machinery dựa trên
importlib.unicode strings nhỏ gọn hơn.
attribute dictionaries nhỏ gọn hơn.
Các mô-đun thư viện được cải thiện đáng kể:
Bộ tăng tốc C cho mô-đun decimal.
Xử lý unicode tốt hơn trong mô-đun email (provisional).
Cải tiến bảo mật:
Tính năng ngẫu nhiên băm được bật theo mặc định.
Vui lòng đọc tiếp để biết danh sách đầy đủ các thay đổi đối với người dùng.
PEP 405: Môi trường ảo¶
Môi trường ảo giúp tạo các thiết lập Python riêng biệt trong khi chia sẻ cài đặt cơ sở trên toàn hệ thống để dễ bảo trì. Môi trường ảo có tập hợp các gói trang web riêng (tức là các thư viện được cài đặt cục bộ) và được tách biệt tùy ý khỏi các gói trang web trên toàn hệ thống. Khái niệm và cách triển khai của họ được lấy cảm hứng từ gói virtualenv phổ biến của bên thứ ba nhưng được hưởng lợi từ việc tích hợp chặt chẽ hơn với lõi trình thông dịch.
Zz003zz này bổ sung mô-đun venv để truy cập theo chương trình và tập lệnh pyvenv để truy cập và quản trị dòng lệnh. Trình thông dịch Python kiểm tra tệp pyvenv.cfg, sự tồn tại của nó báo hiệu cơ sở của cây thư mục của môi trường ảo.
Xem thêm
- PEP 405 - Môi trường ảo Python
PEP được viết bởi Carl Meyer; thực hiện bởi Carl Meyer và Vinay Sajip
PEP 420: Gói không gian tên ngầm¶
Hỗ trợ gốc cho các thư mục gói không yêu cầu tệp đánh dấu __init__.py và có thể tự động mở rộng nhiều phân đoạn đường dẫn (lấy cảm hứng từ các cách tiếp cận khác nhau của bên thứ ba đối với các gói không gian tên, như được mô tả trong PEP 420)
Xem thêm
- PEP 420 - Gói không gian tên ngầm
PEP được viết bởi Eric V. Smith; thực hiện bởi Eric V. Smith và Barry Warsaw
PEP 3118: Tài liệu về giao thức bộ đệm và triển khai bộ nhớ mới¶
Việc triển khai PEP 3118 đã được cải thiện đáng kể.
Việc triển khai chế độ xem bộ nhớ mới khắc phục toàn diện tất cả các vấn đề về quyền sở hữu và thời gian tồn tại của các trường được phân bổ động trong cấu trúc Py_buffer dẫn đến nhiều báo cáo sự cố. Ngoài ra, một số hàm bị lỗi hoặc trả về kết quả không chính xác cho đầu vào không liền kề hoặc đa chiều đã được sửa.
Đối tượng Memoryview hiện có getbufferproc() tuân thủ PEP-3118 để kiểm tra loại yêu cầu của người tiêu dùng. Nhiều tính năng mới đã được thêm vào, hầu hết chúng hoạt động hoàn toàn tổng quát cho các mảng không liền kề và các mảng có phần phụ.
Tài liệu đã được cập nhật, nêu rõ trách nhiệm của cả nhà xuất khẩu và người tiêu dùng. Cờ yêu cầu bộ đệm được nhóm thành cờ cơ bản và cờ phức hợp. Bố cục bộ nhớ của mảng kiểu NumPy không liền kề và đa chiều được giải thích.
Tính năng¶
Hiện tại, tất cả các công cụ xác định định dạng ký tự đơn gốc trong cú pháp mô-đun cấu trúc (có tiền tố '@' tùy chọn) đều được hỗ trợ.
Với một số hạn chế, phương thức cast() cho phép thay đổi định dạng và hình dạng của mảng liền kề C.
Biểu diễn danh sách đa chiều được hỗ trợ cho bất kỳ loại mảng nào.
So sánh đa chiều được hỗ trợ cho bất kỳ loại mảng nào.
Chế độ xem bộ nhớ một chiều của các loại có thể băm (chỉ đọc) với định dạng B, b hoặc c hiện có thể băm được. (Được đóng góp bởi Antoine Pitrou trong bpo-13411.)
Hỗ trợ cắt tùy ý bất kỳ loại mảng 1-D nào. Ví dụ: hiện tại có thể đảo ngược chế độ xem bộ nhớ trong O(1) bằng cách sử dụng bước phủ định.
thay đổi API¶
Số lượng kích thước tối đa được chính thức giới hạn ở mức 64.
Việc biểu diễn hình dạng trống, bước tiến và phần bù phụ hiện là một bộ dữ liệu trống thay vì
None.Việc truy cập phần tử MemoryView có định dạng 'B' (byte không dấu) hiện trả về một số nguyên (theo cú pháp mô-đun cấu trúc). Để trả về một đối tượng byte, trước tiên, chế độ xem phải được chuyển thành 'c'.
so sánh bộ nhớ hiện sử dụng cấu trúc logic của toán hạng và so sánh tất cả các phần tử mảng theo giá trị. Tất cả các chuỗi định dạng trong cú pháp mô-đun cấu trúc đều được hỗ trợ. Các chế độ xem có chuỗi định dạng không được nhận dạng vẫn được phép nhưng sẽ luôn so sánh là không bằng nhau, bất kể nội dung chế độ xem là gì.
Để biết thêm những thay đổi, hãy xem Build and C API Changes và Porting C code.
(Được đóng góp bởi Stefan Krah trong bpo-10181.)
Xem thêm
PEP 3118 - Sửa đổi giao thức bộ đệm
PEP 393: Biểu diễn chuỗi linh hoạt¶
Loại chuỗi Unicode được thay đổi để hỗ trợ nhiều cách biểu diễn bên trong, tùy thuộc vào ký tự có thứ tự Unicode lớn nhất (1, 2 hoặc 4 byte) trong chuỗi được biểu diễn. Điều này cho phép trình bày hiệu quả về không gian trong các trường hợp phổ biến nhưng cung cấp quyền truy cập vào UCS-4 đầy đủ trên tất cả các hệ thống. Để tương thích với các API hiện có, một số cách biểu diễn có thể tồn tại song song; theo thời gian, khả năng tương thích này sẽ bị loại bỏ.
Về phía Python, sự thay đổi này sẽ không có nhược điểm nào cả.
Về phía C API, PEP 393 hoàn toàn tương thích ngược. Zz002zz cũ sẽ tồn tại ít nhất 5 năm. Các ứng dụng sử dụng API cũ sẽ không hoàn toàn hưởng lợi từ việc giảm bộ nhớ hoặc - tệ hơn - có thể sử dụng nhiều bộ nhớ hơn một chút, vì Python có thể phải duy trì hai phiên bản của mỗi chuỗi (ở định dạng cũ và trong bộ lưu trữ hiệu quả mới).
Chức năng¶
Những thay đổi được giới thiệu bởi PEP 393 như sau:
Python hiện luôn hỗ trợ đầy đủ các điểm mã Unicode, bao gồm cả các điểm mã không phải BMP (tức là từ
U+0000đếnU+10FFFF). Sự khác biệt giữa bản dựng hẹp và bản rộng không còn tồn tại nữa và Python giờ đây hoạt động giống như bản dựng rộng, ngay cả trong Windows.Với việc khai tử các công trình xây dựng hẹp, các vấn đề cụ thể đối với các công trình xây dựng hẹp cũng đã được khắc phục, ví dụ:
len()hiện luôn trả về 1 cho các ký tự không phải BMP, vì vậylen('\U0010FFFF') == 1;các cặp thay thế không được kết hợp lại theo chuỗi ký tự, vì vậy
'\uDBFF\uDFFF' != '\U0010FFFF';lập chỉ mục hoặc cắt các ký tự không phải BMP trả về giá trị mong đợi, vì vậy
'\U0010FFFF'[0]hiện trả về'\U0010FFFF'chứ không phải'\uDBFF';tất cả các hàm khác trong thư viện chuẩn giờ đây đều xử lý chính xác các điểm mã không phải BMP.
Giá trị của
sys.maxunicodebây giờ luôn là1114111(0x10FFFFở hệ thập lục phân). HàmPyUnicode_GetMax()vẫn trả về0xFFFFhoặc0x10FFFFđể tương thích ngược và không nên sử dụng hàm này với Unicode API mới (xem bpo-13054).Cờ
./configure--with-wide-unicodeđã bị xóa.
Hiệu suất và sử dụng tài nguyên¶
Việc lưu trữ chuỗi Unicode bây giờ phụ thuộc vào điểm mã cao nhất trong chuỗi:
chuỗi ASCII và Latin1 thuần túy (
U+0000-U+00FF) sử dụng 1 byte cho mỗi điểm mã;Chuỗi BMP (
U+0000-U+FFFF) sử dụng 2 byte cho mỗi điểm mã;các chuỗi không phải BMP (
U+10000-U+10FFFF) sử dụng 4 byte cho mỗi điểm mã.
Hiệu quả thực sự là đối với hầu hết các ứng dụng, mức sử dụng bộ nhớ của bộ lưu trữ chuỗi sẽ giảm đáng kể - đặc biệt là so với các bản dựng unicode rộng trước đây - vì trong nhiều trường hợp, các chuỗi sẽ thuần túy là ASCII ngay cả trong bối cảnh quốc tế (vì nhiều chuỗi lưu trữ dữ liệu ngôn ngữ không phải của con người, chẳng hạn như các đoạn XML, tiêu đề HTTP, dữ liệu được mã hóa JSON, v.v.). Chúng tôi cũng hy vọng rằng vì những lý do tương tự, nó sẽ tăng hiệu quả bộ đệm CPU trên các ứng dụng không tầm thường. Mức sử dụng bộ nhớ của Python 3.3 nhỏ hơn hai đến ba lần so với Python 3.2 và tốt hơn một chút so với Python 2.7, trên điểm chuẩn Django (xem PEP để biết chi tiết).
Xem thêm
- PEP 393 - Biểu diễn chuỗi linh hoạt
PEP được viết bởi Martin von Löwis; thực hiện bởi Torsten Becker và Martin von Löwis.
PEP 397: Trình khởi chạy Python cho Windows¶
Trình cài đặt Windows Python 3.3 hiện bao gồm ứng dụng khởi chạy py có thể được sử dụng để khởi chạy các ứng dụng Python theo kiểu độc lập với phiên bản.
Trình khởi chạy này được gọi ngầm khi bấm đúp vào tệp *.py. Nếu chỉ có một phiên bản Python duy nhất được cài đặt trên hệ thống, phiên bản đó sẽ được sử dụng để chạy tệp. Nếu nhiều phiên bản được cài đặt, phiên bản mới nhất sẽ được sử dụng theo mặc định, nhưng phiên bản này có thể bị ghi đè bằng cách đưa "dòng shebang" kiểu Unix vào tập lệnh Python.
Trình khởi chạy cũng có thể được sử dụng rõ ràng từ dòng lệnh dưới dạng ứng dụng py. Việc chạy py tuân theo các quy tắc chọn phiên bản tương tự như khởi chạy ngầm các tập lệnh, nhưng có thể chọn một phiên bản cụ thể hơn bằng cách chuyển các đối số thích hợp (chẳng hạn như -3 để yêu cầu Python 3 khi Python 2 cũng được cài đặt hoặc -2.6 để yêu cầu cụ thể phiên bản Python cũ hơn khi cài đặt phiên bản mới hơn).
Ngoài trình khởi chạy, trình cài đặt Windows hiện còn có tùy chọn thêm Python mới cài đặt vào hệ thống PATH. (Được đóng góp bởi Brian Curtin trong bpo-3561.)
Xem thêm
- PEP 397 - Trình khởi chạy Python cho Windows
PEP được viết bởi Mark Hammond và Martin kiện Löwis; do Vinay Sajip thực hiện.
Tài liệu về trình khởi chạy: Trình quản lý cài đặt Python
Trình cài đặt PATH sửa đổi: Trình quản lý cài đặt Python
PEP 3151: Làm lại hệ thống phân cấp ngoại lệ của hệ điều hành và IO¶
Hệ thống phân cấp các trường hợp ngoại lệ do lỗi hệ điều hành gây ra hiện đã được đơn giản hóa và chi tiết hơn.
Bạn không phải lo lắng nữa về việc chọn loại ngoại lệ thích hợp giữa OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error hoặc select.error. Tất cả các loại ngoại lệ này hiện chỉ có một: OSError. Các tên khác được giữ làm bí danh vì lý do tương thích.
Ngoài ra, giờ đây việc nắm bắt tình trạng lỗi cụ thể cũng trở nên dễ dàng hơn. Thay vì kiểm tra thuộc tính errno (hoặc args[0]) để tìm một hằng số cụ thể từ mô-đun errno, bạn có thể tìm ra lớp con OSError thích hợp. Các lớp con có sẵn như sau:
Và bản thân ConnectionError có các lớp con chi tiết hơn:
Nhờ các ngoại lệ mới, giờ đây có thể tránh được việc sử dụng errno thông thường. Ví dụ: đoạn mã sau được viết cho Python 3.2:
từ lỗi nhập ENOENT, EACCES, EPERM
thử:
với open("document.txt") là f:
nội dung = f.read()
ngoại trừ IOError là lỗi:
nếu có lỗi.errno == ENOENT:
print("thiếu tập tin document.txt")
Elif err.errno trong (EACCES, EPERM):
print("Bạn không được phép đọc document.txt")
khác:
nâng cao
bây giờ có thể được viết mà không cần nhập errno và không cần kiểm tra thủ công các thuộc tính ngoại lệ
thử:
với open("document.txt") là f:
nội dung = f.read()
ngoại trừ FileNotFoundError:
print("thiếu tập tin document.txt")
ngoại trừ PermissionError:
print("Bạn không được phép đọc document.txt")
Xem thêm
- PEP 3151 - Làm lại hệ thống phân cấp ngoại lệ của hệ điều hành và IO
PEP được viết và triển khai bởi Antoine Pitrou
PEP 380: Cú pháp ủy quyền cho Subgenerator¶
PEP 380 thêm biểu thức yield from, cho phép generator ủy quyền một phần hoạt động của nó cho một trình tạo khác. Điều này cho phép một phần mã chứa yield được phân tích và đặt vào một trình tạo khác. Ngoài ra, bộ tạo phụ được phép trả về với một giá trị và giá trị này được cung cấp cho bộ tạo ủy nhiệm.
Mặc dù được thiết kế chủ yếu để sử dụng trong việc ủy quyền cho một trình tạo phụ, nhưng biểu thức yield from thực sự cho phép ủy quyền cho các trình tạo phụ tùy ý.
Đối với các trình vòng lặp đơn giản, yield from iterable về cơ bản chỉ là dạng rút gọn của for item in iterable: yield item:
>>> định nghĩa g(x):
... mang lại từ phạm vi (x, 0, -1)
... lợi nhuận từ phạm vi (x)
...
>>> danh sách(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
Tuy nhiên, không giống như vòng lặp thông thường, yield from cho phép các trình tạo con nhận các giá trị đã gửi và ném trực tiếp từ phạm vi gọi và trả về giá trị cuối cùng cho trình tạo bên ngoài:
>>> def tích lũy():
... kiểm đếm = 0
... trong khi 1:
... tiếp theo = năng suất
... nếu tiếp theo là Không:
... trả lại kiểm đếm
... kiểm đếm += tiếp theo
...
>>> def thu thập_tallies(tally):
... trong khi 1:
... kiểm đếm = sản lượng từ tích lũy()
... tallies.append(tally)
...
>>> kiểm đếm = []
>>> acc = thu thập_tally(tally)
>>> next(acc) # Ensure bộ tích lũy sẵn sàng chấp nhận các giá trị
>>> cho i trong phạm vi (4):
... acc.send(i)
...
>>> acc.send(None) # Finish lần kiểm đếm đầu tiên
>>> cho i trong phạm vi (5):
... acc.send(i)
...
>>> acc.send(None) # Finish kiểm đếm thứ hai
>>> kiểm đếm
[6, 10]
Nguyên tắc chính thúc đẩy sự thay đổi này là cho phép ngay cả các bộ tạo được thiết kế để sử dụng với các phương pháp send và throw cũng có thể được chia thành nhiều bộ tạo con một cách dễ dàng như một hàm lớn duy nhất có thể được chia thành nhiều hàm con.
Xem thêm
- PEP 380 - Cú pháp ủy quyền cho một máy phát điện phụ
PEP được viết bởi Greg Ewing; do Greg Ewing triển khai, Renaud Blanch, Ryan Kelly và Nick Coghlan tích hợp vào 3.3; tài liệu của Zbigniew Jędrzejewski-Szmek và Nick Coghlan
PEP 409: Loại bỏ bối cảnh ngoại lệ¶
PEP 409 giới thiệu cú pháp mới cho phép tắt hiển thị bối cảnh ngoại lệ theo chuỗi. Điều này cho phép các thông báo lỗi sạch hơn trong các ứng dụng chuyển đổi giữa các loại ngoại lệ:
>>> lớp D:
... def __init__(tự, bổ sung):
... self._extra_attributes = thêm
... def __getattr__(self, attr):
... thử:
... trả về self._extra_attributes[attr]
... ngoại trừ KeyError:
... tăng AttributionError(attr) từ Không có
...
>>> D({}).x
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
Tệp "<stdin>", dòng 8, trong __getattr__
Lỗi thuộc tính: x
Nếu không có hậu tố from None để ngăn chặn nguyên nhân, ngoại lệ ban đầu sẽ được hiển thị theo mặc định:
>>> lớp C:
... def __init__(tự, bổ sung):
... self._extra_attributes = thêm
... def __getattr__(self, attr):
... thử:
... trả về self._extra_attributes[attr]
... ngoại trừ KeyError:
... tăng AttributionError(attr)
...
>>> C({}).x
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 6, trong __getattr__
Lỗi khóa: 'x'
Trong quá trình xử lý ngoại lệ trên, một ngoại lệ khác đã xảy ra:
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
Tệp "<stdin>", dòng 8, trong __getattr__
Lỗi thuộc tính: x
Không có khả năng gỡ lỗi nào bị mất vì bối cảnh ngoại lệ ban đầu vẫn khả dụng nếu cần (ví dụ: nếu một thư viện can thiệp đã loại bỏ không chính xác các chi tiết cơ bản có giá trị):
>>> thử:
... D({}).x
... ngoại trừ AttributionError dưới dạng ex:
... print(repr(exc.__context__))
...
Lỗi khóa('x',)
Xem thêm
- PEP 409 - Loại bỏ bối cảnh ngoại lệ
PEP được viết bởi Ethan Furman; được thực hiện bởi Ethan Furman và Nick Coghlan.
PEP 414: Chữ Unicode rõ ràng¶
Để dễ dàng chuyển đổi từ Python 2 sang các ứng dụng Python nhận biết Unicode sử dụng nhiều các ký tự Unicode, Python 3.3 một lần nữa hỗ trợ tiền tố "u" cho các ký tự chuỗi. Tiền tố này không có ý nghĩa ngữ nghĩa trong Python 3, nó chỉ được cung cấp để giảm số lượng thay đổi thuần túy cơ học khi di chuyển sang Python 3, giúp nhà phát triển dễ dàng tập trung hơn vào những thay đổi ngữ nghĩa quan trọng hơn (chẳng hạn như phân tách mặc định chặt chẽ hơn giữa dữ liệu văn bản và nhị phân).
Xem thêm
- PEP 414 - Chữ Unicode rõ ràng
PEP được viết bởi Armin Ronacher.
PEP 3155: Tên đủ điều kiện cho các lớp và hàm¶
Các hàm và đối tượng lớp có thuộc tính __qualname__ mới biểu thị "đường dẫn" từ cấp cao nhất của mô-đun đến định nghĩa của chúng. Đối với các hàm và lớp toàn cục, điều này giống như __name__. Đối với các hàm và lớp khác, nó cung cấp thông tin tốt hơn về nơi chúng thực sự được xác định và cách chúng có thể được truy cập từ phạm vi toàn cục.
Ví dụ với các phương thức (không bị ràng buộc):
>>> lớp C:
... def meth(tự):
... vượt qua
...
>>> C.meth.__name__
'ma túy đá'
>>> C.meth.__qualname__
'C.meth'
Ví dụ với các lớp lồng nhau:
>>> lớp C:
... lớp D:
... def meth(tự):
... vượt qua
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'CD'
>>> C.D.meth.__name__
'ma túy đá'
>>> C.D.meth.__qualname__
'C.D.meth'
Ví dụ với các hàm lồng nhau:
>>> def bên ngoài():
... def bên trong():
... vượt qua
... trở về bên trong
...
>>> bên ngoài().__name__
'nội tâm'
>>> bên ngoài().__qualname__
'outer.<locals>.inner'
Biểu diễn chuỗi của các đối tượng đó cũng được thay đổi để bao gồm thông tin mới, chính xác hơn:
>>> str(C.D)
"<lớp '__main__.C.D'>"
>>> str(C.D.meth)
'<chức năng C.D.meth tại 0x7f46b9fe31e0>'
Xem thêm
- PEP 3155 - Tên đủ điều kiện cho các lớp và hàm
PEP được viết và triển khai bởi Antoine Pitrou.
PEP 412: Từ điển chia sẻ khóa¶
Các từ điển được sử dụng để lưu trữ thuộc tính của các đối tượng hiện có thể chia sẻ một phần bộ nhớ trong của chúng với nhau (cụ thể là phần lưu trữ khóa và hàm băm tương ứng của chúng). Điều này làm giảm mức tiêu thụ bộ nhớ của các chương trình tạo ra nhiều phiên bản thuộc loại không được tích hợp sẵn.
Xem thêm
- PEP 412 - Từ điển chia sẻ khóa
PEP được viết và triển khai bởi Mark Shannon.
PEP 362: Đối tượng chữ ký hàm¶
Một chức năng mới inspect.signature() giúp việc xem xét nội tâm các lệnh gọi python trở nên dễ dàng và đơn giản. Hỗ trợ một loạt các lệnh gọi: hàm python, được trang trí hoặc không, các lớp và đối tượng functools.partial(). Các lớp mới inspect.Signature, inspect.Parameter và inspect.BoundArguments chứa thông tin về chữ ký cuộc gọi, chẳng hạn như chú thích, giá trị mặc định, loại tham số và đối số ràng buộc, giúp đơn giản hóa đáng kể việc viết trình trang trí và bất kỳ mã nào xác thực hoặc sửa đổi chữ ký hoặc đối số cuộc gọi.
Xem thêm
- PEP 362: - Đối tượng chữ ký hàm
PEP được viết bởi Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; được thực hiện bởi Yury Selivanov.
PEP 421: Thêm sys.implementation¶
Một thuộc tính mới trên mô-đun sys hiển thị các chi tiết cụ thể về việc triển khai trình thông dịch hiện đang chạy. Tập thuộc tính ban đầu trên sys.implementation là name, version, hexversion và cache_tag.
Mục đích của sys.implementation là hợp nhất vào một không gian tên dữ liệu triển khai cụ thể được thư viện chuẩn sử dụng. Điều này cho phép các triển khai Python khác nhau chia sẻ một cơ sở mã thư viện tiêu chuẩn duy nhất dễ dàng hơn nhiều. Ở trạng thái ban đầu, sys.implementation chỉ chứa một phần nhỏ dữ liệu triển khai cụ thể. Theo thời gian, tỷ lệ đó sẽ thay đổi để làm cho thư viện tiêu chuẩn dễ mang theo hơn.
Một ví dụ về tính di động của thư viện tiêu chuẩn được cải thiện là cache_tag. Kể từ Python 3.3, sys.implementation.cache_tag được importlib sử dụng để hỗ trợ tuân thủ PEP 3147. Bất kỳ triển khai Python nào sử dụng importlib cho hệ thống nhập tích hợp của nó đều có thể sử dụng cache_tag để kiểm soát hành vi bộ nhớ đệm cho các mô-đun.
Không gian tên đơn giản¶
Việc triển khai sys.implementation cũng giới thiệu một loại mới cho Python: types.SimpleNamespace. Ngược lại với không gian tên dựa trên ánh xạ, như dict, SimpleNamespace dựa trên thuộc tính, như object. Tuy nhiên, không giống như object, các phiên bản SimpleNamespace có thể ghi được. Điều này có nghĩa là bạn có thể thêm, xóa và sửa đổi không gian tên thông qua quyền truy cập thuộc tính thông thường.
Xem thêm
- PEP 421 - Thêm sys.implementation
PEP được viết và triển khai bởi Eric Snow.
Sử dụng importlib làm triển khai nhập¶
bpo-2377 - Thay thế __import__ w/ importlib.__import__ bpo-13959 - Triển khai lại các phần của imp bằng Python thuần túy bpo-14605 - Làm cho máy móc nhập khẩu trở nên rõ ràng bpo-14646 - Yêu cầu bộ tải __loader__ và __package__
Chức năng __import__() hiện được hỗ trợ bởi importlib.__import__(). Công việc này dẫn đến việc hoàn thành "giai đoạn 2" của PEP 302. Có nhiều lợi ích cho sự thay đổi này. Đầu tiên, nó cho phép hiển thị nhiều nội dung nhập khẩu cung cấp năng lượng máy móc hơn thay vì ẩn và ẩn trong mã C. Nó cũng cung cấp một triển khai duy nhất cho tất cả các máy ảo Python hỗ trợ Python 3.3 sử dụng, giúp chấm dứt mọi sai lệch dành riêng cho VM trong ngữ nghĩa nhập. Và cuối cùng, nó giúp giảm bớt việc duy trì nhập khẩu, tạo điều kiện cho sự tăng trưởng trong tương lai diễn ra.
Đối với người dùng thông thường, sẽ không có sự thay đổi rõ ràng nào về ngữ nghĩa. Đối với những người có mã hiện đang thao tác nhập hoặc gọi nhập theo chương trình, những thay đổi mã có thể được yêu cầu sẽ được đề cập trong phần Porting Python code của tài liệu này.
API mới¶
Một trong những lợi ích lớn của công việc này là việc trình bày những gì làm cho báo cáo nhập khẩu hoạt động. Điều đó có nghĩa là các nhà nhập khẩu khác nhau từng ẩn danh giờ đây đã được hiển thị hoàn toàn như một phần của gói importlib.
Các lớp cơ sở trừu tượng được xác định trong importlib.abc đã được mở rộng để phân định chính xác giữa meta path finders và path entry finders bằng cách giới thiệu importlib.abc.MetaPathFinder và importlib.abc.PathEntryFinder tương ứng. Zz006zz cũ của importlib.abc.Finder hiện chỉ được cung cấp để tương thích ngược và không thực thi bất kỳ yêu cầu phương pháp nào.
Về mặt công cụ tìm, importlib.machinery.FileFinder hiển thị cơ chế được sử dụng để tìm kiếm tệp nguồn và mã byte của mô-đun. Trước đây lớp này là thành viên ngầm của sys.path_hooks.
Đối với các trình tải, lớp cơ sở trừu tượng mới importlib.abc.FileLoader giúp viết một trình tải sử dụng hệ thống tệp làm cơ chế lưu trữ mã của mô-đun. Trình tải cho tệp nguồn (importlib.machinery.SourceFileLoader), tệp mã byte không nguồn (importlib.machinery.SourcelessFileLoader) và mô-đun mở rộng (importlib.machinery.ExtensionFileLoader) hiện có sẵn để sử dụng trực tiếp.
ImportError hiện có các thuộc tính name và path được đặt khi có dữ liệu liên quan cần cung cấp. Thông báo nhập không thành công cũng sẽ cung cấp tên đầy đủ của mô-đun thay vì chỉ phần cuối của tên mô-đun.
Bây giờ, hàm importlib.invalidate_caches() sẽ gọi phương thức có cùng tên trên tất cả các công cụ tìm kiếm được lưu trong bộ nhớ đệm trong sys.path_importer_cache để giúp dọn sạch mọi trạng thái được lưu trữ nếu cần.
Những thay đổi có thể nhìn thấy¶
Để biết những thay đổi cần thiết đối với mã, hãy xem phần Porting Python code.
Ngoài những gì importlib hiện đang mở rộng, còn có những thay đổi rõ ràng khác cần nhập. Điều lớn nhất là sys.meta_path và sys.path_hooks hiện lưu trữ tất cả các công cụ tìm đường dẫn meta và móc nhập đường dẫn được sử dụng khi nhập. Trước đây, các công cụ tìm kiếm được ngầm định và ẩn trong mã nhập C thay vì được hiển thị trực tiếp. Điều này có nghĩa là giờ đây người ta có thể dễ dàng loại bỏ hoặc thay đổi thứ tự của các công cụ tìm kiếm khác nhau để phù hợp với nhu cầu của mình.
Một thay đổi khác là tất cả các mô-đun đều có thuộc tính __loader__, lưu trữ trình tải được sử dụng để tạo mô-đun. PEP 302 đã được cập nhật để làm cho thuộc tính này bắt buộc đối với các trình tải phải triển khai, vì vậy trong tương lai khi các trình tải của bên thứ 3 được cập nhật, mọi người sẽ có thể tin tưởng vào sự tồn tại của thuộc tính này. Tuy nhiên, cho đến thời điểm đó, quá trình nhập đang thiết lập tải sau mô-đun.
Trình tải hiện cũng được yêu cầu đặt thuộc tính __package__ từ PEP 366. Một lần nữa, chính quá trình nhập đã thiết lập cài đặt này trên tất cả các trình tải từ importlib và chính quá trình nhập đang thiết lập thuộc tính tải sau.
None hiện được chèn vào sys.path_importer_cache khi không tìm thấy công cụ tìm kiếm nào trên sys.path_hooks. Vì imp.NullImporter không được hiển thị trực tiếp trên sys.path_hooks nên không còn có thể dựa vào đó để luôn có sẵn để sử dụng làm giá trị biểu thị không tìm thấy công cụ tìm thấy nào.
Tất cả các thay đổi khác liên quan đến thay đổi ngữ nghĩa cần được xem xét khi cập nhật mã cho Python 3.3 và do đó nên đọc trong phần Porting Python code của tài liệu này.
(Thực hiện bởi Brett Cannon)
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à:
Đã thêm hỗ trợ cho bí danh tên Unicode và chuỗi được đặt tên. Cả
unicodedata.lookup()và'\N{...}'hiện đều giải quyết các bí danh tên vàunicodedata.lookup()cũng giải quyết các chuỗi được đặt tên.(Được đóng góp bởi Ezio Melotti trong bpo-12753.)
Cơ sở dữ liệu Unicode được cập nhật lên UCD phiên bản 6.1.0
So sánh đẳng thức trên các đối tượng
range()hiện trả về kết quả phản ánh sự bằng nhau của các chuỗi cơ bản được tạo bởi các đối tượng phạm vi đó. (bpo-13201)Các phương thức
count(),find(),rfind(),index()vàrindex()của các đối tượngbytesvàbytearrayhiện chấp nhận một số nguyên từ 0 đến 255 làm đối số đầu tiên của chúng.(Được đóng góp bởi Petri Lehtinen trong bpo-12170.)
Các phương thức
rjust(),ljust()vàcenter()củabytesvàbytearrayhiện chấp nhậnbytearraycho đối sốfill. (Được đóng góp bởi Petri Lehtinen trong bpo-12380.)Các phương thức mới đã được thêm vào
listvàbytearray:copy()vàclear()(bpo-10516). Do đó,MutableSequencehiện cũng định nghĩa một phương thứcclear()(bpo-11388).Hiện tại, các byte thô có thể được viết là
rb"..."cũng nhưbr"...".(Được đóng góp bởi Antoine Pitrou trong bpo-13748.)
dict.setdefault()hiện chỉ thực hiện một lần tra cứu cho khóa đã cho, biến nó thành nguyên tử khi được sử dụng với các loại tích hợp sẵn.(Được đóng góp bởi Filip Gruszczyński trong bpo-13521.)
Các thông báo lỗi được tạo ra khi lệnh gọi hàm không khớp với chữ ký hàm đã được cải thiện đáng kể.
(Được đóng góp bởi Benjamin Peterson.)
Khóa nhập chi tiết hơn¶
Các phiên bản trước của CPython luôn dựa vào khóa nhập toàn cầu. Điều này dẫn đến những phiền toái không mong muốn, chẳng hạn như bế tắc khi nhập mô-đun sẽ kích hoạt việc thực thi mã trong một luồng khác như một tác dụng phụ. Các cách giải quyết vụng về đôi khi được sử dụng, chẳng hạn như hàm PyImport_ImportModuleNoBlock() C API.
Trong Python 3.3, việc nhập mô-đun sẽ có khóa trên mỗi mô-đun. Điều này tuần tự hóa một cách chính xác việc nhập một mô-đun nhất định từ nhiều luồng (ngăn chặn việc lộ các mô-đun được khởi tạo không đầy đủ), đồng thời loại bỏ những phiền toái đã nói ở trên.
(Được đóng góp bởi Antoine Pitrou trong bpo-9260.)
Các hàm và kiểu dựng sẵn¶
open()nhận được một tham số opener mới: bộ mô tả tệp cơ bản cho đối tượng tệp sau đó được lấy bằng cách gọi opener với (file, flags). Nó có thể được sử dụng để sử dụng các cờ tùy chỉnh nhưos.O_CLOEXECchẳng hạn. Chế độ'x'đã được thêm vào: mở để tạo độc quyền, không thành công nếu tệp đã tồn tại.print(): đã thêm đối số từ khóa flush. Nếu đối số từ khóa flush là đúng, luồng sẽ bị xóa cưỡng bức.hash(): ngẫu nhiên băm được bật theo mặc định, xemobject.__hash__()vàPYTHONHASHSEED.Loại
strcó một phương thứccasefold()mới: trả về một bản sao được đóng dạng chữ hoa của chuỗi, các chuỗi được xếp dạng chữ hoa có thể được sử dụng để khớp không phân biệt chữ hoa chữ thường. Ví dụ:'ß'.casefold()trả về'ss'.Tài liệu về trình tự đã được viết lại về cơ bản để giải thích rõ hơn sự phân biệt trình tự nhị phân/văn bản và cung cấp các phần tài liệu cụ thể cho các loại trình tự dựng sẵn riêng lẻ (bpo-4966).
Mô-đun mới¶
người xử lý lỗi¶
Mô-đun gỡ lỗi mới faulthandler này chứa các chức năng kết xuất dấu vết Python một cách rõ ràng, khi có lỗi (sự cố như lỗi phân đoạn), sau khi hết thời gian chờ hoặc theo tín hiệu của người dùng. Gọi faulthandler.enable() để cài đặt trình xử lý lỗi cho các tín hiệu SIGSEGV, SIGFPE, SIGABRT, SIGBUS và SIGILL. Bạn cũng có thể kích hoạt chúng khi khởi động bằng cách đặt biến môi trường PYTHONFAULTHANDLER hoặc bằng cách sử dụng tùy chọn dòng lệnh -X faulthandler.
Ví dụ về lỗi phân đoạn trên Linux:
$ python -q -X trình xử lý lỗi
>>> nhập ctypes
>>> ctypes.string_at(0)
Lỗi Python nghiêm trọng: Lỗi phân đoạn
Chủ đề hiện tại 0x00007fb899f39700:
Tệp "/home/python/cpython/Lib/ctypes/__init__.py", dòng 486 trong string_at
Tệp "<stdin>", dòng 1 trong <module>
Lỗi phân đoạn
váy ipad¶
Mô-đun ipaddress mới cung cấp các công cụ để tạo và thao tác các đối tượng đại diện cho địa chỉ, mạng và giao diện IPv4 và IPv6 (tức là địa chỉ IP được liên kết với một mạng con IP cụ thể).
(Được đóng góp bởi Google và Peter Moody trong PEP 3144.)
lzma¶
Mô-đun lzma mới được thêm vào cung cấp khả năng nén và giải nén dữ liệu bằng thuật toán LZMA, bao gồm hỗ trợ các định dạng tệp .xz và .lzma.
(Được đóng góp bởi Nadeem Vawda và Per Øyvind Karlsen trong bpo-6715.)
Mô-đun cải tiến¶
abc¶
Cải thiện hỗ trợ cho các lớp cơ sở trừu tượng chứa các bộ mô tả được tạo bằng các phương thức trừu tượng. Cách tiếp cận được đề xuất để khai báo các bộ mô tả trừu tượng hiện nay là cung cấp __isabstractmethod__ dưới dạng thuộc tính được cập nhật động. Các mô tả tích hợp đã được cập nhật tương ứng.
abc.abstractpropertykhông được dùng nữa, thay vào đó hãy sử dụngpropertyvớiabc.abstractmethod().abc.abstractclassmethodkhông được dùng nữa, thay vào đó hãy sử dụngclassmethodvớiabc.abstractmethod().abc.abstractstaticmethodkhông được dùng nữa, thay vào đó hãy sử dụngstaticmethodvớiabc.abstractmethod().
(Được đóng góp bởi Darren Dale trong bpo-11610.)
abc.ABCMeta.register() hiện trả về lớp con đã đăng ký, có nghĩa là bây giờ nó có thể được sử dụng làm công cụ trang trí lớp (bpo-10868).
mảng¶
Mô-đun array hỗ trợ loại long long sử dụng mã loại q và Q.
(Được đóng góp bởi Oren Tirosh và Hirokazu Yamamoto trong bpo-1172711.)
cơ sở64¶
Các chuỗi Unicode chỉ dành cho ASCII hiện được chấp nhận bởi các chức năng giải mã của giao diện hiện đại base64. Ví dụ: base64.b64decode('YWJj') trả về b'abc'. (Được đóng góp bởi Catalin Iacob trong bpo-13641.)
binascii¶
Ngoài các đối tượng nhị phân mà chúng thường chấp nhận, các hàm a2b_ giờ đây cũng chấp nhận các chuỗi chỉ có ASCII làm đầu vào. (Được đóng góp bởi Antoine Pitrou trong bpo-13637.)
bz2¶
Mô-đun bz2 đã được viết lại từ đầu. Trong quá trình này, một số tính năng mới đã được thêm vào:
Chức năng
bz2.open()mới: mở tệp nén bzip2 ở chế độ nhị phân hoặc văn bản.bz2.BZ2Filehiện có thể đọc và ghi vào các đối tượng giống như tệp tùy ý, bằng đối số fileobj của hàm tạo.(Được đóng góp bởi Nadeem Vawda trong bpo-5863.)
bz2.BZ2Filevàbz2.decompress()hiện có thể giải nén các đầu vào nhiều luồng (chẳng hạn như các đầu vào do công cụ pbzip2 tạo ra).bz2.BZ2Filehiện cũng có thể được sử dụng để tạo loại tệp này bằng chế độ'a'(chắp thêm).(Được đóng góp bởi Nir Aides trong bpo-1625.)
bz2.BZ2Filehiện triển khai tất cảio.BufferedIOBaseAPI, ngoại trừ các phương thứcdetach()vàtruncate().
codec¶
Codec mbcs đã được viết lại để xử lý chính xác các trình xử lý lỗi replace và ignore trên tất cả các phiên bản Windows. Codec mbcs hiện hỗ trợ tất cả các trình xử lý lỗi, thay vì chỉ replace để mã hóa và ignore để giải mã.
Một codec mới chỉ dành cho Windows đã được thêm vào: cp65001 (bpo-13216). Đó là mã Windows trang 65001 (Windows UTF-8, CP_UTF8). Ví dụ: nó được sys.stdout sử dụng nếu trang mã đầu ra của bảng điều khiển được đặt thành cp65001 (ví dụ: sử dụng lệnh chcp 65001).
Bộ giải mã Multibyte CJK hiện đồng bộ hóa lại nhanh hơn. Họ chỉ bỏ qua byte đầu tiên của chuỗi byte không hợp lệ. Ví dụ: b'\xff\n'.decode('gb2312', 'replace') hiện trả về \n sau ký tự thay thế.
Bộ mã hóa codec CJK tăng dần không còn được đặt lại ở mỗi lần gọi phương thức mã hóa() của chúng nữa. Ví dụ:
>>> nhập codec
>>> bộ mã hóa = codecs.getincrementalencode('hz')('strict')
>>> b''.join(encode.encode(x) cho x trong '\u52ff\u65bd\u65bc\u4eba\u3002 Tạm biệt.')
b'~{NpJ)l6HK!#~} Tạm biệt.'
Ví dụ này cung cấp b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.' với các phiên bản Python cũ hơn.
Codec unicode_internal không còn được dùng nữa.
bộ sưu tập¶
Bổ sung lớp ChainMap mới để cho phép xử lý nhiều ánh xạ dưới dạng một đơn vị. (Được viết bởi Raymond Hettinger cho bpo-11089, được công bố trên bpo-11297.)
Các lớp cơ sở trừu tượng đã được di chuyển trong mô-đun collections.abc mới để phân biệt rõ hơn giữa các lớp bộ sưu tập trừu tượng và cụ thể. Bí danh cho ABC vẫn tồn tại trong mô-đun collections để duy trì các mục nhập hiện có. (bpo-11085)
Lớp Counter hiện hỗ trợ các toán tử + và - đơn nhất, cũng như các toán tử tại chỗ +=, -=, |= và &=. (Được đóng góp bởi Raymond Hettinger trong bpo-13121.)
bối cảnh¶
ExitStack hiện cung cấp nền tảng vững chắc cho thao tác có lập trình của trình quản lý bối cảnh và chức năng dọn dẹp tương tự. Không giống như contextlib.nested API trước đó (đã không được dùng nữa và đã bị xóa), API mới được thiết kế để hoạt động chính xác bất kể người quản lý bối cảnh có lấy tài nguyên của họ theo phương thức __init__ (ví dụ: đối tượng tệp) hay trong phương thức __enter__ (ví dụ: đối tượng đồng bộ hóa từ mô-đun threading).
hầm mộ¶
Bổ sung định dạng muối và mật mã mô-đun (phương pháp băm) và hàm mksalt() cho mô-đun crypt.
chửi rủa¶
Nếu mô-đun
cursesđược liên kết với thư viện ncursesw, hãy sử dụng các hàm Unicode khi các chuỗi hoặc ký tự Unicode được truyền (ví dụ:waddwstr()) và các hàm byte khác (ví dụ:waddstr()).Sử dụng mã hóa miền địa phương thay vì
utf-8để mã hóa chuỗi Unicode.curses.windowcó thuộc tínhcurses.window.encodingmới.Lớp
curses.windowcó phương thứcget_wch()mới để có được ký tự rộngMô-đun
cursescó chức năngunget_wch()mới để đẩy một ký tự rộng đểget_wch()tiếp theo sẽ trả về nó
(Được đóng góp bởi Iñigo Serna trong bpo-6755.)
ngày giờ¶
So sánh bình đẳng giữa các phiên bản
datetimengây thơ và nhận thức hiện trả vềFalsethay vì tăngTypeError(bpo-15006).Phương thức
datetime.datetime.timestamp()mới: Trả về dấu thời gian POSIX tương ứng với phiên bảndatetime.Phương pháp
datetime.datetime.strftime()hỗ trợ định dạng năm cũ hơn 1000.Phương thức
datetime.datetime.astimezone()hiện có thể được gọi mà không cần đối số để chuyển đổi phiên bản datetime thành múi giờ của hệ thống.
số thập phân¶
- bpo-7652 - tích hợp số học thập phân gốc nhanh.
Mô-đun C và libmpdec được viết bởi Stefan Krah.
Phiên bản C mới của mô-đun thập phân tích hợp thư viện libmpdec tốc độ cao để có được số học dấu phẩy động thập phân được làm tròn chính xác một cách chính xác tùy ý. libmpdec tuân thủ Đặc tả số học thập phân chung của IBM.
Mức tăng hiệu suất dao động từ 10 lần cho các ứng dụng cơ sở dữ liệu đến 100 lần cho các ứng dụng chuyên sâu về số lượng. Những con số này là mức tăng dự kiến cho độ chính xác tiêu chuẩn được sử dụng trong số học dấu phẩy động thập phân. Vì độ chính xác có thể được người dùng cấu hình nên số liệu chính xác có thể khác nhau. Ví dụ, trong số học số nguyên lớn, sự khác biệt có thể cao hơn đáng kể.
Bảng dưới đây có ý nghĩa như một minh họa. Điểm chuẩn có sẵn tại https://www.bytereef.org/mpdecimal/quickstart.html.
thập phân.py
_thập phân
tăng tốc
số pi
42,02 giây
0,345 giây
120x
công ty viễn thông
172,19 giây
5,68 giây
30 lần
bệnh tâm thần
3,57 giây
0,29 giây
12x
Tính năng¶
Tín hiệu
FloatOperationtùy chọn cho phép ngữ nghĩa chặt chẽ hơn để trộn số float và số thập phân.Nếu Python được biên dịch mà không có luồng, phiên bản C sẽ tự động vô hiệu hóa bộ máy bối cảnh cục bộ của luồng đắt tiền. Trong trường hợp này, biến
HAVE_THREADSđược đặt thànhFalse.
thay đổi API¶
Mô-đun C có các giới hạn ngữ cảnh sau, tùy thuộc vào kiến trúc máy:
Trong các mẫu ngữ cảnh (
DefaultContext,BasicContextvàExtendedContext), cường độ củaEmaxvàEminđã thay đổi thành999999.Hàm tạo
Decimaltrong thập phân.py không tuân theo các giới hạn ngữ cảnh và chuyển đổi các giá trị với số mũ tùy ý hoặc độ chính xác một cách chính xác. Vì phiên bản C có giới hạn bên trong nên sơ đồ sau được sử dụng: Nếu có thể, các giá trị được chuyển đổi chính xác, nếu không thìInvalidOperationđược nâng lên và kết quả là NaN. Trong trường hợp sau, luôn có thể sử dụngcreate_decimal()để thu được giá trị làm tròn hoặc không chính xác.Hàm lũy thừa trong số thập phân.py luôn được làm tròn chính xác. Trong phiên bản C, nó được xác định theo các hàm
exp()vàln()được làm tròn chính xác, nhưng kết quả cuối cùng chỉ là "gần như luôn được làm tròn chính xác".Trong phiên bản C, từ điển ngữ cảnh chứa các tín hiệu là
MutableMapping. Vì lý do tốc độ,flagsvàtrapsluôn đề cập đến cùng mộtMutableMappingmà ngữ cảnh được khởi tạo. Nếu một từ điển tín hiệu mới được chỉ định,flagsvàtrapssẽ được cập nhật với các giá trị mới nhưng chúng không tham chiếu đến từ điển RHS.Việc chọn
Contextsẽ tạo ra một đầu ra khác để có định dạng trao đổi chung cho phiên bản Python và C.Thứ tự các đối số trong hàm tạo
Contextđã được thay đổi để khớp với thứ tự được hiển thị bởirepr().Tham số
watchexptrong phương thứcquantize()không được dùng nữa.
email¶
Khung chính sách¶
Gói email hiện có khung policy. Zz001zz là một đối tượng có một số phương thức và thuộc tính kiểm soát cách hoạt động của gói email. Chính sách chính cho Python 3.3 là chính sách Compat32, cung cấp khả năng tương thích ngược với gói email trong Python 3.2. Một policy có thể được chỉ định khi một email được phân tích cú pháp bởi parser hoặc khi một đối tượng Message được tạo hoặc khi một email được tuần tự hóa bằng generator. Trừ khi bị ghi đè, chính sách được chuyển tới parser sẽ được kế thừa bởi tất cả đối tượng Message và các đối tượng phụ do parser tạo. Theo mặc định, generator sẽ sử dụng chính sách của đối tượng Message mà nó đang tuần tự hóa. Chính sách mặc định là compat32.
Bộ điều khiển tối thiểu được triển khai bởi tất cả các đối tượng policy là:
max_line_length |
Độ dài tối đa, không bao gồm (các) ký tự dòng, các dòng riêng lẻ có thể có khi |
dòng |
Ký tự được sử dụng để phân tách các dòng riêng lẻ khi |
cte_type |
|
raise_on_defect |
Làm cho |
Một phiên bản chính sách mới, với các cài đặt mới, được tạo bằng phương thức clone() của các đối tượng chính sách. clone lấy bất kỳ điều khiển nào ở trên làm đối số từ khóa. Mọi điều khiển không được chỉ định trong cuộc gọi sẽ giữ nguyên giá trị mặc định của nó. Vì vậy, bạn có thể tạo chính sách sử dụng các ký tự dòng \r\n như thế này
mypolicy = compat32.clone(linesep='\r\n')
Các chính sách có thể được sử dụng để làm cho việc tạo thông báo theo định dạng mà ứng dụng của bạn cần trở nên đơn giản hơn. Thay vì phải nhớ chỉ định linesep='\r\n' ở tất cả các vị trí mà bạn gọi là generator, bạn có thể chỉ định nó một lần, khi bạn đặt chính sách được parser hoặc Message sử dụng, tùy theo chương trình của bạn sử dụng để tạo đối tượng Message. Mặt khác, nếu bạn cần tạo thông báo ở nhiều dạng, bạn vẫn có thể chỉ định các tham số trong lệnh gọi generator thích hợp. Hoặc bạn có thể có các phiên bản chính sách tùy chỉnh cho các trường hợp khác nhau của mình và chuyển chúng vào khi bạn tạo generator.
Chính sách tạm thời với tiêu đề mới API¶
Mặc dù bản thân khung chính sách đã có giá trị nhưng động lực chính để giới thiệu nó là cho phép tạo ra các chính sách mới triển khai các tính năng mới cho gói email theo cách duy trì khả năng tương thích ngược cho những người không sử dụng chính sách mới. Vì các chính sách mới giới thiệu API mới nên chúng tôi sẽ phát hành chúng trong Python 3.3 dưới dạng provisional policy. Những thay đổi không tương thích ngược (tối đa và bao gồm cả việc xóa mã) có thể xảy ra nếu các nhà phát triển cốt lõi thấy cần thiết.
Các chính sách mới là phiên bản của EmailPolicy và thêm các điều khiển bổ sung sau:
refold_source |
Kiểm soát xem các tiêu đề được phân tích cú pháp bởi |
tiêu đề_factory |
Một lệnh gọi có thể nhận |
Zz000zz là chìa khóa cho các tính năng mới được cung cấp bởi các chính sách mới. Khi một trong các chính sách mới được sử dụng, mọi tiêu đề được truy xuất từ đối tượng Message đều là đối tượng do header_factory tạo ra và bất kỳ khi nào bạn đặt tiêu đề trên Message, tiêu đề đó sẽ trở thành đối tượng do header_factory tạo ra. Tất cả các đối tượng tiêu đề như vậy đều có thuộc tính name bằng tên tiêu đề. Tiêu đề Địa chỉ và Ngày có các thuộc tính bổ sung cung cấp cho bạn quyền truy cập vào dữ liệu được phân tích cú pháp của tiêu đề. Điều này có nghĩa là bây giờ bạn có thể làm những việc như thế này:
>>> m = Tin nhắn(chính sách=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].địa chỉ
(Địa chỉ(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].tên người dùng
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Ngày']
'Thứ Sáu, ngày 25 tháng 5 năm 2012 21:44:27 -0400'
>>> in(m)
Tới: =?utf-8?q?=C3=89ric?= <foo@example.com>
Ngày: Thứ sáu, ngày 25 tháng 5 năm 2012 21:44:27 -0400
Bạn sẽ lưu ý rằng tên hiển thị unicode được tự động mã hóa thành utf-8 khi tin nhắn được tuần tự hóa, nhưng khi tiêu đề được truy cập trực tiếp, bạn sẽ nhận được phiên bản unicode. Điều này giúp loại bỏ mọi nhu cầu xử lý các hàm email.header decode_header() hoặc make_header().
Bạn cũng có thể tạo địa chỉ từ các phần:
>>> m['cc'] = [Nhóm('pals', [Địa chỉ('Bob', 'bob', 'example.com'),
... Địa chỉ('Sally', 'sally', 'example.com')]),
... Địa chỉ('Bonzo', addr_spec='bonz@laugh.com')]
>>> in(m)
Tới: =?utf-8?q?=C3=89ric?= <foo@example.com>
Ngày: Thứ sáu, ngày 25 tháng 5 năm 2012 21:44:27 -0400
cc: bạn bè: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
Việc giải mã sang unicode được thực hiện tự động:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
Khi phân tích tin nhắn, bạn có thể sử dụng thuộc tính addresses và groups của đối tượng tiêu đề để truy cập các nhóm và địa chỉ riêng lẻ:
>>> m2['cc'].địa chỉ
(Địa chỉ(display_name='Bob', username='bob', domain='example.com'), Địa chỉ(display_name='Sally', username='sally', domain='example.com'), Địa chỉ(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Nhóm(display_name='pals',address=(Địa chỉ(display_name='Bob', username='bob', domain='example.com'), Địa chỉ(display_name='Sally', username='sally', domain='example.com')), Nhóm(display_name=None,address=(Địa chỉ(display_name='Bonzo', username='bonz', domain='laugh.com'),))
Tóm lại, nếu bạn sử dụng một trong các chính sách mới, thao tác tiêu đề sẽ hoạt động theo đúng cách: ứng dụng của bạn hoạt động với chuỗi unicode và gói email mã hóa và giải mã unicode một cách minh bạch đến và từ Mã hóa truyền nội dung tiêu chuẩn RFC.
Những thay đổi khác của API¶
Zz000zz mới, được thêm vào mô-đun parser để bổ sung cho HeaderParser và hoàn thiện Byte API.
Chức năng tiện ích mới:
format_datetime(): chodatetime, tạo một chuỗi được định dạng để sử dụng trong tiêu đề email.parsedate_to_datetime(): được cung cấp một chuỗi ngày từ tiêu đề email, chuyển đổi nó thànhdatetimecó thể nhận biết được hoặcdatetimengây thơ nếu phần bù là-0000.localtime(): Không có đối số, trả về giờ địa phương hiện tại dưới dạngdatetimenhận biết được bằng cách sử dụngtimezonecục bộ. Đưa ra mộtdatetimenhận biết được, hãy chuyển đổi nó thành mộtdatetimenhận biết được bằng cách sử dụngtimezonecục bộ.
ftplib¶
ftplib.FTPhiện chấp nhận đối số từ khóasource_addressđể chỉ định(host, port)sẽ sử dụng làm địa chỉ nguồn trong lệnh gọi liên kết khi tạo ổ cắm đi. (Được đóng góp bởi Giampaolo Rodolà trong bpo-8594.)Lớp
FTP_TLShiện cung cấp chức năngccc()mới để hoàn nguyên kênh điều khiển về dạng bản rõ. Điều này có thể hữu ích để tận dụng tường lửa biết cách xử lý NAT với FTP không an toàn mà không cần mở các cổng cố định. (Được đóng góp bởi Giampaolo Rodolà trong bpo-12139.)Đã thêm phương thức
ftplib.FTP.mlsd()cung cấp định dạng danh sách thư mục có thể phân tích cú pháp và không dùngftplib.FTP.nlst()vàftplib.FTP.dir(). (Được đóng góp bởi Giampaolo Rodolà trong bpo-11072.)
công cụ chức năng¶
Trình trang trí functools.lru_cache() hiện chấp nhận đối số từ khóa typed (mặc định là False để đảm bảo rằng nó lưu trữ các giá trị thuộc các loại khác nhau so sánh bằng nhau trong các khe bộ đệm riêng biệt. (Được đóng góp bởi Raymond Hettinger trong bpo-13227.)
gc¶
Giờ đây, bạn có thể đăng ký các cuộc gọi lại được trình thu gom rác gọi trước và sau khi thu thập bằng danh sách callbacks mới.
hmac¶
Một chức năng compare_digest() mới đã được thêm vào để ngăn chặn các cuộc tấn công kênh bên vào thông báo thông qua phân tích thời gian. (Được đóng góp bởi Nick Coghlan và Christian Heimes trong bpo-15061.)
http¶
http.server.BaseHTTPRequestHandler hiện đệm các tiêu đề và ghi tất cả chúng cùng một lúc khi end_headers() được gọi. Một phương pháp mới flush_headers() có thể được sử dụng để quản lý trực tiếp thời điểm gửi các tiêu đề tích lũy. (Được đóng góp bởi Andrew Schaaf trong bpo-3709.)
http.server hiện tạo ra đầu ra HTML 4.01 strict hợp lệ. (Được đóng góp bởi Ezio Melotti trong bpo-13295.)
http.client.HTTPResponse hiện có phương thức readinto(), có nghĩa là nó có thể được sử dụng như một lớp io.RawIOBase. (Được đóng góp bởi John Kuhn trong bpo-13464.)
html¶
html.parser.HTMLParser hiện có thể phân tích cú pháp đánh dấu bị hỏng mà không gây ra lỗi, do đó, đối số strict của hàm tạo và ngoại lệ HTMLParseError hiện không được dùng nữa. Khả năng phân tích cú pháp đánh dấu bị hỏng là kết quả của một số bản sửa lỗi cũng có sẵn trên các bản phát hành sửa lỗi mới nhất của Python 2.7/3.2. (Được đóng góp bởi Ezio Melotti trong bpo-15114, và bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)
Một từ điển html5 mới ánh xạ các tham chiếu ký tự có tên HTML5 tới (các) ký tự Unicode tương đương (ví dụ: html5['gt;'] == '>') đã được thêm vào mô-đun html.entities. Từ điển hiện cũng được HTMLParser sử dụng. (Được đóng góp bởi Ezio Melotti trong bpo-11113 và bpo-15156.)
imaplib¶
Hàm tạo IMAP4_SSL hiện chấp nhận tham số SSLContext để kiểm soát các tham số của kênh bảo mật.
(Được đóng góp bởi Sijin Joseph trong bpo-8808.)
kiểm tra¶
Một chức năng getclosurevars() mới đã được thêm vào. Hàm này báo cáo ràng buộc hiện tại của tất cả các tên được tham chiếu từ nội dung hàm và nơi các tên đó được giải quyết, giúp xác minh trạng thái nội bộ chính xác dễ dàng hơn khi kiểm tra mã dựa trên các trạng thái đóng.
(Được đóng góp bởi Meador Inge và Nick Coghlan trong bpo-13062.)
Một chức năng getgeneratorlocals() mới đã được thêm vào. Hàm này báo cáo ràng buộc hiện tại của các biến cục bộ trong khung ngăn xếp của trình tạo, giúp xác minh trạng thái bên trong chính xác dễ dàng hơn khi kiểm tra trình tạo.
(Được đóng góp bởi Meador Inge trong bpo-15153.)
io¶
Hàm open() có chế độ 'x' mới có thể được sử dụng để tạo riêng một tệp mới và tăng FileExistsError nếu tệp đã tồn tại. Nó dựa trên chế độ C11 'x' của fopen().
(Được đóng góp bởi David Townshend trong bpo-12760.)
Hàm tạo của lớp TextIOWrapper có một đối số tùy chọn write_through mới. Nếu write_through là True, các lệnh gọi tới write() được đảm bảo không bị lưu vào bộ đệm: mọi dữ liệu được ghi trên đối tượng TextIOWrapper sẽ được xử lý ngay lập tức vào bộ đệm nhị phân cơ bản của nó.
itertools¶
accumulate() hiện có một đối số func tùy chọn để cung cấp hàm nhị phân do người dùng cung cấp.
khai thác gỗ¶
Hàm basicConfig() hiện hỗ trợ đối số handlers tùy chọn để thêm một trình xử lý lặp lại vào trình ghi nhật ký gốc.
Một thuộc tính cấp độ lớp append_nul đã được thêm vào SysLogHandler để cho phép kiểm soát việc gắn thêm byte NUL (\000) vào các bản ghi nhật ký hệ thống, vì đối với một số daemon, nó là bắt buộc trong khi đối với một số daemon khác, nó được chuyển qua nhật ký.
môn toán¶
Mô-đun math có một hàm mới, log2(), trả về logarit cơ số 2 của x.
(Được viết bởi Mark Dickinson trong bpo-11888.)
mmap¶
Phương thức read() hiện tương thích hơn với các đối tượng giống tệp khác: nếu đối số bị bỏ qua hoặc được chỉ định là None, nó sẽ trả về các byte từ vị trí tệp hiện tại đến cuối ánh xạ. (Được đóng góp bởi Petri Lehtinen trong bpo-12021.)
đa xử lý¶
Chức năng multiprocessing.connection.wait() mới cho phép thăm dò nhiều đối tượng (chẳng hạn như kết nối, ổ cắm và đường ống) với thời gian chờ. (Được đóng góp bởi Richard Oudkerk trong bpo-12328.)
Các đối tượng multiprocessing.connection.Connection hiện có thể được truyền qua các kết nối đa xử lý. (Được đóng góp bởi Richard Oudkerk trong bpo-4892.)
multiprocessing.Process hiện chấp nhận đối số từ khóa daemon để ghi đè hành vi mặc định kế thừa cờ daemon từ quy trình gốc (bpo-6064).
Thuộc tính mới multiprocessing.Process.sentinel cho phép chương trình chờ trên nhiều đối tượng Process cùng một lúc bằng cách sử dụng các nguyên hàm hệ điều hành thích hợp (ví dụ: select trên hệ thống posix).
Các phương thức mới multiprocessing.pool.Pool.starmap() và starmap_async() cung cấp itertools.starmap() tương đương với các hàm multiprocessing.pool.Pool.map() và map_async() hiện có. (Được đóng góp bởi Hynek Schlawack trong bpo-12708.)
nntplib¶
Lớp nntplib.NNTP hiện hỗ trợ giao thức quản lý ngữ cảnh để sử dụng các ngoại lệ socket.error một cách vô điều kiện và đóng kết nối NNTP khi hoàn tất:
>>> từ nntplib nhập NNTP
>>> với NNTP('news.gmane.org') là n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(Được đóng góp bởi Giampaolo Rodolà trong bpo-9795.)
hệ điều hành¶
Mô-đun
oscó chức năngpipe2()mới cho phép tạo một đường ống có cờO_CLOEXEChoặcO_NONBLOCKđược đặt nguyên tử. Điều này đặc biệt hữu ích để tránh tình trạng chạy đua trong các chương trình đa luồng.Mô-đun
oscó chức năngsendfile()mới cung cấp cách "không sao chép" hiệu quả để sao chép dữ liệu từ bộ mô tả tệp (hoặc ổ cắm) này sang bộ mô tả tệp khác. Cụm từ "không sao chép" đề cập đến thực tế là tất cả việc sao chép dữ liệu giữa hai bộ mô tả được thực hiện hoàn toàn bởi hạt nhân, không sao chép dữ liệu vào bộ đệm không gian người dùng.sendfile()có thể được sử dụng để sao chép dữ liệu một cách hiệu quả từ một tệp trên đĩa sang ổ cắm mạng, ví dụ: để tải xuống một tập tin.(Bản vá do Ross Lagerwall và Giampaolo Rodolà gửi trong bpo-10882.)
Để tránh các điều kiện xung đột như tấn công liên kết tượng trưng và các sự cố với các tệp và thư mục tạm thời, việc thao tác các bộ mô tả tệp thay vì tên tệp sẽ đáng tin cậy hơn (và cũng nhanh hơn). Python 3.3 cải tiến các hàm hiện có và giới thiệu các hàm mới để hoạt động trên các bộ mô tả tệp (bpo-4761, bpo-10755 và bpo-14626).
Mô-đun
oscó chức năngfwalk()mới tương tự nhưwalk()ngoại trừ việc nó cũng mang lại các bộ mô tả tệp tham chiếu đến các thư mục đã truy cập. Điều này đặc biệt hữu ích để tránh các cuộc đua liên kết tượng trưng.Các chức năng sau đây có tùy chọn mới dir_fd (paths relative to directory descriptors) và/hoặc follow_symlinks (not following symlinks):
access(),chflags(),chmod(),chown(),link(),lstat(),mkdir(),mkfifo(),mknod(),open(),readlink(),remove(),rename(),replace(),rmdir(),stat(),symlink(),unlink(),utime(). Có thể kiểm tra sự hỗ trợ của nền tảng cho việc sử dụng các tham số này thông qua bộos.supports_dir_fdvàos.supports_follow_symlinks.Các hàm sau hiện hỗ trợ bộ mô tả tệp cho đối số đường dẫn của chúng:
chdir(),chmod(),chown(),execve(),listdir(),pathconf(),exists(),stat(),statvfs(),utime(). Hỗ trợ nền tảng cho việc này có thể được kiểm tra thông qua bộos.supports_fd.
access()chấp nhận đối số từ khóaeffective_idsđể bật bằng cách sử dụng uid/gid hiệu quả thay vì uid/gid thực trong kiểm tra quyền truy cập. Hỗ trợ nền tảng cho việc này có thể được kiểm tra thông qua bộsupports_effective_ids.Mô-đun
oscó hai chức năng mới:getpriority()vàsetpriority(). Chúng có thể được sử dụng để lấy hoặc thiết lập mức độ ưu tiên/độ ưu tiên của quy trình theo cách tương tự nhưos.nice()nhưng được mở rộng cho tất cả các quy trình thay vì chỉ quy trình hiện tại.(Bản vá được gửi bởi Giampaolo Rodolà trong bpo-10784.)
Chức năng
os.replace()mới cho phép đổi tên tệp trên nhiều nền tảng bằng cách ghi đè đích. Vớios.rename(), tệp đích hiện có bị ghi đè dưới POSIX nhưng lại phát sinh lỗi trong Windows. (Được đóng góp bởi Antoine Pitrou trong bpo-8828.)Nhóm chức năng stat (
stat(),fstat()vàlstat()) hiện hỗ trợ đọc dấu thời gian của tệp với độ chính xác nano giây. Một cách đối xứng,utime()hiện có thể ghi dấu thời gian của tệp với độ chính xác nano giây. (Được đóng góp bởi Larry Hastings trong bpo-14127.)Hàm
os.get_terminal_size()mới truy vấn kích thước của thiết bị đầu cuối được gắn vào bộ mô tả tệp. Xem thêmshutil.get_terminal_size(). (Được đóng góp bởi Zbigniew Jędrzejewski-Szmek trong bpo-13609.)
Các chức năng mới hỗ trợ các thuộc tính mở rộng của Linux (bpo-12720):
getxattr(),listxattr(),removexattr(),setxattr().Giao diện mới cho lịch trình. Các chức năng này kiểm soát cách một quá trình được hệ điều hành phân bổ thời gian CPU. Các chức năng mới:
sched_get_priority_max(),sched_get_priority_min(),sched_getaffinity(),sched_getparam(),sched_getscheduler(),sched_rr_get_interval(),sched_setaffinity(),sched_setparam(),sched_setscheduler(),sched_yield(),Các chức năng mới để kiểm soát hệ thống tập tin:
posix_fadvise(): Thông báo ý định truy cập dữ liệu theo một mẫu cụ thể, do đó cho phép kernel thực hiện tối ưu hóa.posix_fallocate(): Đảm bảo có đủ dung lượng ổ đĩa được phân bổ cho một tệp.sync(): Buộc ghi mọi thứ vào đĩa.
Các chức năng posix mới bổ sung:
lockf(): Áp dụng, kiểm tra hoặc xóa khóa POSIX trên bộ mô tả tệp đang mở.pread(): Đọc từ bộ mô tả tệp ở phần bù, phần bù tệp không thay đổi.pwrite(): Ghi vào bộ mô tả tệp từ phần bù, giữ nguyên phần bù tệp.readv(): Đọc từ bộ mô tả tệp vào một số bộ đệm có thể ghi.truncate(): Cắt bớt tệp tương ứng với path, sao cho nó có kích thước tối đa là length byte.waitid(): Đợi hoàn thành một hoặc nhiều tiến trình con.writev(): Ghi nội dung của buffers vào bộ mô tả tệp, trong đó buffers là một chuỗi bộ đệm tùy ý.getgrouplist()(bpo-9344): Trả về danh sách id nhóm mà người dùng được chỉ định thuộc về.
times()vàuname(): Kiểu trả về đã thay đổi từ một bộ dữ liệu thành một đối tượng giống bộ dữ liệu với các thuộc tính được đặt tên.Một số nền tảng hiện hỗ trợ các hằng số bổ sung cho hàm
lseek(), chẳng hạn nhưos.SEEK_HOLEvàos.SEEK_DATA.Các hằng số mới
RTLD_LAZY,RTLD_NOW,RTLD_GLOBAL,RTLD_LOCAL,RTLD_NODELETE,RTLD_NOLOADvàRTLD_DEEPBINDcó sẵn trên các nền tảng hỗ trợ chúng. Chúng được sử dụng với hàmsys.setdlopenflags()và thay thế các hằng số tương tự được xác định trongctypesvàDLFCN. (Được đóng góp bởi Victor Stinner trong bpo-13226.)os.symlink()hiện chấp nhận (và bỏ qua) đối số từ khóatarget_is_directorytrên các nền tảng không phải Windows, để dễ dàng hỗ trợ đa nền tảng.
pdb¶
Tính năng hoàn thành tab hiện không chỉ khả dụng cho tên lệnh mà còn cho cả đối số của chúng. Ví dụ: đối với lệnh break, tên hàm và tên tệp đã hoàn thành.
(Được đóng góp bởi Georg Brandl trong bpo-14210)
dưa chua¶
Các đối tượng pickle.Pickler hiện có thuộc tính dispatch_table tùy chọn cho phép thiết lập các chức năng giảm thiểu trên mỗi bộ chọn.
(Được đóng góp bởi Richard Oudkerk trong bpo-14166.)
pydoc¶
Hàm Tk GUI và serve() đã bị xóa khỏi mô-đun pydoc: pydoc -g và serve() không được dùng nữa trong Python 3.2.
lại¶
Biểu thức chính quy str hiện hỗ trợ các lối thoát \u và \U.
(Được đóng góp bởi Serhiy Storchaka trong bpo-3665.)
đã lên lịch¶
run()hiện chấp nhận tham số blocking mà khi được đặt thành false sẽ khiến phương thức thực thi các sự kiện đã lên lịch do hết hạn sớm nhất (nếu có) và sau đó quay lại ngay lập tức. Điều này hữu ích trong trường hợp bạn muốn sử dụngschedulertrong các ứng dụng không chặn. (Được đóng góp bởi Giampaolo Rodolà trong bpo-13449.)Lớp
schedulerhiện có thể được sử dụng an toàn trong môi trường đa luồng. (Được đóng góp bởi Josiah Carlson và Giampaolo Rodolà trong bpo-8684.)Các tham số timefunc và delayfunct của hàm tạo lớp
schedulerhiện là tùy chọn và được mặc định lần lượt làtime.time()vàtime.sleep(). (Được đóng góp bởi Chris Clark trong bpo-13245.)Tham số
enter()vàenterabs()argument hiện là tùy chọn. (Được đóng góp bởi Chris Clark trong bpo-13245.)enter()vàenterabs()hiện chấp nhận tham số kwargs. (Được đóng góp bởi Chris Clark trong bpo-13245.)
chọn¶
Solaris và các nền tảng phái sinh có lớp select.devpoll mới dành cho ổ cắm không đồng bộ hiệu suất cao thông qua /dev/poll. (Được đóng góp bởi Jesús Cea Avión trong bpo-6397.)
shlex¶
Hàm trợ giúp không có giấy tờ trước đây quote từ mô-đun pipes đã được chuyển sang mô-đun shlex và được ghi lại. quote() thoát đúng cách tất cả các ký tự trong một chuỗi có thể được shell gán cho ý nghĩa đặc biệt.
im lặng¶
Chức năng mới:
disk_usage(): cung cấp số liệu thống kê về tổng dung lượng đĩa đã sử dụng và dung lượng trống. (Được đóng góp bởi Giampaolo Rodolà trong bpo-12442.)chown(): cho phép một người thay đổi người dùng và/hoặc nhóm của đường dẫn đã cho, đồng thời chỉ định tên người dùng/nhóm chứ không chỉ id số của họ. (Được đóng góp bởi Sandro Tosi trong bpo-12191.)shutil.get_terminal_size(): trả về kích thước của cửa sổ terminal mà trình thông dịch được đính kèm. (Được đóng góp bởi Zbigniew Jędrzejewski-Szmek trong bpo-13609.)
copy2()vàcopystat()hiện lưu giữ dấu thời gian của tệp với độ chính xác nano giây trên các nền tảng hỗ trợ nó. Họ cũng bảo tồn tập tin "thuộc tính mở rộng" trên Linux. (Được đóng góp bởi Larry Hastings trong bpo-14127 và bpo-15238.)Một số hàm hiện có một đối số
symlinkstùy chọn: khi tham số đó là đúng, các liên kết tượng trưng không bị hủy tham chiếu và thay vào đó, thao tác sẽ hoạt động trên chính liên kết tượng trưng đó (hoặc tạo một liên kết tượng trưng, nếu có liên quan). (Được đóng góp bởi Hynek Schlawack trong bpo-12715.)Khi sao chép tệp sang hệ thống tệp khác,
move()hiện xử lý các liên kết tượng trưng theo cách mà lệnh posixmvthực hiện, tạo lại liên kết tượng trưng thay vì sao chép nội dung tệp đích. (Được đóng góp bởi Jonathan Niehof trong bpo-9993.)move()hiện cũng trả về đối sốdstlàm kết quả của nó.rmtree()hiện có khả năng chống lại các cuộc tấn công liên kết tượng trưng trên các nền tảng hỗ trợ tham sốdir_fdmới trongos.open()vàos.unlink(). (Được đóng góp bởi Martin von Löwis và Hynek Schlawack trong bpo-4489.)
tín hiệu¶
Mô-đun
signalcó các chức năng mới:pthread_sigmask(): tìm nạp và/hoặc thay đổi mặt nạ tín hiệu của luồng gọi (Được đóng góp bởi Jean-Paul Calderone trong bpo-8407);pthread_kill(): gửi tín hiệu đến một luồng;sigpending(): kiểm tra các hàm đang chờ xử lý;sigwait(): chờ tín hiệu;sigwaitinfo(): chờ tín hiệu, trả về thông tin chi tiết về tín hiệu đó;sigtimedwait(): giốngsigwaitinfo()nhưng có thời gian chờ.
Trình xử lý tín hiệu ghi số tín hiệu dưới dạng một byte thay vì byte nul vào bộ mô tả tệp đánh thức. Vì vậy, có thể đợi nhiều hơn một tín hiệu và biết tín hiệu nào đã được đưa ra.
signal.signal()vàsignal.siginterrupt()đưa ra OSError, thay vì RuntimeError: OSError có thuộc tính errno.
smtpd¶
Mô-đun smtpd hiện hỗ trợ RFC 5321 (SMTP mở rộng) và RFC 1870 (mở rộng kích thước). Theo tiêu chuẩn, các tiện ích mở rộng này được bật khi và chỉ khi máy khách bắt đầu phiên bằng lệnh EHLO.
(Hỗ trợ ELHO ban đầu bởi Alberto Trevino. Phần mở rộng kích thước của Juhana Jauhiainen. Công việc bổ sung đáng kể trên bản vá do Michele Orrù và Dan Boswell đóng góp. bpo-8739)
smtplib¶
Các lớp SMTP, SMTP_SSL và LMTP hiện chấp nhận đối số từ khóa source_address để chỉ định (host, port) để sử dụng làm địa chỉ nguồn trong lệnh gọi liên kết khi tạo ổ cắm gửi đi. (Được đóng góp bởi Paulo Scardine trong bpo-11281.)
SMTP hiện hỗ trợ giao thức quản lý ngữ cảnh, cho phép sử dụng phiên bản SMTP trong câu lệnh with. (Được đóng góp bởi Giampaolo Rodolà trong bpo-11289.)
Hàm tạo SMTP_SSL và phương thức starttls() hiện chấp nhận tham số SSLContext để kiểm soát các tham số của kênh bảo mật. (Được đóng góp bởi Kasun Herath trong bpo-8809.)
ổ cắm¶
Lớp
sockethiện hiển thị các phương thức bổ sung để xử lý dữ liệu phụ trợ khi được nền tảng cơ bản hỗ trợ:(Được đóng góp bởi David Watson trong bpo-6560, dựa trên bản vá trước đó của Heiko Wundram)
Lớp
sockethiện hỗ trợ họ giao thức PF_CAN (https://en.wikipedia.org/wiki/Socketcan), trên Linux (https://lwn.net/Articles/253425).(Được đóng góp bởi Matthias Fuchs, được cập nhật bởi Tiago Gonçalves trên bpo-10141.)
Lớp
sockethiện hỗ trợ họ giao thức PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets và https://oss.oracle.com/projects/rds).Lớp
sockethiện hỗ trợ họ giao thứcPF_SYSTEMtrên OS X. (Được đóng góp bởi Michael Goderbauer trong bpo-13777.)Chức năng mới
sethostname()cho phép đặt tên máy chủ trên hệ thống Unix nếu quá trình gọi có đủ đặc quyền. (Được đóng góp bởi Ross Lagerwall trong bpo-10866.)
máy chủ ổ cắm¶
BaseServer hiện có một phương thức có thể ghi đè service_actions() được gọi bằng phương thức serve_forever() trong vòng lặp dịch vụ. ForkingMixIn hiện sử dụng tính năng này để dọn sạch các tiến trình con của zombie. (Được đóng góp bởi Justin Warkentin trong bpo-11109.)
sqlite3¶
Phương pháp sqlite3.Connection mới set_trace_callback() có thể được sử dụng để ghi lại dấu vết của tất cả các lệnh sql được xử lý bởi sqlite. (Được đóng góp bởi Torsten Landschoff trong bpo-11688.)
ssl¶
Mô-đun
sslcó hai chức năng tạo ngẫu nhiên mới:RAND_bytes(): tạo các byte giả ngẫu nhiên mạnh về mặt mật mã.RAND_pseudo_bytes(): tạo byte giả ngẫu nhiên.
(Được đóng góp bởi Victor Stinner trong bpo-12049.)
Mô-đun
sslhiện hiển thị hệ thống phân cấp ngoại lệ chi tiết hơn để giúp kiểm tra các loại lỗi khác nhau dễ dàng hơn. (Được đóng góp bởi Antoine Pitrou trong bpo-11183.)load_cert_chain()hiện chấp nhận đối số password để sử dụng nếu khóa riêng được mã hóa. (Được đóng góp bởi Adam Simpkins trong bpo-12803.)Trao đổi khóa Diffie-Hellman, cả thông thường và dựa trên Đường cong Elliptic, hiện được hỗ trợ thông qua các phương thức
load_dh_params()vàset_ecdh_curve(). (Được đóng góp bởi Antoine Pitrou trong bpo-13626 và bpo-13627.)Ổ cắm SSL có phương thức
get_channel_binding()mới cho phép thực hiện một số cơ chế xác thực nhất định như SCRAM-SHA-1-PLUS. (Được đóng góp bởi Jacek Konieczny trong bpo-12551.)Bạn có thể truy vấn thuật toán nén SSL được ổ cắm SSL sử dụng nhờ phương pháp
compression()mới. Thuộc tính mớiOP_NO_COMPRESSIONcó thể được sử dụng để tắt tính năng nén. (Được đóng góp bởi Antoine Pitrou trong bpo-13634.)Đã thêm hỗ trợ cho tiện ích mở rộng Đàm phán Giao thức Tiếp theo bằng phương pháp
ssl.SSLContext.set_npn_protocols(). (Được đóng góp bởi Colin Marc trong bpo-14204.)Giờ đây, lỗi SSL có thể được xem xét nội tâm dễ dàng hơn nhờ các thuộc tính
libraryvàreason. (Được đóng góp bởi Antoine Pitrou trong bpo-14837.)Chức năng
get_server_certificate()hiện hỗ trợ IPv6. (Được đóng góp bởi Charles-François Natali trong bpo-11811.)Thuộc tính mới
OP_CIPHER_SERVER_PREFERENCEcho phép thiết lập ổ cắm máy chủ SSLv3 để sử dụng tùy chọn đặt hàng mật mã của máy chủ thay vì của máy khách (bpo-13635).
chỉ số¶
Hàm tarfile.filemode không có giấy tờ đã được chuyển sang stat.filemode(). Nó có thể được sử dụng để chuyển đổi chế độ của tệp thành một chuỗi có dạng '-rwxrwxrwx'.
(Được đóng góp bởi Giampaolo Rodolà trong bpo-14807.)
cấu trúc¶
Mô-đun struct hiện hỗ trợ ssize_t và size_t thông qua các mã mới tương ứng là n và N. (Được đóng góp bởi Antoine Pitrou trong bpo-3163.)
quy trình con¶
Chuỗi lệnh bây giờ có thể là đối tượng byte trên nền tảng posix. (Được đóng góp bởi Victor Stinner trong bpo-8513.)
Một hằng số DEVNULL mới cho phép chặn đầu ra theo kiểu không phụ thuộc vào nền tảng. (Được đóng góp bởi Ross Lagerwall trong bpo-5870.)
hệ thống¶
Mô-đun sys có thread_info named tuple mới chứa thông tin về việc triển khai luồng (bpo-11223).
hồ dầu¶
tarfile hiện hỗ trợ mã hóa lzma thông qua mô-đun lzma. (Được đóng góp bởi Lars Gustäbel trong bpo-5689.)
tập tin tạm thời¶
Phương thức truncate() của tempfile.SpooledTemporaryFile hiện chấp nhận tham số size. (Được đóng góp bởi Ryan Kelly trong bpo-9957.)
bọc văn bản¶
Mô-đun textwrap có indent() mới giúp dễ dàng thêm tiền tố chung vào các dòng đã chọn trong khối văn bản (bpo-13857).
luồng¶
threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event và threading.Timer, tất cả đều từng là các hàm xuất xưởng trả về một thể hiện của lớp, giờ đây là các lớp và có thể được phân lớp con. (Được đóng góp bởi Éric Araujo trong bpo-10968.)
Hàm tạo threading.Thread hiện chấp nhận đối số từ khóa daemon để ghi đè hành vi mặc định là kế thừa giá trị cờ daemon từ luồng gốc (bpo-6064).
Hàm riêng tư _thread.get_ident trước đây hiện có sẵn dưới dạng hàm công khai threading.get_ident(). Điều này giúp loại bỏ một số trường hợp truy cập trực tiếp vào mô-đun _thread trong stdlib. Mã của bên thứ ba đã sử dụng _thread.get_ident cũng nên được thay đổi để sử dụng giao diện chung mới.
thời gian¶
PEP 418 đã thêm các chức năng mới vào mô-đun time:
get_clock_info(): Lấy thông tin về đồng hồ.monotonic(): Đồng hồ đơn điệu (không thể quay ngược), không bị ảnh hưởng bởi các cập nhật đồng hồ hệ thống.perf_counter(): Bộ đếm hiệu suất với độ phân giải cao nhất hiện có để đo thời lượng ngắn.process_time(): Tổng thời gian CPU của hệ thống và người dùng của quy trình hiện tại.
Các chức năng mới khác:
Các hàm
clock_getres(),clock_gettime()vàclock_settime()với hằng sốCLOCK_xxx. (Được đóng góp bởi Victor Stinner trong bpo-10278.)
Để cải thiện tính nhất quán giữa các nền tảng, sleep() hiện tăng ValueError khi chuyển giá trị ngủ âm. Trước đây đây là lỗi trên posix nhưng lại tạo ra trạng thái ngủ vô hạn trên Windows.
các loại¶
Thêm lớp types.MappingProxyType mới: Proxy chỉ đọc của ánh xạ. (bpo-14386)
Các chức năng mới types.new_class() và types.prepare_class() cung cấp hỗ trợ cho việc tạo kiểu động tuân thủ PEP 3115. (bpo-14588)
nhỏ nhất¶
assertRaises(), assertRaisesRegex(), assertWarns() và assertWarnsRegex() hiện chấp nhận đối số từ khóa msg khi được sử dụng làm trình quản lý ngữ cảnh. (Được đóng góp bởi Ezio Melotti và Winston Ewert trong bpo-10775.)
unittest.TestCase.run() hiện trả về đối tượng TestResult.
urllib¶
Lớp Request hiện chấp nhận đối số method được get_method() sử dụng để xác định phương thức HTTP nào sẽ được sử dụng. Ví dụ: điều này sẽ gửi yêu cầu 'HEAD'
>>> urlopen(Yêu cầu('https://www.python.org', phương thức='HEAD'))
trình duyệt web¶
Mô-đun webbrowser hỗ trợ nhiều "trình duyệt" hơn: Google Chrome (có tên là chrome, chromium, chrome-browser hoặc chromium-browser tùy thuộc vào phiên bản và hệ điều hành) và các trình khởi chạy chung xdg-open, từ dự án FreeDesktop.org và gvfs-open, là trình xử lý URI mặc định cho GNOME 3. (Cái trước đây do Arnaud đóng góp) Calmettes trong bpo-13620, phần sau của Matthias Klose trong bpo-14493.)
xml.etree.ElementTree¶
Mô-đun xml.etree.ElementTree hiện nhập bộ tăng tốc C theo mặc định; không cần phải nhập xml.etree.cElementTree một cách rõ ràng nữa (mô-đun này vẫn duy trì khả năng tương thích ngược nhưng hiện không được dùng nữa). Ngoài ra, họ phương pháp iter của Element đã được tối ưu hóa (viết lại bằng C). Tài liệu của mô-đun cũng đã được cải thiện đáng kể với các ví dụ bổ sung và tài liệu tham khảo chi tiết hơn.
zlib¶
Thuộc tính mới zlib.Decompress.eof giúp phân biệt giữa luồng nén được định dạng chính xác và luồng không đầy đủ hoặc bị cắt bớt. (Được đóng góp bởi Nadeem Vawda trong bpo-12646.)
Thuộc tính mới zlib.ZLIB_RUNTIME_VERSION báo cáo chuỗi phiên bản của thư viện zlib cơ bản được tải khi chạy. (Được đóng góp bởi Torsten Landschoff trong bpo-12306.)
Tối ưu hóa¶
Những cải tiến hiệu suất chính đã được thêm vào:
Nhờ PEP 393, một số thao tác trên chuỗi Unicode đã được tối ưu hóa:
dấu chân bộ nhớ được chia cho 2 đến 4 tùy thuộc vào văn bản
mã hóa chuỗi ASCII thành UTF-8 không cần mã hóa các ký tự nữa, cách biểu diễn UTF-8 được chia sẻ với cách biểu diễn ASCII
bộ mã hóa UTF-8 đã được tối ưu hóa
lặp lại một chữ cái ASCII và nhận được chuỗi con của chuỗi ASCII nhanh hơn 4 lần
UTF-8 hiện nhanh hơn gấp 2 đến 4 lần. Mã hóa UTF-16 hiện nhanh hơn gấp 10 lần.
(Được đóng góp bởi Serhiy Storchaka, bpo-14624, bpo-14738 và bpo-15026.)
Xây dựng và thay đổi C API¶
Những thay đổi trong quá trình xây dựng của Python và C API bao gồm:
Chức năng mới liên quan đến PEP 3118:
PEP 393 đã thêm các loại, macro và chức năng Unicode mới:
API cấp cao:
API cấp thấp:
Cấu trúc
PyASCIIObjectvàPyCompactUnicodeObjectPyUnicode_DATA,PyUnicode_1BYTE_DATA,PyUnicode_2BYTE_DATA,PyUnicode_4BYTE_DATAPyUnicode_KINDvớiPyUnicode_Kindenum:PyUnicode_WCHAR_KIND,PyUnicode_1BYTE_KIND,PyUnicode_2BYTE_KIND,PyUnicode_4BYTE_KIND
PyArg_ParseTuplehiện chấp nhậnbytearraycho định dạngc(bpo-12380).
Không được dùng nữa¶
Hệ điều hành không được hỗ trợ¶
OS/2 và VMS không còn được hỗ trợ do thiếu người bảo trì.
Nền tảng Windows 2000 và Windows đặt COMSPEC thành command.com không còn được hỗ trợ do gánh nặng bảo trì.
Hỗ trợ OSF, không được dùng nữa trong phiên bản 3.2, đã bị xóa hoàn toàn.
Các mô-đun, hàm và phương thức Python không được dùng nữa¶
Việc chuyển một chuỗi không trống tới
object.__format__()không được dùng nữa và sẽ tạo ra mộtTypeErrortrong Python 3.4 (bpo-9856).Codec
unicode_internalkhông còn được dùng nữa vì PEP 393, hãy sử dụng UTF-8, UTF-16 (utf-16-lehoặcutf-16-be) hoặc UTF-32 (utf-32-lehoặcutf-32-be)ftplib.FTP.nlst()vàftplib.FTP.dir(): sử dụngftplib.FTP.mlsd()platform.popen(): sử dụng mô-đunsubprocess. Kiểm tra đặc biệt phần Thay thế các chức năng cũ hơn bằng Mô-đun subprocess (bpo-11377).bpo-13374: Các byte API của Windows không được dùng nữa trong mô-đun
os. Sử dụng tên tệp Unicode, thay vì tên tệp byte, để không phụ thuộc vào trang mã ANSI nữa và hỗ trợ bất kỳ tên tệp nào.bpo-13988: Mô-đun
xml.etree.cElementTreekhông được dùng nữa. Bộ tăng tốc được sử dụng tự động bất cứ khi nào có sẵn.Hoạt động của
time.clock()tùy thuộc vào nền tảng: thay vào đó, hãy sử dụng hàmtime.perf_counter()hoặctime.process_time()mới, tùy theo yêu cầu của bạn để có hành vi được xác định rõ ràng.Chức năng
os.stat_float_times()không được dùng nữa.mô-đun
abc:abc.abstractpropertykhông được dùng nữa, thay vào đó hãy sử dụngpropertyvớiabc.abstractmethod().abc.abstractclassmethodkhông được dùng nữa, thay vào đó hãy sử dụngclassmethodvớiabc.abstractmethod().abc.abstractstaticmethodkhông được dùng nữa, thay vào đó hãy sử dụngstaticmethodvớiabc.abstractmethod().
gói
importlib:importlib.abc.SourceLoader.path_mtime()hiện không được dùng nữa thay vìimportlib.abc.SourceLoader.path_stats()vì các tệp mã byte hiện lưu trữ cả thời gian sửa đổi và kích thước của tệp nguồn mà tệp mã byte được biên dịch từ đó.
Các chức năng và loại không dùng nữa của C API¶
Py_UNICODE đã không được dùng nữa bởi PEP 393 và sẽ bị xóa trong Python 4. Tất cả các hàm sử dụng loại này đều không được dùng nữa:
Các hàm và phương thức Unicode sử dụng loại Py_UNICODE và Py_UNICODE*:
PyUnicode_FromUnicode: sử dụngPyUnicode_FromWideChar()hoặcPyUnicode_FromKindAndData()PyUnicode_AS_UNICODE,PyUnicode_AsUnicode(),PyUnicode_AsUnicodeAndSize(): sử dụngPyUnicode_AsWideCharString()PyUnicode_AS_DATA: sử dụngPyUnicode_DATAvớiPyUnicode_READvàPyUnicode_WRITEPyUnicode_GET_SIZE,PyUnicode_GetSize(): sử dụngPyUnicode_GET_LENGTHhoặcPyUnicode_GetLength()PyUnicode_GET_DATA_SIZE: sử dụngPyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)(chỉ hoạt động trên các chuỗi có sẵn)PyUnicode_AsUnicodeCopy(): sử dụngPyUnicode_AsUCS4Copy()hoặcPyUnicode_AsWideCharString()PyUnicode_GetMax()
Các hàm và macro thao tác với chuỗi Py_UNICODE*:
Py_UNICODE_strlen(): sử dụngPyUnicode_GetLength()hoặcPyUnicode_GET_LENGTHPy_UNICODE_strcat(): sử dụngPyUnicode_CopyCharacters()hoặcPyUnicode_FromFormat()Py_UNICODE_strcpy(),Py_UNICODE_strncpy(),Py_UNICODE_COPY(): sử dụngPyUnicode_CopyCharacters()hoặcPyUnicode_Substring()Py_UNICODE_strcmp(): sử dụngPyUnicode_Compare()Py_UNICODE_strncmp(): sử dụngPyUnicode_Tailmatch()Py_UNICODE_strchr(),Py_UNICODE_strrchr(): sử dụngPyUnicode_FindChar()Py_UNICODE_FILL(): sử dụngPyUnicode_Fill()Py_UNICODE_MATCH
Bộ mã hóa:
PyUnicode_Encode(): sử dụngPyUnicode_AsEncodedObject()PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8(): sử dụngPyUnicode_AsUTF8()hoặcPyUnicode_AsUTF8String()PyUnicode_EncodeUTF32()PyUnicode_EncodeUTF16()PyUnicode_EncodeUnicodeEscape()sử dụngPyUnicode_AsUnicodeEscapeString()PyUnicode_EncodeRawUnicodeEscape()sử dụngPyUnicode_AsRawUnicodeEscapeString()PyUnicode_EncodeLatin1(): sử dụngPyUnicode_AsLatin1String()PyUnicode_EncodeASCII(): sử dụngPyUnicode_AsASCIIString()PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeMBCS(): sử dụngPyUnicode_AsMBCSString()hoặcPyUnicode_EncodeCodePage()(vớiCP_ACPcode_page)PyUnicode_EncodeDecimal(),PyUnicode_TransformDecimalToASCII()
Các tính năng không được dùng nữa¶
Mã định dạng 'u' của mô-đun array hiện không được dùng nữa và sẽ bị xóa trong Python 4 cùng với phần còn lại của (Py_UNICODE) API.
Chuyển sang Python 3.3¶
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.
Chuyển mã Python¶
Tính năng ngẫu nhiên băm được bật theo mặc định. Đặt biến môi trường
PYTHONHASHSEEDthành0để tắt tính năng ngẫu nhiên băm. Xem thêm phương phápobject.__hash__().bpo-12326: Trên Linux, sys.platform không còn chứa phiên bản chính nữa. Bây giờ nó luôn là 'linux', thay vì 'linux2' hoặc 'linux3' tùy thuộc vào phiên bản Linux được sử dụng để xây dựng Python. Thay thế sys.platform == 'linux2' bằng sys.platform.startswith('linux') hoặc trực tiếp sys.platform == 'linux' nếu bạn không cần hỗ trợ các phiên bản Python cũ hơn.
bpo-13847, bpo-14180:
timevàdatetime:OverflowErrorhiện được nâng lên thay vìValueErrornếu dấu thời gian nằm ngoài phạm vi.OSErrorhiện được nâng lên nếu hàm Cgmtime()hoặclocaltime()không thành công.Các công cụ tìm kiếm mặc định được sử dụng khi nhập hiện sử dụng bộ đệm của những gì có trong một thư mục cụ thể. Nếu bạn tạo tệp nguồn Python hoặc tệp mã byte không nguồn, hãy đảm bảo gọi
importlib.invalidate_caches()để xóa bộ nhớ đệm để người tìm thấy chú ý đến tệp mới.ImportErrorhiện sử dụng tên đầy đủ của mô-đun đã được nhập. Các tài liệu kiểm tra thông báo của ImportErrors sẽ cần được cập nhật để sử dụng tên đầy đủ của mô-đun thay vì chỉ phần đuôi của tên.Đối số index cho
__import__()hiện được mặc định là 0 thay vì -1 và không còn hỗ trợ các giá trị âm nữa. Thật là một sự sơ suất khi PEP 328 được triển khai nên giá trị mặc định vẫn là -1. Nếu bạn cần tiếp tục thực hiện quá trình nhập tương đối, sau đó là nhập tuyệt đối, thì hãy thực hiện quá trình nhập tương đối bằng cách sử dụng chỉ mục 1, sau đó là một quá trình nhập khác sử dụng chỉ mục 0. Tuy nhiên, bạn nên sử dụngimportlib.import_module()thay vì gọi trực tiếp__import__().__import__()không còn cho phép sử dụng giá trị chỉ mục khác 0 cho các mô-đun cấp cao nhất. Ví dụ.__import__('sys', level=1)bây giờ là một lỗi.Vì
sys.meta_pathvàsys.path_hookshiện có công cụ tìm kiếm theo mặc định nên rất có thể bạn sẽ muốn sử dụnglist.insert()thay vìlist.append()để thêm vào các danh sách đó.Vì
Nonehiện đã được chèn vàosys.path_importer_cache, nên nếu bạn xóa các mục trong từ điển của các đường dẫn không có công cụ tìm, bạn sẽ cần xóa các khóa được ghép nối với các giá trị củaNoneandimp.NullImporterđể tương thích ngược. Điều này sẽ dẫn đến chi phí bổ sung trên các phiên bản Python cũ hơn chèn lạiNonevàosys.path_importer_cachetrong đó nó thể hiện việc sử dụng các công cụ tìm ẩn, nhưng về mặt ngữ nghĩa, nó sẽ không thay đổi bất cứ điều gì.importlib.abc.Finderkhông còn chỉ định phương thức trừu tượngfind_module()phải được triển khai nữa. Nếu bạn đang dựa vào các lớp con để triển khai phương thức đó, trước tiên hãy đảm bảo kiểm tra sự tồn tại của phương thức đó. Tuy nhiên, có thể bạn sẽ muốn kiểm trafind_loader()trước tiên trong trường hợp làm việc với path entry finders.pkgutilđã được chuyển đổi để sử dụngimportlibnội bộ. Điều này giúp loại bỏ nhiều trường hợp đặc biệt trong đó hành vi cũ của mô phỏng nhập PEP 302 không khớp với hành vi của hệ thống nhập thực. Bản thân mô phỏng nhập khẩu vẫn còn tồn tại nhưng hiện không còn được dùng nữa. Các hàmpkgutil.iter_importers()vàpkgutil.walk_packages()trong trường hợp đặc biệt là các hook nhập tiêu chuẩn nên chúng vẫn được hỗ trợ mặc dù chúng không cung cấp phương thứciter_modules()không chuẩn.Một lỗi tuân thủ RFC (bpo-1079) lâu đời trong quá trình phân tích cú pháp do
email.header.decode_header()thực hiện đã được sửa. Mã sử dụng thành ngữ tiêu chuẩn để chuyển đổi các tiêu đề được mã hóa thành unicode (str(make_header(decode_header(h))) sẽ không có thay đổi nào, nhưng mã xem xét các bộ dữ liệu riêng lẻ được giải mã_header trả về sẽ thấy khoảng trắng đứng trước hoặc theo sau các phầnASCIIhiện được bao gồm trong phầnASCII. Mã xây dựng tiêu đề bằngmake_headercũng sẽ tiếp tục hoạt động mà không thay đổi, vìmake_headertiếp tục thêm khoảng trắng giữa các phầnASCIIvà không phảiASCIInếu nó chưa có trong chuỗi đầu vào.email.utils.formataddr()hiện thực hiện mã hóa truyền nội dung chính xác khi chuyển tên hiển thị không phảiASCII. Bất kỳ mã nào phụ thuộc vào hành vi lỗi trước đó mà vẫn giữ nguyên unicode không phảiASCIItrong chuỗi đầu ra được định dạng sẽ cần phải được thay đổi (bpo-1690608).poplib.POP3.quit()hiện có thể gây ra lỗi giao thức giống như tất cả các phương pháppoplibkhác. Mã giả địnhquitkhông gây ra lỗipoplib.error_protocó thể cần phải được thay đổi nếu một ứng dụng cụ thể (bpo-11291) gặp phải lỗi trênquit.Đối số
strictchoemail.parser.Parser, không được dùng nữa kể từ Python 2.4, cuối cùng đã bị xóa.Phương thức
unittest.TestCase.assertSameElementskhông được dùng nữa đã bị xóa.Biến
time.accept2dyearkhông được dùng nữa đã bị xóa.Thuộc tính
Context._clampkhông được dùng nữa đã bị xóa khỏi mô-đundecimal. Trước đây nó đã được thay thế bằng thuộc tính công khaiclamp. (Xem bpo-8540.)Lớp trợ giúp nội bộ không có giấy tờ
SSLFakeFileđã bị xóa khỏismtplibvì chức năng của nó từ lâu đã được cung cấp trực tiếp bởisocket.socket.makefile().Việc chuyển giá trị âm cho
time.sleep()trên Windows hiện gây ra lỗi thay vì ngủ vĩnh viễn. Nó luôn gây ra lỗi trên posix.Hằng số
ast.__version__đã bị xóa. Nếu bạn cần đưa ra quyết định bị ảnh hưởng bởi phiên bản AST, hãy sử dụngsys.version_infođể đưa ra quyết định.Mã từng giải quyết vấn đề thực tế là mô-đun
threadingsử dụng các hàm xuất xưởng bằng cách phân lớp các lớp riêng tư sẽ cần phải thay đổi để phân lớp các lớp hiện công khai.Bộ máy gỡ lỗi không có giấy tờ trong mô-đun phân luồng đã bị loại bỏ, giúp đơn giản hóa mã. Điều này sẽ không ảnh hưởng đến mã sản xuất, nhưng được đề cập ở đây trong trường hợp bất kỳ khung gỡ lỗi ứng dụng nào tương tác với nó (bpo-13550).
Chuyển mã C¶
Trong quá trình thay đổi bộ đệm API, thành viên
smalltablekhông có giấy tờ của cấu trúcPy_bufferđã bị xóa và bố cục củaPyMemoryViewObjectđã thay đổi.Tất cả các tiện ích mở rộng dựa trên các phần liên quan trong
memoryobject.hhoặcobject.hphải được xây dựng lại.Do PEP 393, loại
Py_UNICODEvà tất cả các chức năng sử dụng loại này không được dùng nữa (nhưng sẽ tồn tại trong ít nhất 5 năm). Nếu bạn đang sử dụng API Unicode cấp thấp để xây dựng và truy cập các đối tượng unicode và muốn hưởng lợi từ việc giảm dung lượng bộ nhớ do PEP 393 cung cấp, bạn phải chuyển đổi mã của mình sang Unicode API mới.Tuy nhiên, nếu bạn chỉ sử dụng các hàm cấp cao như
PyUnicode_Concat(),PyUnicode_Join()hoặcPyUnicode_FromFormat(), mã của bạn sẽ tự động tận dụng các biểu diễn unicode mới.PyImport_GetMagicNumber()hiện trả về-1khi thất bại.Vì giá trị âm của đối số level đối với
__import__()không còn hợp lệ nên giá trị tương tự hiện được áp dụng choPyImport_ImportModuleLevel(). Điều này cũng có nghĩa là giá trị của level đượcPyImport_ImportModuleEx()sử dụng hiện là0thay vì-1.
Tiện ích mở rộng tòa nhà C¶
Phạm vi tên tệp có thể có cho phần mở rộng C đã được thu hẹp. Các cách viết rất hiếm khi được sử dụng đã bị loại bỏ: dưới POSIX, các tệp có tên
xxxmodule.so,xxxmodule.abi3.sovàxxxmodule.cpython-*.sokhông còn được công nhận là đang triển khai mô-đunxxx. Nếu bạn đã tạo các tệp như vậy, bạn phải chuyển sang cách viết khác (tức là xóa chuỗimodulekhỏi tên tệp).(được triển khai trong bpo-14040.)
Thay đổi chuyển đổi dòng lệnh¶
Cờ dòng lệnh -Q và các thành phần liên quan đã bị xóa. Kiểm tra mã sys.flags.division_warning sẽ cần cập nhật.
(bpo-10998, đóng góp bởi Éric Araujo.)
Khi python được khởi động bằng
-S,import sitesẽ không còn thêm đường dẫn dành riêng cho trang web vào đường dẫn tìm kiếm mô-đun nữa. Trong các phiên bản trước, nó đã làm được.(bpo-11591, do Carl Meyer đóng góp với các ấn bản của Éric Araujo.)