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 from mới cho generator delegation.

  • Cú pháp u'unicode' được chấp nhận lại cho các đối tượng str.

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ói virtualenv phổ biến)

Các tính năng tích hợp mới:

Cải tiến triển khai:

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

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 ChangesPorting 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 đến U+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ậy len('\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.maxunicode bây giờ luôn là 1114111 (0x10FFFF ở hệ thập lục phân). Hàm PyUnicode_GetMax() vẫn trả về 0xFFFF hoặc 0x10FFFF để 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")  f:
        nội dung = f.read()
ngoại trừ IOError  lỗi:
    nếu  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")  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  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 sendthrow 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 
...
>>> 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.Parameterinspect.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.implementationname, version, hexversioncache_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 finderspath entry finders bằng cách giới thiệu importlib.abc.MetaPathFinderimportlib.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 namepath đượ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_pathsys.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()'\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()rindex() của các đối tượng bytesbytearray hiệ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()center() của bytesbytearray hiện chấp nhận bytearray cho đố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 listbytearray: copy()clear() (bpo-10516). Do đó, MutableSequence hiện cũng định nghĩa một phương thức clear() (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_CLOEXEC chẳ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, xem object.__hash__()PYTHONHASHSEED.

  • Loại str có một phương thức casefold() 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, SIGBUSSIGILL. 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ỗ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.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.

(Đượ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 qQ.

(Đượ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.BZ2File hiệ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.BZ2Filebz2.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.BZ2File hiệ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.BZ2File hiện triển khai tất cả io.BufferedIOBase API, ngoại trừ các phương thức detach()truncate().

codec

Codec mbcs đã được viết lại để xử lý chính xác các trình xử lý lỗi replaceignore 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ế.

(bpo-12016)

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ộ  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.

(bpo-12100)

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ử +- đơn nhất, cũng như các toán tử tại chỗ +=, -=, |=&=. (Đượ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).

(bpo-13585)

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.

(bpo-10924)

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.window có thuộc tính curses.window.encoding mới.

  • Lớp curses.window có phương thức get_wch() mới để có được ký tự rộng

  • Mô-đun curses có chức năng unget_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ờ

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 FloatOperation tù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ành False.

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:

    32-bit

    64-bit

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • Trong các mẫu ngữ cảnh (DefaultContext, BasicContextExtendedContext), cường độ của EmaxEmin đã thay đổi thành 999999.

  • Hàm tạo Decimal trong 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ụng create_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()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 độ, flagstraps luôn đề cập đến cùng một MutableMapping mà ngữ cảnh được khởi tạo. Nếu một từ điển tín hiệu mới được chỉ định, flagstraps sẽ đượ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 Context sẽ 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ởi repr().

  • Tham số watchexp trong phương thức quantize() 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 Message được tuần tự hóa. Mặc định là 78.

dòng

Ký tự được sử dụng để phân tách các dòng riêng lẻ khi Message được xuất bản. Mặc định là \n.

cte_type

7bit hoặc 8bit. 8bit chỉ áp dụng cho Bytes generator và có nghĩa là không phải ASCII có thể được sử dụng ở những nơi được giao thức cho phép (hoặc nơi nó tồn tại trong đầu vào ban đầu).

raise_on_defect

Làm cho parser phát sinh lỗi khi gặp phải lỗi thay vì thêm chúng vào danh sách defects của đối tượng Message.

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 parser có được generator phân loại lại hay không. Nó có thể là none, long hoặc all. Giá trị mặc định là long, có nghĩa là các tiêu đề nguồn có dòng dài hơn max_line_length sẽ được gấp lại. none có nghĩa là không có dòng nào được gập lại và all có nghĩa là tất cả các dòng đều được gập lại.

tiêu đề_factory

Một lệnh gọi có thể nhận namevalue và tạo ra một đối tượng tiêu đề tùy chỉnh.

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 addressesgroups 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(): cho datetime, 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ành datetime có thể nhận biết được hoặc datetime ngâ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ạng datetime nhận biết được bằng cách sử dụng timezone cục bộ. Đưa ra một datetime nhận biết được, hãy chuyển đổi nó thành một datetime nhận biết được bằng cách sử dụng timezone cục bộ.

ftplib

  • ftplib.FTP hiện chấp nhận đối số từ khóa source_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_TLS hiện cung cấp chức năng ccc() 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ùng ftplib.FTP.nlst()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-11113bpo-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_throughTrue, 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()starmap_async() cung cấp itertools.starmap() tương đương với các hàm multiprocessing.pool.Pool.map()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')  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 os có chức năng pipe2() mới cho phép tạo một đường ống có cờ O_CLOEXEC hoặc O_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 os có chức năng sendfile() 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-10755bpo-14626).

  • access() chấp nhận đối số từ khóa effective_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 os có hai chức năng mới: getpriority()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ới os.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()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êm shutil.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()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_HOLEos.SEEK_DATA.

  • Các hằng số mới RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOADRTLD_DEEPBIND có sẵn trên các nền tảng hỗ trợ chúng. Chúng được sử dụng với hàm sys.setdlopenflags() và thay thế các hằng số tương tự được xác định trong ctypesDLFCN. (Đượ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óa target_is_directory trê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 -gserve() 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\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ụng scheduler trong các ứng dụng không chặn. (Được đóng góp bởi Giampaolo Rodolà trong bpo-13449.)

  • Lớp scheduler hiệ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ố timefuncdelayfunct của hàm tạo lớp scheduler hiện là tùy chọn và được mặc định lần lượt là time.time()time.sleep(). (Được đóng góp bởi Chris Clark trong bpo-13245.)

  • Tham số enter()enterabs() argument hiện là tùy chọn. (Được đóng góp bởi Chris Clark trong bpo-13245.)

  • enter()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()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-14127bpo-15238.)

  • Một số hàm hiện có một đối số symlinks tù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 posix mv thự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ố dst là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_fd mới trong os.open()os.unlink(). (Được đóng góp bởi Martin von Löwis và Hynek Schlawack trong bpo-4489.)

tín hiệu

  • Mô-đun signal có các chức năng mới:

  • 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()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_SSLLMTP 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

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 ssl có 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 ssl hiệ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()set_ecdh_curve(). (Được đóng góp bởi Antoine Pitrou trong bpo-13626bpo-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ới OP_NO_COMPRESSION có 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 libraryreason. (Đượ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_PREFERENCE cho 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_tsize_t thông qua các mã mới tương ứng là nN. (Đượ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 systhread_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 textwrapindent() 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.Eventthreading.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ả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()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()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'))

(bpo-1673007)

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-14738bpo-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:

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

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_UNICODEPy_UNICODE*:

Các hàm và macro thao tác với chuỗi Py_UNICODE*:

Bộ mã hóa:

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 PYTHONHASHSEED thành 0 để tắt tính năng ngẫu nhiên băm. Xem thêm phương pháp object.__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: timedatetime: OverflowError hiện được nâng lên thay vì ValueError nếu dấu thời gian nằm ngoài phạm vi. OSError hiện được nâng lên nếu hàm C gmtime() hoặc localtime() 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.

  • ImportError hiệ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ụng importlib.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.

  • sys.meta_pathsys.path_hooks hiệ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ụng list.insert() thay vì list.append() để thêm vào các danh sách đó.

  • None hiện đã được chèn vào sys.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ủa None and imp.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ại None vào sys.path_importer_cache trong đó 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.Finder không còn chỉ định phương thức trừu tượng find_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 tra find_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ụng importlib nộ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àm pkgutil.iter_importers()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ức iter_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ần ASCII hiện được bao gồm trong phần ASCII. Mã xây dựng tiêu đề bằng make_header cũng sẽ tiếp tục hoạt động mà không thay đổi, vì make_header tiếp tục thêm khoảng trắng giữa các phần ASCII và không phải ASCII nế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ải ASCII. 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ải ASCII trong 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áp poplib khác. Mã giả định quit không gây ra lỗi poplib.error_proto có 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ên quit.

  • Đối số strict cho email.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.assertSameElements không được dùng nữa đã bị xóa.

  • Biến time.accept2dyear không được dùng nữa đã bị xóa.

  • Thuộc tính Context._clamp không được dùng nữa đã bị xóa khỏi mô-đun decimal. Trước đây nó đã được thay thế bằng thuộc tính công khai clamp. (Xem bpo-8540.)

  • Lớp trợ giúp nội bộ không có giấy tờ SSLFakeFile đã bị xóa khỏi smtplib vì chức năng của nó từ lâu đã được cung cấp trực tiếp bởi socket.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ụng sys.version_info để đưa ra quyết định.

  • Mã từng giải quyết vấn đề thực tế là mô-đun threading sử 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 smalltable không có giấy tờ của cấu trúc Py_buffer đã bị xóa và bố cục của PyMemoryViewObject đã 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.h hoặc object.h phải được xây dựng lại.

  • Do PEP 393, loại Py_UNICODE và 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ặc PyUnicode_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ề -1 khi 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 cho PyImport_ImportModuleLevel(). Điều này cũng có nghĩa là giá trị của level được PyImport_ImportModuleEx() sử dụng hiện là 0 thay 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.soxxxmodule.cpython-*.so không còn được công nhận là đang triển khai mô-đun xxx. 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ỗi module khỏ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 site sẽ 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.)