Có gì mới trong Python 3.5

biên tập viên:

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

Bài viết này giải thích các tính năng mới trong Python 3.5, so với 3.4. Python 3.5 được phát hành vào ngày 13 tháng 9 năm 2015. Xem changelog để biết danh sách đầy đủ các thay đổi.

Xem thêm

PEP 478 - Lịch phát hành Python 3.5

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:

  • PEP 492, coroutine với cú pháp không đồng bộ và chờ đợi.

  • PEP 465, toán tử nhân ma trận mới: a @ b.

  • PEP 448, khái quát hóa giải nén bổ sung.

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

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

  • bytes % args, bytearray % args: PEP 461 -- Thêm định dạng % vào byte và bytearray.

  • Các phương pháp bytes.hex(), bytearray.hex()memoryview.hex() mới. (Được đóng góp bởi Arnon Yaari trong bpo-9951.)

  • memoryview hiện hỗ trợ lập chỉ mục tuple (bao gồm đa chiều). (Được đóng góp bởi Antoine Pitrou trong bpo-23632.)

  • Trình tạo có thuộc tính gi_yieldfrom mới, trả về đối tượng được lặp lại bằng biểu thức yield from. (Được đóng góp bởi Benno Leslie và Yury Selivanov trong bpo-24450.)

  • Một ngoại lệ RecursionError mới hiện đã được đưa ra khi đạt đến độ sâu đệ quy tối đa. (Được đóng góp bởi Georg Brandl trong bpo-19235.)

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

  • Khi ngôn ngữ LC_TYPE là ngôn ngữ POSIX (ngôn ngữ C), sys.stdinsys.stdout hiện sử dụng trình xử lý lỗi surrogateescape, thay vì trình xử lý lỗi strict. (Được đóng góp bởi Victor Stinner trong bpo-19977.)

  • Các tệp .pyo không còn được sử dụng nữa và đã được thay thế bằng một sơ đồ linh hoạt hơn bao gồm mức tối ưu hóa rõ ràng trong tên .pyc. (Xem PEP 488 overview.)

  • Các mô-đun dựng sẵn và mở rộng hiện được khởi tạo theo quy trình nhiều giai đoạn, tương tự như cách tải các mô-đun Python. (Xem PEP 489 overview.)

Những cải tiến đáng kể trong thư viện tiêu chuẩn:

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

  • SSLv3 hiện đã bị vô hiệu hóa trong toàn bộ thư viện chuẩn. Nó vẫn có thể được kích hoạt bằng cách khởi tạo ssl.SSLContext theo cách thủ công. (Xem bpo-22638 để biết thêm chi tiết; thay đổi này đã được chuyển sang CPython 3.4 và 2.7.)

  • Phân tích cú pháp cookie HTTP hiện nghiêm ngặt hơn để bảo vệ khỏi các cuộc tấn công tiêm nhiễm tiềm ẩn. (Được đóng góp bởi Antoine Pitrou trong bpo-22796.)

Cải tiến Windows:

  • Trình cài đặt mới cho Windows đã thay thế MSI cũ. Xem Sử dụng Python trên Windows để biết thêm thông tin.

  • Các bản dựng Windows hiện sử dụng Microsoft Visual C++ 14.0 và các mô-đun mở rộng cũng nên sử dụng tương tự.

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

Tính năng mới

PEP 492 - Coroutine với cú pháp không đồng bộ và chờ đợi

PEP 492 cải thiện đáng kể khả năng hỗ trợ lập trình không đồng bộ trong Python bằng cách thêm awaitable objects, coroutine functions, asynchronous iterationasynchronous context managers.

Các hàm coroutine được khai báo bằng cú pháp async def mới:

>>> async def coro():
... trả lại 'thư rác'

Bên trong hàm coroutine, biểu thức await mới có thể được sử dụng để tạm dừng quá trình thực thi coroutine cho đến khi có kết quả. Bất kỳ đối tượng nào cũng có thể là awaited, miễn là nó triển khai giao thức awaitable bằng cách xác định phương thức __await__().

PEP 492 cũng bổ sung câu lệnh async for để lặp lại thuận tiện trên các lần lặp không đồng bộ.

Một ví dụ về ứng dụng khách HTTP thô sơ được viết bằng cú pháp mới

nhập asyncio

async def http_get(tên miền):
    người đọc, người viết = đang chờ asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Kết nối: đóng',
        b'', b''
    ]))

    không đồng bộ cho dòng trong trình đọc:
        in('>>>', dòng)

    nhà văn.close()

vòng lặp = asyncio.get_event_loop()
thử:
    loop.run_until_complete(http_get('example.com'))
cuối cùng:
    loop.close()

Tương tự như phép lặp không đồng bộ, có một cú pháp mới cho trình quản lý bối cảnh không đồng bộ. Kịch bản sau:

nhập asyncio

async def coro(tên, khóa):
    print('coro {}: chờ lock'.format(name))
    không đồng bộ với khóa:
        print('coro {}: đang giữ lock'.format(name))
        đang chờ asyncio.sleep(1)
        print('coro {}: giải phóng lock'.format(name))

vòng lặp = asyncio.get_event_loop()
khóa = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
thử:
    loop.run_until_complete(coros)
cuối cùng:
    loop.close()

sẽ xuất ra:

coro 2: chờ khóa
coro 2: cầm  khóa
coro 1: chờ khóa
coro 2: mở khóa
coro 1: cầm  khóa
coro 1: mở khóa

Lưu ý rằng cả async forasync with chỉ có thể được sử dụng bên trong hàm coroutine được khai báo bằng async def.

Các hàm coroutine dự kiến sẽ được chạy bên trong một vòng lặp sự kiện tương thích, chẳng hạn như asyncio loop.

Ghi chú

Thay đổi trong phiên bản 3.5.2: Bắt đầu với CPython 3.5.2, __aiter__ có thể trả về trực tiếp asynchronous iterators. Trả về một đối tượng awaitable sẽ tạo ra một PendingDeprecationWarning.

Xem thêm chi tiết trong phần tài liệu Trình lặp không đồng bộ.

Xem thêm

PEP 492 -- Coroutine với cú pháp không đồng bộ và chờ đợi

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

PEP 465 - Toán tử trung tố chuyên dụng cho phép nhân ma trận

PEP 465 thêm toán tử trung tố @ để nhân ma trận. Hiện tại, không có loại Python dựng sẵn nào triển khai toán tử mới, tuy nhiên, nó có thể được triển khai bằng cách xác định __matmul__(), __rmatmul__()__imatmul__() để nhân ma trận thông thường, phản ánh và tại chỗ. Ngữ nghĩa của các phương thức này tương tự như các phương thức xác định các toán tử số học trung tố khác.

Phép nhân ma trận là một phép toán phổ biến đáng chú ý trong nhiều lĩnh vực toán học, khoa học, kỹ thuật và việc bổ sung @ cho phép viết mã sạch hơn:

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

thay vì:

S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

NumPy 1.10 có hỗ trợ cho toán tử mới:

>>> nhập numpy

>>> x = numpy.ones(3)
>>>x
mảng([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> tôi
mảng([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
mảng([ 1., 1., 1.])

Xem thêm

PEP 465 -- Toán tử trung tố chuyên dụng cho phép nhân ma trận

PEP được viết bởi Nathaniel J. Smith; được thực hiện bởi Benjamin Peterson.

PEP 448 - Tổng quát hóa giải nén bổ sung

PEP 448 mở rộng các mục đích sử dụng được phép của toán tử giải nén lặp * và toán tử giải nén từ điển **. Hiện tại có thể sử dụng số lần giải nén tùy ý trong function calls

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
... in(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

Tương tự, hiển thị bộ, danh sách, bộ và từ điển cho phép giải nén nhiều lần (xem Danh sách biểu thứcHiển thị từ điển):

>>> *phạm vi (4), 4
(0, 1, 2, 3, 4)

>>> [*phạm vi (4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

Xem thêm

PEP 448 -- Tổng quát hóa giải nén bổ sung

PEP được viết bởi Joshua Landau; được thực hiện bởi Neil Girdhar, Thomas Wouters và Joshua Landau.

PEP 461 - hỗ trợ định dạng phần trăm cho byte và bytearray

PEP 461 bổ sung hỗ trợ cho % interpolation operator thành bytesbytearray.

Mặc dù phép nội suy thường được coi là một thao tác chuỗi, nhưng có những trường hợp nội suy trên bytes hoặc bytearrays có ý nghĩa và công việc cần thiết để bù đắp cho chức năng bị thiếu này sẽ làm giảm khả năng đọc mã tổng thể. Vấn đề này đặc biệt quan trọng khi xử lý các giao thức định dạng dây, thường là hỗn hợp của văn bản tương thích nhị phân và ASCII.

Ví dụ:

>>> b'Xin chào %b!' % b'Thế giới'
b'Xin chào thế giới!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'

%b không được phép sử dụng Unicode, nhưng nó được %a chấp nhận (tương đương với repr(obj).encode('ascii', 'backslashreplace')):

>>> b'Xin chào %b!' % 'Thế giới'
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
TypeError: %b yêu cầu byte hoặc một đối tượng triển khai __bytes__, không phải 'str'

>>> b'price: %a' % '10€'
b"giá: '10\\u20ac'"

Lưu ý rằng các loại chuyển đổi %s%r, mặc dù được hỗ trợ, chỉ nên được sử dụng trong các cơ sở mã cần khả năng tương thích với Python 2.

Xem thêm

PEP 461 -- Thêm % định dạng vào byte và bytearray

PEP được viết bởi Ethan Furman; được thực hiện bởi Neil Schenauer và Ethan Furman.

PEP 484 - Gợi ý về loại

Cú pháp chú thích hàm đã là một tính năng của Python kể từ phiên bản 3.0 (PEP 3107), tuy nhiên ngữ nghĩa của chú thích vẫn chưa được xác định.

Kinh nghiệm đã chỉ ra rằng phần lớn việc sử dụng chú thích hàm là để cung cấp gợi ý kiểu cho các tham số hàm và giá trị trả về. Rõ ràng là nó sẽ có lợi cho người dùng Python nếu thư viện tiêu chuẩn bao gồm các định nghĩa cơ bản và các công cụ cho chú thích kiểu.

PEP 484 giới thiệu provisional module để cung cấp các định nghĩa và công cụ tiêu chuẩn này, cùng với một số quy ước cho các tình huống không có chú thích.

Ví dụ: đây là một hàm đơn giản có đối số và kiểu trả về được khai báo trong chú thích:

lời chào def(tên: str) -> str:
    trả về 'Xin chào' + tên

Mặc dù các chú thích này có sẵn trong thời gian chạy thông qua thuộc tính __annotations__ thông thường, no automatic type checking happens at runtime. Thay vào đó, người ta giả định rằng một trình kiểm tra loại ngoại tuyến riêng biệt (ví dụ: mypy) sẽ được sử dụng để phân tích mã nguồn theo yêu cầu.

Hệ thống loại hỗ trợ các liên kết, loại chung và loại đặc biệt có tên Any phù hợp với (tức là có thể gán cho và từ) tất cả các loại.

Xem thêm

  • Tài liệu mô-đun typing

  • PEP 484 -- Gợi ý gõ

    PEP được viết bởi Guido van Rossum, Jukka Lehtosalo và Łukasz Langa; được thực hiện bởi Guido van Rossum.

  • PEP 483 -- Lý thuyết về gợi ý kiểu

    PEP được viết bởi Guido van Rossum

PEP 471 - hàm os.scandir() -- trình vòng lặp thư mục tốt hơn và nhanh hơn

PEP 471 thêm chức năng lặp thư mục mới, os.scandir(), vào thư viện chuẩn. Ngoài ra, os.walk() hiện được triển khai bằng scandir, giúp tốc độ này nhanh hơn từ 3 đến 5 lần trên hệ thống POSIX và nhanh hơn từ 7 đến 20 lần trên hệ thống Windows. Điều này phần lớn đạt được bằng cách giảm đáng kể số lượng lệnh gọi đến os.stat() cần thiết để duyệt cây thư mục.

Ngoài ra, scandir trả về một trình vòng lặp, thay vì trả về danh sách tên tệp, giúp cải thiện hiệu quả bộ nhớ khi lặp qua các thư mục rất lớn.

Ví dụ sau đây cho thấy cách sử dụng đơn giản os.scandir() để hiển thị tất cả các tệp (không bao gồm các thư mục) trong path nhất định không bắt đầu bằng '.'. Cuộc gọi entry.is_file() thường sẽ không thực hiện cuộc gọi hệ thống bổ sung:

để nhập vào os.scandir(path):
    nếu không phải  entry.name.startswith('.')  entry.is_file():
        in(entry.name)

Xem thêm

PEP 471 -- hàm os.scandir() -- trình vòng lặp thư mục tốt hơn và nhanh hơn

PEP được viết và triển khai bởi Ben Hoyt với sự giúp đỡ của Victor Stinner.

PEP 475: Thử lại cuộc gọi hệ thống không thành công với EINTR

Mã lỗi errno.EINTR được trả về bất cứ khi nào một lệnh gọi hệ thống đang chờ I/O bị gián đoạn bởi một tín hiệu. Trước đây, Python sẽ tăng InterruptedError trong những trường hợp như vậy. Điều này có nghĩa là khi viết một ứng dụng Python, nhà phát triển có hai lựa chọn:

  1. Bỏ qua InterruptedError.

  2. Xử lý InterruptedError và cố gắng khởi động lại cuộc gọi hệ thống bị gián đoạn tại mọi địa điểm cuộc gọi.

Tùy chọn đầu tiên khiến ứng dụng bị lỗi liên tục. Tùy chọn thứ hai thêm một lượng lớn bản soạn sẵn khiến mã gần như không thể đọc được. So sánh:

print("Xin chào thế giới")

và:

trong khi Đúng:
    thử:
        print("Xin chào thế giới")
        phá vỡ
    ngoại trừ InterruptedError:
        tiếp tục

PEP 475 thực hiện tự động thử lại các lệnh gọi hệ thống trên EINTR. Điều này loại bỏ gánh nặng xử lý EINTR hoặc InterruptedError trong mã người dùng trong hầu hết các trường hợp và làm cho các chương trình Python, bao gồm cả thư viện chuẩn, trở nên mạnh mẽ hơn. Lưu ý rằng cuộc gọi hệ thống chỉ được thử lại nếu trình xử lý tín hiệu không đưa ra ngoại lệ.

Dưới đây là danh sách các chức năng hiện được thử lại khi bị gián đoạn bởi tín hiệu:

Xem thêm

PEP 475 -- Thử lại cuộc gọi hệ thống không thành công với EINTR

PEP và phần triển khai được viết bởi Charles-François Natali và Victor Stinner, với sự trợ giúp của Antoine Pitrou (kết nối người Pháp).

PEP 479: Thay đổi cách xử lý StopIteration bên trong máy phát điện

Sự tương tác giữa các trình tạo và StopIteration trong Python 3.4 trở về trước đôi khi rất đáng ngạc nhiên và có thể che giấu các lỗi khó hiểu. Trước đây, StopIteration vô tình được nâng lên bên trong hàm tạo được hiểu là sự kết thúc của vòng lặp bởi cấu trúc vòng lặp điều khiển trình tạo.

PEP 479 thay đổi hành vi của trình tạo: khi ngoại lệ StopIteration được đưa ra bên trong trình tạo, nó sẽ được thay thế bằng RuntimeError trước khi thoát khỏi khung trình tạo. Mục tiêu chính của thay đổi này là để dễ dàng gỡ lỗi trong trường hợp lệnh gọi next() không được bảo vệ tăng StopIteration và khiến quá trình lặp do trình tạo điều khiển kết thúc một cách âm thầm. Điều này đặc biệt nguy hiểm khi kết hợp với cấu trúc yield from.

Đây là một thay đổi không tương thích ngược, vì vậy để kích hoạt hành vi mới, cần phải nhập __future__

>>> từ __future__ nhập máy phát điện_stop

>>> def gen():
... tiếp theo(iter([]))
... năng suất
...
>>> tiếp theo(gen())
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 2, ở gen
Dừng lại

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

Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
RuntimeError: trình tạo đã tăng StopIteration

Nếu không nhập __future__, PendingDeprecationWarning sẽ được tăng lên bất cứ khi nào ngoại lệ StopIteration được đưa ra bên trong trình tạo.

Xem thêm

PEP 479 -- Thay đổi cách xử lý StopIteration bên trong trình tạo

PEP được viết bởi Chris Angelico và Guido van Rossum. Được thực hiện bởi Chris Angelico, Yury Selivanov và Nick Coghlan.

PEP 485: Hàm kiểm tra sự bằng nhau gần đúng

PEP 485 thêm các hàm math.isclose()cmath.isclose() cho biết hai giá trị gần bằng nhau hay "gần" với nhau. Việc hai giá trị có được coi là gần nhau hay không được xác định theo dung sai tuyệt đối và tương đối đã cho. Dung sai tương đối là chênh lệch tối đa được phép giữa các đối số isclose, so với giá trị tuyệt đối lớn hơn:

>>> nhập toán
>>> a = 5,0
>>> b = 4,99998
>>> math.isclose(a, b, rel_tol=1e-5)
đúng
>>> math.isclose(a, b, rel_tol=1e-6)
sai

Cũng có thể so sánh hai giá trị bằng cách sử dụng dung sai tuyệt đối, giá trị này phải là giá trị không âm:

>>> nhập toán
>>> a = 5,0
>>> b = 4,99998
>>> math.isclose(a, b, abs_tol=0,00003)
đúng
>>> math.isclose(a, b, abs_tol=0,00001)
sai

Xem thêm

PEP 485 -- Một hàm để kiểm tra sự bằng nhau gần đúng

PEP được viết bởi Christopher Barker; được thực hiện bởi Chris Barker và Tal Einat.

PEP 486: Làm cho Trình khởi chạy Python nhận biết được môi trường ảo

PEP 486 làm cho trình khởi chạy Windows (xem PEP 397) nhận biết được môi trường ảo đang hoạt động. Khi trình thông dịch mặc định được sử dụng và biến môi trường VIRTUAL_ENV được đặt, trình thông dịch trong môi trường ảo sẽ được sử dụng.

Xem thêm

PEP 486 -- Làm cho Trình khởi chạy Python nhận biết được môi trường ảo

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

PEP 488: Loại bỏ các tập tin PYO

PEP 488 không còn khái niệm về tệp .pyo. Điều này có nghĩa là các tệp .pyc đại diện cho cả mã byte chưa được tối ưu hóa và được tối ưu hóa. Để tránh phải liên tục tạo lại các tệp mã byte, các tệp .pyc hiện có thẻ opt- tùy chọn trong tên của chúng khi mã byte được tối ưu hóa. Điều này có tác dụng phụ là không còn xung đột tên tệp mã byte khi chạy dưới -O hoặc -OO. Do đó, các tệp mã byte được tạo từ -O-OO hiện có thể tồn tại đồng thời. importlib.util.cache_from_source() đã cập nhật API để trợ giúp cho sự thay đổi này.

Xem thêm

PEP 488 -- Loại bỏ các tập tin PYO

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

PEP 489: Khởi tạo mô-đun mở rộng nhiều pha

PEP 489 cập nhật quá trình khởi tạo mô-đun mở rộng để tận dụng cơ chế tải mô-đun hai bước được PEP 451 giới thiệu trong Python 3.4.

Thay đổi này mang lại ngữ nghĩa nhập của các mô-đun mở rộng chọn tham gia sử dụng cơ chế mới gần hơn với các mô-đun nguồn và mã byte Python, bao gồm khả năng sử dụng bất kỳ mã định danh hợp lệ nào làm tên mô-đun, thay vì bị giới hạn ở ASCII.

Xem thêm

PEP 489 -- Khởi tạo mô-đun mở rộng nhiều pha

PEP được viết bởi Petr Viktorin, Stefan Behnel và Nick Coghlan; được thực hiện bởi Petr Viktorin.

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 trình xử lý lỗi "namereplace". Trình xử lý lỗi "backslashreplace" hiện hoạt động với giải mã và dịch. (Được đóng góp bởi Serhiy Storchaka trong bpo-19676bpo-22286.)

  • Tùy chọn -b hiện ảnh hưởng đến việc so sánh bytes với int. (Được đóng góp bởi Serhiy Storchaka trong bpo-23681.)

  • Kazakhstan kz1048 và Tajik koi8_t codecs mới. (Được đóng góp bởi Serhiy Storchaka trong bpo-22682bpo-22681.)

  • Chuỗi tài liệu thuộc tính hiện có thể ghi được. Điều này đặc biệt hữu ích cho các chuỗi tài liệu collections.namedtuple(). (Được đóng góp bởi Berker Peksag trong bpo-24064.)

  • Nhập khẩu tuần hoàn liên quan đến nhập khẩu tương đối hiện được hỗ trợ. (Được đóng góp bởi Brett Cannon và Antoine Pitrou trong bpo-17636.)

Mô-đun mới

đánh máy

Mô-đun typing provisional mới cung cấp các định nghĩa và công cụ tiêu chuẩn cho chú thích loại hàm. Xem Type Hints để biết thêm thông tin.

ứng dụng zip

Mô-đun zipapp mới (được chỉ định trong PEP 441) cung cấp công cụ dòng lệnh và API để tạo các Ứng dụng Python Zip có thể thực thi được, được giới thiệu trong Python 2.6 trong bpo-1739468, nhưng không được công bố rộng rãi vào thời điểm đó hoặc kể từ đó.

Với mô-đun mới, việc đóng gói ứng dụng của bạn cũng đơn giản như đặt tất cả các tệp, bao gồm tệp __main__.py, vào thư mục myapp và chạy:

$ python -m zipapp myapp
$ trăn myapp.pyz

Việc triển khai mô-đun đã được đóng góp bởi Paul Moore trong bpo-23491.

Xem thêm

PEP 441 -- Cải thiện hỗ trợ ứng dụng Python ZIP

Mô-đun cải tiến

phân tích cú pháp

Lớp ArgumentParser hiện cho phép vô hiệu hóa abbreviated usage các tùy chọn dài bằng cách đặt allow_abbrev thành False. (Được đóng góp bởi Jonathan Paugh, Steven Bethard, paul j3 và Daniel Eriksson trong bpo-14910.)

asyncio

Vì mô-đun asyncioprovisional nên tất cả các thay đổi được giới thiệu trong Python 3.5 cũng đã được chuyển sang Python 3.4.x.

Những thay đổi đáng chú ý trong mô-đun asyncio kể từ Python 3.4.0:

  • API gỡ lỗi mới: phương pháp loop.set_debug()loop.get_debug(). (Được đóng góp bởi Victor Stinner.)

  • Vòng lặp sự kiện proactor hiện hỗ trợ SSL. (Được đóng góp bởi Antoine Pitrou và Victor Stinner trong bpo-22560.)

  • Phương pháp loop.is_closed() mới để kiểm tra xem vòng lặp sự kiện có bị đóng hay không. (Được đóng góp bởi Victor Stinner trong bpo-21326.)

  • Một loop.create_task() mới để tạo và lên lịch một Task mới cho một coroutine một cách thuận tiện. Phương thức create_task cũng được sử dụng bởi tất cả các hàm asyncio để gói coroutine vào các tác vụ, chẳng hạn như asyncio.wait(), asyncio.gather(), v.v. (Được đóng góp bởi Victor Stinner.)

  • Một phương pháp transport.get_write_buffer_limits() mới để tìm hiểu giới hạn nước high-low- của bộ điều khiển dòng chảy. (Được đóng góp bởi Victor Stinner.)

  • Chức năng async() không còn được dùng nữa để thay thế cho ensure_future(). (Được đóng góp bởi Yury Selivanov.)

  • Các phương thức loop.set_task_factory()loop.get_task_factory() mới để tùy chỉnh nhà máy tác vụ mà phương thức loop.create_task() sử dụng. (Được đóng góp bởi Yury Selivanov.)

  • Phương thức xếp hàng Queue.join()Queue.task_done() mới. (Được đóng góp bởi Victor Stinner.)

  • Lớp JoinableQueue đã bị loại bỏ để nhường chỗ cho lớp asyncio.Queue. (Được đóng góp bởi Victor Stinner.)

Cập nhật trong 3.5.1:

  • Hàm ensure_future() và tất cả các hàm sử dụng nó, chẳng hạn như loop.run_until_complete(), hiện chấp nhận tất cả các loại awaitable objects. (Được đóng góp bởi Yury Selivanov.)

  • Hàm run_coroutine_threadsafe() mới để gửi coroutine tới các vòng lặp sự kiện từ các luồng khác. (Được đóng góp bởi Vincent Michel.)

  • Phương pháp Transport.is_closing() mới để kiểm tra xem quá trình vận chuyển đang đóng hay đã đóng. (Được đóng góp bởi Yury Selivanov.)

  • Phương thức loop.create_server() hiện có thể chấp nhận danh sách máy chủ. (Được đóng góp bởi Yann Sionneau.)

Cập nhật trong 3.5.2:

  • Phương thức loop.create_future() mới để tạo các đối tượng Tương lai. Điều này cho phép triển khai vòng lặp sự kiện thay thế, chẳng hạn như uvloop, để triển khai asyncio.Future nhanh hơn. (Được đóng góp bởi Yury Selivanov.)

  • Phương thức loop.get_exception_handler() mới để xử lý ngoại lệ hiện tại. (Được đóng góp bởi Yury Selivanov.)

  • Phương pháp StreamReader.readuntil() mới để đọc dữ liệu từ luồng cho đến khi xuất hiện chuỗi byte phân tách. (Được đóng góp bởi Mark Korenberg.)

  • Các phương thức loop.create_connection()loop.create_server() được tối ưu hóa để tránh gọi hàm getaddrinfo của hệ thống nếu địa chỉ đã được giải quyết. (Được đóng góp bởi A. Jesse Jiryu Davis.)

  • loop.sock_connect(sock, address) không còn yêu cầu phải giải quyết address trước cuộc gọi nữa. (Được đóng góp bởi A. Jesse Jiryu Davis.)

bz2

Phương thức BZ2Decompressor.decompress hiện chấp nhận đối số max_length tùy chọn để giới hạn kích thước tối đa của dữ liệu được giải nén. (Được đóng góp bởi Nikolaus Rath trong bpo-15955.)

cgi

Lớp FieldStorage hiện hỗ trợ giao thức context manager. (Được đóng góp bởi Berker Peksag trong bpo-20289.)

cmath

Hàm mới isclose() cung cấp một cách để kiểm tra sự bằng nhau gần đúng. (Được đóng góp bởi Chris Barker và Tal Einat trong bpo-24270.)

Phương thức InteractiveInterpreter.showtraceback() hiện in truy nguyên theo chuỗi đầy đủ, giống như trình thông dịch tương tác. (Được đóng góp bởi Claudiu Popa trong bpo-17442.)

bộ sưu tập

Lớp OrderedDict hiện được triển khai trong C, giúp tốc độ nhanh hơn từ 4 đến 100 lần. (Được đóng góp bởi Eric Snow trong bpo-16991.)

Các chế độ xem OrderedDict.items(), OrderedDict.keys()OrderedDict.values() hiện hỗ trợ lặp lại reversed(). (Được đóng góp bởi Serhiy Storchaka trong bpo-19505.)

Lớp deque hiện định nghĩa index(), insert()copy(), đồng thời hỗ trợ các toán tử +*. Điều này cho phép deques được nhận dạng là MutableSequence và cải thiện khả năng thay thế của chúng cho danh sách. (Được đóng góp bởi Raymond Hettinger trong bpo-23704.)

Hiện tại, các chuỗi tài liệu do namedtuple() tạo ra có thể được cập nhật:

Điểm = nametuple('Điểm', ['x', 'y'])
Point.__doc__ += ': Tọa độ Descartes'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'thứ tự'

(Được đóng góp bởi Berker Peksag trong bpo-24064.)

Lớp UserString hiện triển khai các phương thức __getnewargs__(), __rmod__(), casefold(), format_map(), isprintable()maketrans() để khớp với các phương thức tương ứng của str. (Được đóng góp bởi Joe Jevnik trong bpo-22189.)

bộ sưu tập.abc

Phương thức Sequence.index() hiện chấp nhận các đối số startstop để khớp với các phương thức tương ứng của tuple, list, v.v. (Được đóng góp bởi Devin Jeanpierre trong bpo-23086.)

Một lớp cơ sở trừu tượng Generator mới. (Được đóng góp bởi Stefan Behnel trong bpo-24018.)

Các lớp cơ sở trừu tượng Awaitable, Coroutine, AsyncIteratorAsyncIterable mới. (Được đóng góp bởi Yury Selivanov trong bpo-24184.)

Đối với các phiên bản Python cũ hơn, bản backport của ABC mới có sẵn ở PyPI package bên ngoài.

biên soạn tất cả

Một tùy chọn compileall mới, -j N, cho phép chạy đồng thời các nhân viên N để thực hiện việc biên dịch mã byte song song. Hàm compile_dir() có tham số workers tương ứng. (Được đóng góp bởi Claudiu Popa trong bpo-16104.)

Một tùy chọn mới khác, -r, cho phép kiểm soát mức đệ quy tối đa cho các thư mục con. (Được đóng góp bởi Claudiu Popa trong bpo-19628.)

Tùy chọn dòng lệnh -q hiện có thể được chỉ định nhiều lần, trong trường hợp đó, tất cả đầu ra, bao gồm cả lỗi, sẽ bị chặn. Tham số quiet tương ứng trong compile_dir(), compile_file()compile_path() hiện có thể chấp nhận một giá trị nguyên cho biết mức độ triệt tiêu đầu ra. (Được đóng góp bởi Thomas Kluyver trong bpo-21338.)

đồng thời.futures

Phương thức Executor.map() hiện chấp nhận đối số chunksize để cho phép phân nhóm các tác vụ nhằm cải thiện hiệu suất khi sử dụng ProcessPoolExecutor(). (Được đóng góp bởi Dan O'Reilly trong bpo-11271.)

Số lượng công nhân trong hàm tạo ThreadPoolExecutor hiện là tùy chọn. Giá trị mặc định là gấp 5 lần số lượng CPU. (Được đóng góp bởi Claudiu Popa trong bpo-21527.)

trình phân tích cú pháp cấu hình

configparser hiện cung cấp cách tùy chỉnh việc chuyển đổi các giá trị bằng cách chỉ định từ điển các bộ chuyển đổi trong hàm tạo ConfigParser hoặc bằng cách xác định chúng dưới dạng phương thức trong các lớp con ConfigParser. Các bộ chuyển đổi được xác định trong một phiên bản trình phân tích cú pháp được kế thừa bởi các proxy phần của nó.

Ví dụ:

>>> nhập trình phân tích cấu hình
>>> chuyển đổi = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... danh sách = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> phần = cfg['s']
>>> phần.getlist('danh sách')
['a', 'b', 'c', 'd', 'e', 'f', 'g']

(Được đóng góp bởi Łukasz Langa trong bpo-18159.)

bối cảnh

redirect_stderr() context manager mới (tương tự redirect_stdout()) giúp các tập lệnh tiện ích dễ dàng xử lý các API không linh hoạt ghi đầu ra của chúng vào sys.stderr và không cung cấp bất kỳ tùy chọn nào để chuyển hướng nó:

>>> nhập ngữ cảnhlib, io, ghi nhật 
>>> f = io.StringIO()
>>> với contextlib.redirect_stderr(f):
... ghi nhật .warning('cảnh báo')
...
>>> f.getvalue()
'WARNING:root:cảnh báo\n'

(Được đóng góp bởi Berker Peksag trong bpo-22389.)

csv

Phương thức writerow() hiện hỗ trợ các lần lặp tùy ý, không chỉ các chuỗi. (Được đóng góp bởi Serhiy Storchaka trong bpo-23171.)

chửi rủa

Hàm update_lines_cols() mới cập nhật các biến mô-đun LINESCOLS. Điều này rất hữu ích để phát hiện việc thay đổi kích thước màn hình thủ công. (Được đóng góp bởi Arnon Yaari trong bpo-4254.)

dbm

dumb.open luôn tạo cơ sở dữ liệu mới khi cờ có giá trị "n". (Được đóng góp bởi Claudiu Popa trong bpo-18039.)

khuếch tán

Bộ ký tự của tài liệu HTML do HtmlDiff.make_file() tạo hiện có thể được tùy chỉnh bằng cách sử dụng đối số chỉ từ khóa charset mới. Bộ ký tự mặc định của tài liệu HTML đã thay đổi từ "ISO-8859-1" thành "utf-8". (Được đóng góp bởi Berker Peksag trong bpo-2052.)

Hàm diff_bytes() hiện có thể so sánh danh sách các chuỗi byte. Điều này khắc phục sự hồi quy từ Python 2. (Được đóng góp bởi Terry J. Reedy và Greg Ward trong bpo-17445.)

nước cất

Cả hai lệnh buildbuild_ext hiện đều chấp nhận tùy chọn -j để cho phép xây dựng song song các mô-đun mở rộng. (Được đóng góp bởi Antoine Pitrou trong bpo-5309.)

Mô-đun distutils hiện hỗ trợ nén xz và có thể được bật bằng cách chuyển xztar làm đối số cho bdist --format. (Được đóng góp bởi Serhiy Storchaka trong bpo-16314.)

doc nhất

Hàm DocTestSuite() trả về một unittest.TestSuite trống nếu module không chứa chuỗi tài liệu, thay vì tăng ValueError. (Được đóng góp bởi Glenn Jones trong bpo-15916.)

email

Tùy chọn chính sách mới Policy.mangle_from_ kiểm soát xem các dòng bắt đầu bằng "From " trong nội dung email có được tạo tiền tố bằng ký tự ">" hay không. Mặc định là True cho compat32False cho tất cả các chính sách khác. (Được đóng góp bởi Milan Oberkirch trong bpo-20098.)

Phương thức Message.get_content_disposition() mới giúp dễ dàng truy cập vào giá trị chuẩn cho tiêu đề Content-Disposition. (Được đóng góp bởi Abhilash Raj trong bpo-21083.)

Tùy chọn chính sách mới EmailPolicy.utf8 có thể được đặt thành True để mã hóa tiêu đề email bằng bộ ký tự UTF-8 thay vì sử dụng các từ được mã hóa. Điều này cho phép Messages được định dạng theo RFC 6532 và được sử dụng với máy chủ SMTP hỗ trợ tiện ích mở rộng RFC 6531 SMTPUTF8. (Được đóng góp bởi R. David Murray trong bpo-24211.)

Hàm tạo mime.text.MIMEText hiện chấp nhận phiên bản charset.Charset. (Được đóng góp bởi Claude Paroz và Berker Peksag trong bpo-16324.)

liệt kê

Có thể gọi Enum có tham số mới start để chỉ định số giá trị enum ban đầu nếu chỉ cung cấp names

>>> Động vật = enum.Enum('Động vật', 'chó mèo', start=10)
>>> Động vật.cat
<Động vật.cat: 10>
>>> Động vật.dog
<Động vật.dog: 11>

(Được đóng góp bởi Ethan Furman trong bpo-21706.)

người xử lý lỗi

Các hàm enable(), register(), dump_traceback()dump_traceback_later() hiện chấp nhận các bộ mô tả tệp ngoài các đối tượng giống như tệp. (Được đóng góp bởi Wei Wu trong bpo-23566.)

công cụ chức năng

Hầu hết máy móc lru_cache() hiện được triển khai bằng C, khiến nó nhanh hơn đáng kể. (Được đóng góp bởi Matt Joiner, Alexey Kachayev và Serhiy Storchaka trong bpo-14373.)

quả địa cầu

Các hàm iglob()glob() hiện hỗ trợ tìm kiếm đệ quy trong các thư mục con, sử dụng mẫu "**". (Được đóng góp bởi Serhiy Storchaka trong bpo-13968.)

gzip

Đối số mode của hàm tạo GzipFile hiện chấp nhận "x" để yêu cầu tạo độc quyền. (Được đóng góp bởi Tim Heaney trong bpo-19222.)

đống q

Hiện tại, bạn có thể tùy chỉnh so sánh phần tử trong merge() bằng cách chuyển key function vào đối số từ khóa key tùy chọn mới và đối số từ khóa reverse tùy chọn mới có thể được sử dụng để đảo ngược so sánh phần tử:

>>> nhập heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(đảo ngược(a), đảo ngược(b), key=len, đảo ngược=True))
['55555', '6666', '777', '88', '9']

(Được đóng góp bởi Raymond Hettinger trong bpo-13742.)

http

Một enum HTTPStatus mới xác định một bộ mã trạng thái HTTP, cụm từ lý do và mô tả dài được viết bằng tiếng Anh. (Được đóng góp bởi Demian Brecht trong bpo-21793.)

http.client

HTTPConnection.getresponse() hiện đưa ra ngoại lệ RemoteDisconnected khi kết nối máy chủ từ xa bị đóng đột ngột. Ngoài ra, nếu ConnectionError (trong đó RemoteDisconnected là lớp con) được nâng lên, ổ cắm máy khách hiện sẽ tự động đóng và sẽ kết nối lại theo yêu cầu tiếp theo:

nhập http.client
conn = http.client.HTTPConnection('www.python.org')
để thử lại trong phạm vi (3):
    thử:
        conn.request('GET', '/')
        resp = conn.getresponse()
    ngoại trừ http.client.RemoteDisconnected:
        vượt qua

(Được đóng góp bởi Martin Panter trong bpo-3566.)

nhàn rỗi và IDLE

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

imaplib

Lớp IMAP4 hiện hỗ trợ giao thức context manager. Khi được sử dụng trong câu lệnh with, lệnh IMAP4 LOGOUT sẽ được gọi tự động ở cuối khối. (Được đóng góp bởi Tarek Ziadé và Serhiy Storchaka trong bpo-4972.)

Mô-đun imaplib hiện hỗ trợ RFC 5161 (Tiện ích mở rộng ENABLE) và RFC 6855 (Hỗ trợ UTF-8) thông qua phương thức IMAP4.enable(). Thuộc tính IMAP4.utf8_enabled mới theo dõi xem hỗ trợ RFC 6855 có được bật hay không. (Được đóng góp bởi Milan Oberkirch, R. David Murray và Maciej Szulik trong bpo-21800.)

Mô-đun imaplib hiện tự động mã hóa tên người dùng và mật khẩu chuỗi không phải ASCII bằng UTF-8, theo khuyến nghị của RFC. (Được đóng góp bởi Milan Oberkirch trong bpo-21800.)

imghdr

Hàm what() hiện nhận dạng định dạng OpenEXR (do Martin Vignali và Claudiu Popa đóng góp trong bpo-20295) và định dạng WebP (do Fabrice Aneche và Claudiu Popa đóng góp trong bpo-20197.)

nhập khẩu

Lớp util.LazyLoader cho phép tải từng phần mô-đun trong các ứng dụng mà thời gian khởi động là quan trọng. (Được đóng góp bởi Brett Cannon trong bpo-17621.)

Phương thức abc.InspectLoader.source_to_code() hiện là phương thức tĩnh. Điều này giúp việc khởi tạo đối tượng mô-đun bằng mã được biên dịch từ một chuỗi dễ dàng hơn bằng cách chạy exec(code, module.__dict__). (Được đóng góp bởi Brett Cannon trong bpo-21156.)

Chức năng util.module_from_spec() mới hiện là cách ưa thích để tạo mô-đun mới. Ngược lại với việc tạo trực tiếp một phiên bản types.ModuleType, hàm mới này sẽ đặt các thuộc tính được kiểm soát nhập khác nhau dựa trên đối tượng thông số kỹ thuật được truyền vào. (Được đóng góp bởi Brett Cannon trong bpo-20383.)

kiểm tra

Cả hai lớp SignatureParameter hiện đều có thể chọn và băm được. (Được đóng góp bởi Yury Selivanov trong bpo-20726bpo-20334.)

Phương thức BoundArguments.apply_defaults() mới cung cấp cách đặt giá trị mặc định cho các đối số bị thiếu

>>> def foo(a, b='ham', *args): vượt qua
>>> ba = kiểm tra.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

(Được đóng góp bởi Yury Selivanov trong bpo-24190.)

Phương thức lớp mới Signature.from_callable() giúp việc phân lớp con của Signature trở nên dễ dàng hơn. (Được đóng góp bởi Yury Selivanov và Eric Snow trong bpo-17373.)

Hàm signature() hiện chấp nhận đối số từ khóa tùy chọn follow_wrapped, khi được đặt thành False, sẽ vô hiệu hóa việc tự động theo dõi các liên kết __wrapped__. (Được đóng góp bởi Yury Selivanov trong bpo-20691.)

Một bộ chức năng mới để kiểm tra coroutine functionscoroutine objects đã được thêm vào: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals()getcoroutinestate(). (Được đóng góp bởi Yury Selivanov trong bpo-24017bpo-24400.)

Các hàm stack(), trace(), getouterframes()getinnerframes() hiện trả về danh sách các bộ dữ liệu được đặt tên. (Được đóng góp bởi Daniel Shahaf trong bpo-16808.)

io

Một phương thức BufferedIOBase.readinto1() mới, sử dụng tối đa một lệnh gọi đến các phương thức RawIOBase.read() hoặc RawIOBase.readinto() của luồng thô cơ bản. (Được đóng góp bởi Nikolaus Rath trong bpo-20578.)

váy ipad

Cả hai lớp IPv4NetworkIPv6Network hiện đều chấp nhận đối số bộ dữ liệu (address, netmask), để dễ dàng xây dựng các đối tượng mạng từ các địa chỉ hiện có:

>>> nhập ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
Mạng IPv4('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
Mạng IPv4('127.0.0.0/8')

(Được đóng góp bởi Peter Moody và Antoine Pitrou trong bpo-16531.)

Thuộc tính reverse_pointer mới cho các lớp IPv4AddressIPv6Address trả về tên của bản ghi DNS PTR ngược:

>>> nhập ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(Được đóng góp bởi Leon Weber trong bpo-20480.)

json

Giao diện dòng lệnh json.tool hiện giữ nguyên thứ tự các khóa trong đối tượng JSON được truyền vào đầu vào. Tùy chọn --sort-keys mới có thể được sử dụng để sắp xếp các phím theo thứ tự bảng chữ cái. (Được đóng góp bởi Berker Peksag trong bpo-21650.)

Bộ giải mã JSON hiện tăng JSONDecodeError thay vì ValueError để cung cấp thông tin ngữ cảnh tốt hơn về lỗi. (Được đóng góp bởi Serhiy Storchaka trong bpo-19361.)

bộ đệm dòng

Chức năng lazycache() mới có thể được sử dụng để thu thập thông tin về mô-đun không dựa trên tệp nhằm cho phép nhận các dòng của nó sau này thông qua getline(). Điều này tránh thực hiện I/O cho đến khi thực sự cần một dòng mà không cần phải mang mô-đun toàn cục đi khắp nơi vô thời hạn. (Được đóng góp bởi Robert Collins trong bpo-17911.)

ngôn ngữ

Có thể sử dụng hàm delocalize() mới để chuyển đổi một chuỗi thành chuỗi số chuẩn hóa, có tính đến cài đặt LC_NUMERIC:

>>> nhập ngôn ngữ
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234,56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234,56'

(Được đóng góp bởi Cédric Krier trong bpo-13918.)

khai thác gỗ

Tất cả các phương thức ghi nhật ký (Logger log(), exception(), critical(), debug(), v.v.), hiện chấp nhận các trường hợp ngoại lệ dưới dạng đối số exc_info, ngoài các giá trị boolean và bộ dữ liệu ngoại lệ:

>>> nhập nhật 
>>> thử:
... 1/0
... ngoại trừ ZeroDivisionError như :
... log.error('ngoại lệ', exc_info=ex)
ERROR:root:ngoại lệ

(Được đóng góp bởi Yury Selivanov trong bpo-20537.)

Lớp handlers.HTTPHandler hiện chấp nhận phiên bản ssl.SSLContext tùy chọn để định cấu hình cài đặt SSL được sử dụng trong kết nối HTTP. (Được đóng góp bởi Alex Gaynor trong bpo-22788.)

Lớp handlers.QueueListener hiện có một đối số từ khóa respect_handler_level, nếu được đặt thành True, sẽ chuyển thông báo đến các trình xử lý có tính đến các cấp độ xử lý. (Đóng góp bởi Vinay Sajip.)

lzma

Phương thức LZMADecompressor.decompress() hiện chấp nhận đối số max_length tùy chọn để giới hạn kích thước tối đa của dữ liệu được giải nén. (Được đóng góp bởi Martin Panter trong bpo-15955.)

môn toán

Hai hằng số mới đã được thêm vào mô-đun math: infnan. (Được đóng góp bởi Mark Dickinson trong bpo-23185.)

Hàm mới isclose() cung cấp một cách để kiểm tra sự bằng nhau gần đúng. (Được đóng góp bởi Chris Barker và Tal Einat trong bpo-24270.)

Một chức năng gcd() mới đã được thêm vào. Chức năng fractions.gcd() hiện không được dùng nữa. (Được đóng góp bởi Mark Dickinson và Serhiy Storchaka trong bpo-22486.)

đa xử lý

Các đối tượng sharedctypes.synchronized() hiện hỗ trợ giao thức context manager. (Được đóng góp bởi Charles-François Natali trong bpo-21565.)

toán tử

Các đối tượng attrgetter(), itemgetter()methodcaller() hiện hỗ trợ dưa chua. (Được đóng góp bởi Josh Rosenberg và Serhiy Storchaka trong bpo-22955.)

Các hàm matmul()imatmul() mới để thực hiện phép nhân ma trận. (Được đóng góp bởi Benjamin Peterson trong bpo-21176.)

hệ điều hành

Hàm scandir() mới trả về một trình vòng lặp của các đối tượng DirEntry đã được thêm vào. Nếu có thể, scandir() trích xuất các thuộc tính tệp trong khi quét một thư mục, loại bỏ nhu cầu thực hiện các lệnh gọi hệ thống tiếp theo để xác định loại hoặc thuộc tính tệp, điều này có thể cải thiện đáng kể hiệu suất. (Được đóng góp bởi Ben Hoyt với sự giúp đỡ của Victor Stinner trong bpo-22524.)

Trên Windows, hiện đã có thuộc tính stat_result.st_file_attributes mới. Nó tương ứng với thành viên dwFileAttributes của cấu trúc BY_HANDLE_FILE_INFORMATION được trả về bởi GetFileInformationByHandle(). (Được đóng góp bởi Ben Hoyt trong bpo-21719.)

Hàm urandom() hiện sử dụng tòa nhà getrandom() trên Linux 3.17 trở lên và getentropy() trên OpenBSD 5.6 trở lên, loại bỏ nhu cầu sử dụng /dev/urandom và tránh lỗi do hết bộ mô tả tệp. (Được đóng góp bởi Victor Stinner trong bpo-22181.)

Các chức năng get_blocking()set_blocking() mới cho phép nhận và thiết lập chế độ chặn của bộ mô tả tệp (O_NONBLOCK.) (Được đóng góp bởi Victor Stinner trong bpo-22054.)

Các chức năng truncate()ftruncate() hiện được hỗ trợ trên Windows. (Được đóng góp bởi Steve Dower trong bpo-23668.)

Có một hàm os.path.commonpath() mới trả về đường dẫn phụ chung dài nhất của mỗi tên đường dẫn đã truyền. Không giống như hàm os.path.commonprefix(), nó luôn trả về một đường dẫn hợp lệ:

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

(Được đóng góp bởi Rafik Draoui và Serhiy Storchaka trong bpo-10395.)

đường dẫn

Phương thức Path.samefile() mới có thể được sử dụng để kiểm tra xem đường dẫn có trỏ đến cùng một tệp với đường dẫn khác hay không, có thể là một đối tượng Path khác hoặc một chuỗi

>>> nhập pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
đúng

(Được đóng góp bởi Vajrasky Kok và Antoine Pitrou trong bpo-19775.)

Phương thức Path.mkdir() hiện chấp nhận một đối số exist_ok tùy chọn mới để khớp với chức năng mkdir -pos.makedirs(). (Được đóng góp bởi Berker Peksag trong bpo-21539.)

Có một phương pháp Path.expanduser() mới để mở rộng tiền tố ~~user. (Được đóng góp bởi Serhiy Storchaka và Claudiu Popa trong bpo-19776.)

Một phương thức lớp Path.home() mới có thể được sử dụng để lấy một phiên bản Path đại diện cho thư mục chính của người dùng. (Được đóng góp bởi Victor Salgado và Mayank Tripathi trong bpo-19777.)

Các phương thức Path.write_text(), Path.read_text(), Path.write_bytes(), Path.read_bytes() mới để đơn giản hóa thao tác đọc/ghi trên tệp.

Đoạn mã sau sẽ tạo hoặc ghi lại tệp hiện có ~/spam42:

>>> nhập pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3

(Được đóng góp bởi Christopher Welborn trong bpo-20218.)

dưa chua

Các đối tượng lồng nhau, chẳng hạn như các phương thức không liên kết hoặc các lớp lồng nhau, giờ đây có thể được chọn bằng cách sử dụng pickle protocols cũ hơn giao thức phiên bản 4. Giao thức phiên bản 4 đã hỗ trợ những trường hợp này. (Được đóng góp bởi Serhiy Storchaka trong bpo-23611.)

poplib

Lệnh POP3.utf8() mới cho phép hỗ trợ RFC 6856 (Email quốc tế hóa), nếu máy chủ POP hỗ trợ nó. (Được đóng góp bởi Milan OberKirch trong bpo-21804.)

lại

Hiện được phép tham chiếu và tham chiếu có điều kiện đến các nhóm có độ dài cố định trong các xác nhận nhìn sau:

>>> nhập lại
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
Đối tượng <_sre.SRE_Match; span=(0, 3), match='aac'>
>>> pat.match('bbc')
Đối tượng <_sre.SRE_Match; span=(0, 3), match='bbc'>

(Được đóng góp bởi Serhiy Storchaka trong bpo-9179.)

Số lượng nhóm chụp trong biểu thức chính quy không còn giới hạn ở 100. (Được đóng góp bởi Serhiy Storchaka trong bpo-22437.)

Các hàm sub()subn() hiện thay thế các nhóm chưa khớp bằng các chuỗi trống thay vì đưa ra một ngoại lệ. (Được đóng góp bởi Serhiy Storchaka trong bpo-1519638.)

Các ngoại lệ re.error có các thuộc tính mới, msg, pattern, pos, linenocolno, cung cấp thông tin ngữ cảnh tốt hơn về lỗi:

>>> re.compile("""
... (?x)
... .++
... """)
Traceback (cuộc gọi gần đây nhất):
   ...
sre_constants.error: lặp lại nhiều lần ở vị trí 16 (dòng 3, cột 7)

(Được đóng góp bởi Serhiy Storchaka trong bpo-22578.)

dòng đọc

Hàm append_history_file() mới có thể được sử dụng để nối thêm số phần tử theo sau được chỉ định trong lịch sử vào tệp đã cho. (Được đóng góp bởi Bruno Cauet trong bpo-22940.)

bộ chọn

Zz000zz mới hỗ trợ bỏ phiếu /dev/poll hiệu quả trên Solaris. (Được đóng góp bởi Giampaolo Rodola' trong bpo-18931.)

im lặng

Hàm move() hiện chấp nhận đối số copy_function, ví dụ: cho phép sử dụng hàm copy() thay vì copy2() mặc định nếu có nhu cầu bỏ qua siêu dữ liệu tệp khi di chuyển. (Được đóng góp bởi Claudiu Popa trong bpo-19840.)

Chức năng make_archive() hiện hỗ trợ định dạng xztar. (Được đóng góp bởi Serhiy Storchaka trong bpo-5411.)

tín hiệu

Trên Windows, chức năng set_wakeup_fd() hiện cũng hỗ trợ các tay cầm ổ cắm. (Được đóng góp bởi Victor Stinner trong bpo-22018.)

Các hằng số SIG* khác nhau trong mô-đun signal đã được chuyển đổi thành Enums. Điều này cho phép in các tên có ý nghĩa trong quá trình gỡ lỗi, thay vì "số ma thuật" số nguyên. (Được đóng góp bởi Giampaolo Rodola' trong bpo-21076.)

smtpd

Cả hai lớp SMTPServerSMTPChannel hiện đều chấp nhận đối số từ khóa decode_data để xác định xem phần DATA của giao dịch SMTP có được giải mã bằng cách sử dụng codec "utf-8" hay thay vào đó được cung cấp cho phương thức SMTPServer.process_message() dưới dạng chuỗi byte. Mặc định là True vì lý do tương thích ngược, nhưng sẽ thay đổi thành False trong Python 3.6. Nếu decode_data được đặt thành False, phương thức process_message phải được chuẩn bị để chấp nhận đối số từ khóa. (Được đóng góp bởi Maciej Szulik trong bpo-19662.)

Lớp SMTPServer hiện quảng cáo tiện ích mở rộng 8BITMIME (RFC 6152) nếu decode_data được đặt True. Nếu máy khách chỉ định BODY=8BITMIME trên lệnh MAIL, nó sẽ được chuyển đến SMTPServer.process_message() thông qua từ khóa mail_options. (Được đóng góp bởi Milan Oberkirch và R. David Murray trong bpo-21795.)

Lớp SMTPServer hiện cũng hỗ trợ tiện ích mở rộng SMTPUTF8 (RFC 6531: Email quốc tế hóa). Nếu khách hàng chỉ định SMTPUTF8 BODY=8BITMIME trên lệnh MAIL, chúng sẽ được chuyển đến SMTPServer.process_message() thông qua từ khóa mail_options. Phương pháp process_message có trách nhiệm xử lý chính xác dữ liệu SMTPUTF8. (Được đóng góp bởi Milan Oberkirch trong bpo-21725.)

Giờ đây, bạn có thể cung cấp, trực tiếp hoặc thông qua phân giải tên, địa chỉ IPv6 trong hàm tạo SMTPServer và kết nối thành công. (Được đóng góp bởi Milan Oberkirch trong bpo-14758.)

smtplib

Phương thức SMTP.auth() mới cung cấp một cách thuận tiện để triển khai các cơ chế xác thực tùy chỉnh. (Được đóng góp bởi Milan Oberkirch trong bpo-15014.)

Phương thức SMTP.set_debuglevel() hiện chấp nhận mức gỡ lỗi bổ sung (2), cho phép đánh dấu thời gian trong thông báo gỡ lỗi. (Được đóng góp bởi Gavin Chappell và Maciej Szulik trong bpo-16914.)

Cả hai phương pháp SMTP.sendmail()SMTP.send_message() hiện đều hỗ trợ RFC 6531 (SMTPUTF8). (Được đóng góp bởi Milan Oberkirch và R. David Murray trong bpo-22027.)

sndhdr

Các hàm what()whathdr() hiện trả về namedtuple(). (Được đóng góp bởi Claudiu Popa trong bpo-18615.)

ổ cắm

Các chức năng có thời gian chờ hiện sử dụng đồng hồ đơn điệu thay vì đồng hồ hệ thống. (Được đóng góp bởi Victor Stinner trong bpo-22043.)

Phương thức socket.sendfile() mới cho phép gửi tệp qua ổ cắm bằng cách sử dụng chức năng os.sendfile() hiệu suất cao trên UNIX, giúp tốc độ tải lên nhanh hơn từ 2 đến 3 lần so với khi sử dụng socket.send() thông thường. (Được đóng góp bởi Giampaolo Rodola' trong bpo-17552.)

Phương thức socket.sendall() không còn đặt lại thời gian chờ của ổ cắm mỗi khi nhận hoặc gửi byte. Thời gian chờ của ổ cắm hiện là tổng thời lượng tối đa để gửi tất cả dữ liệu. (Được đóng góp bởi Victor Stinner trong bpo-23853.)

Đối số backlog của phương thức socket.listen() hiện là tùy chọn. Theo mặc định, nó được đặt thành SOMAXCONN hoặc 128, tùy theo giá trị nào ít hơn. (Được đóng góp bởi Charles-François Natali trong bpo-21455.)

ssl

Hỗ trợ bộ nhớ BIO

(Được đóng góp bởi Geert Jansen trong bpo-21965.)

Lớp SSLObject mới đã được thêm vào để cung cấp hỗ trợ giao thức SSL cho các trường hợp khi khả năng I/O mạng của SSLSocket là không cần thiết hoặc chưa tối ưu. SSLObject đại diện cho một phiên bản giao thức SSL, nhưng không triển khai bất kỳ phương thức I/O mạng nào và thay vào đó cung cấp giao diện bộ nhớ đệm. Lớp MemoryBIO mới có thể được sử dụng để truyền dữ liệu giữa Python và phiên bản giao thức SSL.

Hỗ trợ bộ nhớ BIO SSL chủ yếu nhằm mục đích sử dụng trong các khung triển khai I/O không đồng bộ mà mô hình sẵn sàng của SSLSocket ("chọn/thăm dò ý kiến") không hiệu quả.

Một phương thức SSLContext.wrap_bio() mới có thể được sử dụng để tạo một phiên bản SSLObject mới.

Hỗ trợ đàm phán giao thức lớp ứng dụng

(Được đóng góp bởi Benjamin Peterson trong bpo-20188.)

Khi có hỗ trợ OpenSSL, mô-đun ssl hiện triển khai tiện ích mở rộng Application-Layer Protocol Negotiation TLS như được mô tả trong RFC 7301.

Zz000zz mới có thể được sử dụng để chỉ định giao thức nào mà ổ cắm sẽ quảng cáo trong quá trình bắt tay TLS.

Zz000zz mới trả về giao thức đã được chọn trong quá trình bắt tay TLS. Cờ HAS_ALPN cho biết có hỗ trợ ALPN hay không.

Những thay đổi khác

Có một phương pháp SSLSocket.version() mới để truy vấn phiên bản giao thức thực tế đang được sử dụng. (Được đóng góp bởi Antoine Pitrou trong bpo-20421.)

Lớp SSLSocket hiện triển khai phương thức SSLSocket.sendfile(). (Được đóng góp bởi Giampaolo Rodola' trong bpo-17552.)

Phương thức SSLSocket.send() hiện đưa ra ngoại lệ ssl.SSLWantReadError hoặc ssl.SSLWantWriteError trên ổ cắm không chặn nếu thao tác sẽ chặn. Trước đây, nó sẽ trả về 0. (Được đóng góp bởi Nikolaus Rath trong bpo-20951.)

Hàm cert_time_to_seconds() hiện diễn giải thời gian đầu vào là UTC chứ không phải giờ địa phương, theo RFC 5280. Ngoài ra, giá trị trả về luôn là int. (Được đóng góp bởi Akira Li trong bpo-19940.)

Các phương thức SSLObject.shared_ciphers()SSLSocket.shared_ciphers() mới trả về danh sách mật mã được khách hàng gửi trong quá trình bắt tay. (Được đóng góp bởi Benjamin Peterson trong bpo-23186.)

Các phương thức SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown()SSLSocket.write() của lớp SSLSocket không còn đặt lại thời gian chờ của ổ cắm mỗi khi nhận hoặc gửi byte. Thời gian chờ của ổ cắm hiện là tổng thời lượng tối đa của phương thức. (Được đóng góp bởi Victor Stinner trong bpo-23853.)

Chức năng match_hostname() hiện hỗ trợ khớp địa chỉ IP. (Được đóng góp bởi Antoine Pitrou trong bpo-23239.)

sqlite3

Lớp Row hiện hỗ trợ đầy đủ giao thức tuần tự, đặc biệt là lập chỉ mục lát và lặp reversed(). (Được đóng góp bởi Claudiu Popa trong bpo-10203; bởi Lucas Sinclair, Jessica McKellar và Serhiy Storchaka trong bpo-13583.)

quy trình con

Chức năng run() mới đã được thêm vào. Nó chạy lệnh đã chỉ định và trả về một đối tượng CompletedProcess, mô tả một quá trình đã hoàn tất. Zz003zz mới nhất quán hơn và là phương pháp được khuyến nghị để gọi các quy trình con trong mã Python mà không cần duy trì khả năng tương thích với các phiên bản Python trước đó. (Được đóng góp bởi Thomas Kluyver trong bpo-23342.)

Ví dụ:

>>> subprocess.run(["ls", "-l"]) # doesn không chụp được đầu ra
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (cuộc gọi gần đây nhất):
  ...
subprocess.CalledProcessError: Lệnh 'exit 1' trả về trạng thái thoát khác 0 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 gốc gốc 1, 3 ngày 23 tháng 1 16:23 /dev/null\n')

hệ thống

Hàm set_coroutine_wrapper() mới cho phép thiết lập một hook chung sẽ được gọi bất cứ khi nào coroutine object được tạo bởi hàm async def. Có thể sử dụng get_coroutine_wrapper() tương ứng để lấy trình bao bọc hiện được đặt. Cả hai chức năng đều là provisional và chỉ nhằm mục đích gỡ lỗi. (Được đóng góp bởi Yury Selivanov trong bpo-24017.)

Có thể sử dụng hàm is_finalizing() mới để kiểm tra xem trình thông dịch Python có phải là shutting down hay không. (Được đóng góp bởi Antoine Pitrou trong bpo-22696.)

cấu hình hệ thống

Tên thư mục tập lệnh người dùng trên Windows hiện bao gồm hai thành phần đầu tiên của phiên bản Python. (Được đóng góp bởi Paul Moore trong bpo-23437.)

hồ dầu

Đối số mode của hàm open() hiện chấp nhận "x" để yêu cầu tạo độc quyền. (Được đóng góp bởi Berker Peksag trong bpo-21717.)

Các phương thức TarFile.extractall()TarFile.extract() hiện có đối số từ khóa numeric_owner. Nếu được đặt thành True, các tệp và thư mục được trích xuất sẽ thuộc sở hữu của số uidgid từ tarfile. Nếu được đặt thành False (mặc định và hoạt động trong các phiên bản trước 3.5), chúng sẽ thuộc sở hữu của người dùng và nhóm được đặt tên trong tarfile. (Được đóng góp bởi Michael Vogt và Eric Smith trong bpo-23193.)

TarFile.list() hiện chấp nhận đối số từ khóa members tùy chọn có thể được đặt thành tập hợp con của danh sách được trả về bởi TarFile.getmembers(). (Được đóng góp bởi Serhiy Storchaka trong bpo-21549.)

luồng

Cả hai phương pháp Lock.acquire()RLock.acquire() hiện đều sử dụng đồng hồ đơn điệu để quản lý thời gian chờ. (Được đóng góp bởi Victor Stinner trong bpo-22043.)

thời gian

Chức năng monotonic() hiện luôn khả dụng. (Được đóng góp bởi Victor Stinner trong bpo-22043.)

đã đến lúc

Tùy chọn dòng lệnh mới -u hoặc --unit=U có thể được sử dụng để chỉ định đơn vị thời gian cho đầu ra bộ đếm thời gian. Các tùy chọn được hỗ trợ là usec, msec hoặc sec. (Được đóng góp bởi Julian Gindi trong bpo-18983.)

Hàm timeit() có tham số globals mới để chỉ định vùng tên mà mã sẽ chạy trong đó. (Được đóng góp bởi Ben Roberts trong bpo-2527.)

tkinter

Mô-đun tkinter._fix được sử dụng để thiết lập môi trường Tcl/Tk trên Windows đã được thay thế bằng một chức năng riêng tư trong mô-đun _tkinter và không tạo ra thay đổi vĩnh viễn nào đối với các biến môi trường. (Được đóng góp bởi Zachary Ware trong bpo-20035.)

truy nguyên

Các chức năng walk_stack()walk_tb() mới để di chuyển ngang khung và traceback objects một cách thuận tiện. (Được đóng góp bởi Robert Collins trong bpo-17911.)

Các lớp nhẹ mới: TracebackException, StackSummaryFrameSummary. (Được đóng góp bởi Robert Collins trong bpo-17911.)

Cả hai hàm print_tb()print_stack() hiện đều hỗ trợ các giá trị âm cho đối số limit. (Được đóng góp bởi Dmitry Kazakov trong bpo-22619.)

các loại

Một hàm coroutine() mới để chuyển đổi các đối tượng generatorgenerator-like thành awaitables. (Được đóng góp bởi Yury Selivanov trong bpo-24017.)

Một loại mới gọi là CoroutineType, được sử dụng cho các đối tượng coroutine được tạo bởi các hàm async def. (Được đóng góp bởi Yury Selivanov trong bpo-24400.)

dữ liệu unicode

Mô-đun unicodedata hiện sử dụng dữ liệu từ Unicode 8.0.0.

nhỏ nhất

Phương thức TestLoader.loadTestsFromModule() hiện chấp nhận đối số chỉ từ khóa pattern được chuyển đến load_tests làm đối số thứ ba. Các gói được tìm thấy hiện được kiểm tra load_tests bất kể đường dẫn của chúng có khớp với pattern hay không, vì tên gói không thể khớp với mẫu mặc định. (Được đóng góp bởi Robert Collins và Barry A. Warsaw trong bpo-16662.)

Các lỗi phát hiện nhỏ nhất hiện đã được phát hiện trong thuộc tính TestLoader.errors của phiên bản TestLoader. (Được đóng góp bởi Robert Collins trong bpo-19746.)

Tùy chọn dòng lệnh mới --locals để hiển thị các biến cục bộ trong truy nguyên. (Được đóng góp bởi Robert Collins trong bpo-22936.)

unittest.mock

Lớp Mock có những cải tiến sau:

  • Hàm tạo của lớp có tham số unsafe mới, khiến các đối tượng mô phỏng tăng AttributeError trên các tên thuộc tính bắt đầu bằng "assert". (Được đóng góp bởi Kushal Das trong bpo-21238.)

  • Một phương thức Mock.assert_not_called() mới để kiểm tra xem đối tượng giả có được gọi hay không. (Được đóng góp bởi Kushal Das trong bpo-21262.)

Lớp MagicMock hiện hỗ trợ các toán tử __truediv__(), __divmod__()__matmul__(). (Được đóng góp bởi Johannes Baiter trong bpo-20968 và Håkan Lövdahl trong bpo-23581bpo-23568.)

Không còn cần thiết phải chuyển create=True một cách rõ ràng cho hàm patch() khi vá các tên dựng sẵn. (Được đóng góp bởi Kushal Das trong bpo-17660.)

urllib

Lớp request.HTTPPasswordMgrWithPriorAuth mới cho phép quản lý thông tin xác thực cơ bản HTTP để loại bỏ việc xử lý phản hồi 401 không cần thiết hoặc gửi thông tin xác thực vô điều kiện theo yêu cầu đầu tiên để liên lạc với các máy chủ trả về phản hồi 404 thay vì 401 nếu tiêu đề Authorization không được gửi. (Được đóng góp bởi Matej Cepl trong bpo-19494 và Akshit Khurana trong bpo-7159.)

Đối số quote_via mới cho hàm parse.urlencode() cung cấp cách kiểm soát việc mã hóa các phần truy vấn nếu cần. (Được đóng góp bởi Samwyse và Arnon Yaari trong bpo-13866.)

Hàm request.urlopen() chấp nhận một đối tượng ssl.SSLContext làm đối số context, đối số này sẽ được sử dụng cho kết nối HTTPS. (Được đóng góp bởi Alex Gaynor trong bpo-22366.)

parse.urljoin() đã được cập nhật để sử dụng ngữ nghĩa RFC 3986 để phân giải các URL tương đối, thay vì RFC 1808RFC 2396. (Được đóng góp bởi Demian Brecht và Senthil Kumaran trong bpo-22118.)

wsgiref

Đối số headers của hàm tạo lớp headers.Headers hiện là tùy chọn. (Được đóng góp bởi Pablo Torres Navarrete và SilentGhost trong bpo-5800.)

xmlrpc

Lớp client.ServerProxy hiện hỗ trợ giao thức context manager. (Được đóng góp bởi Claudiu Popa trong bpo-20627.)

Hàm tạo client.ServerProxy hiện chấp nhận phiên bản ssl.SSLContext tùy chọn. (Được đóng góp bởi Alex Gaynor trong bpo-22960.)

xml.sax

Trình phân tích cú pháp SAX hiện hỗ trợ luồng ký tự của đối tượng xmlreader.InputSource. (Được đóng góp bởi Serhiy Storchaka trong bpo-2175.)

parseString() hiện chấp nhận phiên bản str. (Được đóng góp bởi Serhiy Storchaka trong bpo-10590.)

tập tin zip

Đầu ra ZIP hiện có thể được ghi vào các luồng không thể tìm kiếm được. (Được đóng góp bởi Serhiy Storchaka trong bpo-23252.)

Đối số mode của phương thức ZipFile.open() hiện chấp nhận "x" để yêu cầu tạo độc quyền. (Được đóng góp bởi Serhiy Storchaka trong bpo-21717.)

Các thay đổi cấp độ mô-đun khác

Nhiều chức năng trong các mô-đun mmap, ossaudiodev, socket, sslcodecs hiện chấp nhận bytes-like objects có thể ghi. (Được đóng góp bởi Serhiy Storchaka trong bpo-23001.)

Tối ưu hóa

Chức năng os.walk() đã được tăng tốc từ 3 đến 5 lần trên hệ thống POSIX và từ 7 đến 20 lần trên Windows. Điều này được thực hiện bằng cách sử dụng hàm os.scandir() mới, hàm này hiển thị thông tin tệp từ các lệnh gọi hệ thống readdir hoặc FindFirstFile/FindNextFile cơ bản. (Được đóng góp bởi Ben Hoyt với sự trợ giúp của Victor Stinner trong bpo-23605.)

Việc xây dựng bytes(int) (được lấp đầy bằng 0 byte) nhanh hơn và sử dụng ít bộ nhớ hơn cho các đối tượng lớn. calloc() được sử dụng thay cho malloc() để cấp phát bộ nhớ cho các đối tượng này. (Được đóng góp bởi Victor Stinner trong bpo-21233.)

Một số thao tác trên ipaddress IPv4NetworkIPv6Network đã được tăng tốc rất nhiều, chẳng hạn như subnets(), supernet(), summarize_address_range(), collapse_addresses(). Tốc độ tăng có thể dao động từ 3 đến 15 lần. (Được đóng góp bởi Antoine Pitrou, Michel Albert và Markus trong bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

Việc tẩy các đối tượng ipaddress đã được tối ưu hóa để tạo ra sản lượng nhỏ hơn đáng kể. (Được đóng góp bởi Serhiy Storchaka trong bpo-23133.)

Nhiều thao tác trên io.BytesIO hiện nhanh hơn từ 50% đến 100%. (Được đóng góp bởi Serhiy Storchaka trong bpo-15381 và David Wilson trong bpo-22003.)

Chức năng marshal.dumps() hiện nhanh hơn: 65--85% với phiên bản 3 và 4, 20--25% với phiên bản 0 đến 2 trên dữ liệu thông thường và tối đa 5 lần trong trường hợp tốt nhất. (Được đóng góp bởi Serhiy Storchaka trong bpo-20416bpo-23344.)

Bộ mã hóa UTF-32 hiện nhanh hơn từ 3 đến 7 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-15027.)

Các biểu thức thông thường hiện được phân tích cú pháp nhanh hơn tới 10%. (Được đóng góp bởi Serhiy Storchaka trong bpo-19380.)

Chức năng json.dumps() đã được tối ưu hóa để chạy với ensure_ascii=False nhanh như với ensure_ascii=True. (Được đóng góp bởi Naoki Inada trong bpo-23206.)

Các hàm PyObject_IsInstance()PyObject_IsSubclass() đã được tăng tốc trong trường hợp phổ biến là đối số thứ hai có type làm siêu dữ liệu của nó. (Được đóng góp bởi Georg Brandl trong bpo-22540.)

Bộ nhớ đệm phương thức đã được cải thiện một chút, mang lại cải thiện hiệu suất lên tới 5% trong một số điểm chuẩn. (Được đóng góp bởi Antoine Pitrou trong bpo-22847.)

Các đối tượng từ mô-đun random hiện sử dụng bộ nhớ ít hơn 50% trên các bản dựng 64-bit. (Được đóng góp bởi Serhiy Storchaka trong bpo-23488.)

Lệnh gọi getter property() nhanh hơn tới 25%. (Được đóng góp bởi Joe Jevnik trong bpo-23910.)

Quá trình khởi tạo fractions.Fraction hiện nhanh hơn tới 30%. (Được đóng góp bởi Stefan Behnel trong bpo-22464.)

Các phương thức chuỗi find(), rfind(), split(), partition() và toán tử chuỗi in hiện nhanh hơn đáng kể khi tìm kiếm chuỗi con 1 ký tự. (Được đóng góp bởi Serhiy Storchaka trong bpo-23573.)

Xây dựng và thay đổi C API

Các chức năng calloc mới đã được thêm vào:

(Được đóng góp bởi Victor Stinner trong bpo-21233.)

Các chức năng trợ giúp mã hóa/giải mã mới:

(Được đóng góp bởi Victor Stinner trong bpo-18395.)

Một chức năng PyCodec_NameReplaceErrors() mới để thay thế lỗi mã hóa unicode bằng các lối thoát \N{...}. (Được đóng góp bởi Serhiy Storchaka trong bpo-19676.)

Hàm PyErr_FormatV() mới tương tự như PyErr_Format() nhưng chấp nhận đối số va_list. (Được đóng góp bởi Antoine Pitrou trong bpo-18711.)

Một ngoại lệ PyExc_RecursionError mới. (Được đóng góp bởi Georg Brandl trong bpo-19235.)

Các chức năng PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2()PyModule_ExecDef() mới được giới thiệu bởi PEP 489 -- khởi tạo mô-đun mở rộng nhiều pha. (Được đóng góp bởi Petr Viktorin trong bpo-24268.)

Các hàm PyNumber_MatrixMultiply()PyNumber_InPlaceMatrixMultiply() mới để thực hiện phép nhân ma trận. (Được đóng góp bởi Benjamin Peterson trong bpo-21176. Xem thêm PEP 465 để biết chi tiết.)

Khe cắm PyTypeObject.tp_finalize hiện là một phần của ABI ổn định.

Các bản dựng Windows hiện yêu cầu Microsoft Visual C++ 14.0, có sẵn như một phần của Visual Studio 2015.

Các mô-đun mở rộng hiện bao gồm thẻ thông tin nền tảng trong tên tệp của chúng trên một số nền tảng (thẻ này là tùy chọn và CPython sẽ nhập các tiện ích mở rộng mà không có thẻ đó, mặc dù nếu thẻ xuất hiện và không khớp, tiện ích mở rộng sẽ không được tải):

  • Trên Linux, tên tệp mô-đun mở rộng kết thúc bằng .cpython-<major><minor>m-<architecture>-<os>.pyd:

    • <major> là số chính của phiên bản Python; đối với Python 3.5 thì đây là 3.

    • <minor> là số thứ của phiên bản Python; đối với Python 3.5 thì đây là 5.

    • <architecture> là kiến trúc phần cứng mà mô-đun mở rộng được xây dựng để chạy trên đó. Thông thường nhất là i386 cho nền tảng Intel 32 bit hoặc x86_64 cho nền tảng Intel (và AMD) 64 bit.

    • <os> luôn là linux-gnu, ngoại trừ các tiện ích mở rộng được xây dựng để giao tiếp với ABI 32-bit trên nền tảng 64-bit, trong trường hợp đó là linux-gnu32 (và <architecture> sẽ là x86_64).

  • Trên Windows, tên tệp mô-đun mở rộng kết thúc bằng <debug>.cp<major><minor>-<platform>.pyd:

    • <major> là số chính của phiên bản Python; đối với Python 3.5 thì đây là 3.

    • <minor> là số thứ của phiên bản Python; đối với Python 3.5 thì đây là 5.

    • <platform> là nền tảng mà mô-đun mở rộng được xây dựng, win32 cho Win32, win_amd64 cho Win64, win_ia64 cho Windows Itanium 64 và win_arm cho Windows trên ARM.

    • Nếu được xây dựng ở chế độ gỡ lỗi, <debug> sẽ là _d, nếu không nó sẽ trống.

  • Trên nền tảng OS X, tên tệp mô-đun mở rộng hiện kết thúc bằng -darwin.so.

  • Trên tất cả các nền tảng khác, tên tệp mô-đun mở rộng giống như tên của Python 3.4.

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

Từ khóa mới

asyncawait không được khuyến khích sử dụng làm tên biến, lớp, hàm hoặc mô-đun. Được giới thiệu bởi PEP 492 trong Python 3.5, chúng sẽ trở thành từ khóa thích hợp trong Python 3.7.

Hành vi Python không được dùng nữa

Việc tăng ngoại lệ StopIteration bên trong trình tạo giờ đây sẽ tạo ra PendingDeprecationWarning im lặng, điều này sẽ trở thành cảnh báo không dùng nữa không im lặng trong Python 3.6 và sẽ kích hoạt RuntimeError trong Python 3.7. Xem PEP 479: Change StopIteration handling inside generators để biết chi tiết.

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

Windows XP không còn được Microsoft hỗ trợ, do đó, theo PEP 11, CPython 3.5 không còn được hỗ trợ chính thức trên HĐH này.

Các mô-đun, hàm và phương thức Python không được dùng nữa

Mô-đun formatter hiện đã ngừng sử dụng hoàn toàn và vẫn dự kiến bị xóa trong Python 3.6.

Chức năng asyncio.async() không còn được dùng nữa để thay thế cho ensure_future().

Mô-đun smtpd trước đây luôn giải mã phần DATA của email bằng cách sử dụng codec utf-8. Điều này hiện có thể được kiểm soát bằng từ khóa decode_data mới tới SMTPServer. Giá trị mặc định là True, nhưng giá trị mặc định này không được dùng nữa. Chỉ định từ khóa decode_data với giá trị thích hợp để tránh cảnh báo không dùng nữa.

Việc gán trực tiếp các giá trị cho key, valuecoded_value của các đối tượng http.cookies.Morsel không được dùng nữa. Thay vào đó hãy sử dụng phương pháp set(). Ngoài ra, tham số LegalChars không có giấy tờ của set() không được dùng nữa và hiện bị bỏ qua.

Việc truyền chuỗi định dạng làm đối số từ khóa format_string cho phương thức format() của lớp string.Formatter đã không còn được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-23671.)

Các hàm platform.dist()platform.linux_distribution() hiện không được dùng nữa. Các bản phân phối Linux sử dụng quá nhiều cách khác nhau để mô tả bản thân, vì vậy chức năng được giao cho một gói. (Được đóng góp bởi Vajrasky Kok và Berker Peksag trong bpo-1322.)

Các phương thức from_functionfrom_builtin không có giấy tờ trước đây của inspect.Signature không được dùng nữa. Thay vào đó hãy sử dụng phương pháp Signature.from_callable() mới. (Được đóng góp bởi Yury Selivanov trong bpo-24248.)

Hàm inspect.getargspec() không được dùng nữa và được lên lịch xóa trong Python 3.6. (Xem bpo-20438 để biết chi tiết.)

Các chức năng inspect getfullargspec(), getcallargs()formatargspec() không được dùng nữa mà thay vào đó là inspect.signature() API. (Được đóng góp bởi Yury Selivanov trong bpo-20438.)

Các hàm getargvalues()formatargvalues() vô tình bị đánh dấu là không dùng nữa khi phát hành Python 3.5.0.

Việc sử dụng cờ re.LOCALE với mẫu str hoặc re.ASCII hiện không được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-22407.)

Việc sử dụng các chuỗi đặc biệt không được nhận dạng bao gồm '\' và một chữ cái ASCII trong các mẫu biểu thức chính quy và các mẫu thay thế hiện gây ra cảnh báo không dùng nữa và sẽ bị cấm trong Python 3.6. (Được đóng góp bởi Serhiy Storchaka trong bpo-23622.)

Đối số mặc định use_load_tests không có giấy tờ và không chính thức của phương thức unittest.TestLoader.loadTestsFromModule() hiện không được dùng nữa và bị bỏ qua. (Được đóng góp bởi Robert Collins và Barry A. Warsaw trong bpo-16662.)

Đã xóa

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

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

  • Thuộc tính __version__ đã bị loại bỏ khỏi gói email. Mã email đã không được gửi riêng khỏi stdlib trong một thời gian dài và chuỗi __version__ không được cập nhật trong một số bản phát hành gần đây nhất.

  • Lớp Netrc nội bộ trong mô-đun ftplib không được dùng nữa trong phiên bản 3.4 và hiện đã bị xóa. (Được đóng góp bởi Matt Chaput trong bpo-6623.)

  • Khái niệm về tệp .pyo đã bị xóa.

  • Lớp JoinableQueue trong mô-đun asyncio tạm thời không được dùng nữa trong phiên bản 3.4.4 và hiện đã bị xóa. (Được đóng góp bởi A. Jesse Jiryu Davis trong bpo-23464.)

Chuyển sang Python 3.5

Phần này liệt kê các thay đổi được mô tả trước đây và các bản sửa lỗi khác có thể yêu cầu thay đổi mã của bạn.

Những thay đổi trong hành vi của Python

  • Do sơ suất, các phiên bản Python trước đó đã chấp nhận sai cú pháp sau:

    f(1 cho x trong [1], *args)
    f(1 for x in [1], **kwargs)
    

    Python 3.5 giờ đây sẽ tăng SyntaxError một cách chính xác, vì các biểu thức của trình tạo phải được đặt trong dấu ngoặc đơn nếu không phải là đối số duy nhất cho hàm.

Những thay đổi trong Python API

  • PEP 475: Cuộc gọi hệ thống hiện được thử lại khi bị gián đoạn bởi tín hiệu thay vì tăng InterruptedError nếu trình xử lý tín hiệu Python không đưa ra ngoại lệ.

  • Trước Python 3.5, một đối tượng datetime.time được coi là sai nếu nó biểu thị nửa đêm trong UTC. Hành vi này được coi là khó hiểu và dễ xảy ra lỗi và đã bị xóa trong Python 3.5. Xem bpo-13936 để biết chi tiết đầy đủ.

  • Phương thức ssl.SSLSocket.send() hiện tăng ssl.SSLWantReadError hoặc ssl.SSLWantWriteError trên ổ cắm không chặn nếu thao tác sẽ chặn. Trước đây, nó sẽ trả về 0. (Được đóng góp bởi Nikolaus Rath trong bpo-20951.)

  • Thuộc tính __name__ của trình tạo hiện được đặt từ tên hàm, thay vì được đặt từ tên mã. Sử dụng gen.gi_code.co_name để lấy tên mã. Trình tạo cũng có thuộc tính __qualname__ mới, tên đủ điều kiện, hiện được sử dụng để đại diện cho trình tạo (repr(gen)). (Được đóng góp bởi Victor Stinner trong bpo-21205.)

  • Chế độ và đối số "nghiêm ngặt" không được dùng nữa của HTMLParser, HTMLParser.error() và ngoại lệ HTMLParserError đã bị xóa. (Được đóng góp bởi Ezio Melotti trong bpo-15114.) Đối số convert_charrefs của HTMLParser hiện tại là True theo mặc định. (Được đóng góp bởi Berker Peksag trong bpo-21047.)

  • Mặc dù nó không phải là một phần chính thức của API, nhưng cần lưu ý vì mục đích chuyển (ví dụ: sửa lỗi kiểm tra) rằng các thông báo lỗi trước đây có dạng "'sometype' không hỗ trợ giao thức bộ đệm" giờ đây có dạng "bắt buộc phải có bytes-like object chứ không phải 'sometype'". (Được đóng góp bởi Ezio Melotti trong bpo-16518.)

  • Nếu thư mục hiện tại được đặt thành thư mục không còn tồn tại thì FileNotFoundError sẽ không được nâng lên nữa và thay vào đó find_spec() sẽ trả về None without bộ nhớ đệm None trong sys.path_importer_cache, khác với trường hợp điển hình (bpo-22834).

  • Mã trạng thái HTTP và các thông báo từ http.clienthttp.server đã được tái cấu trúc thành một enum HTTPStatus chung. Các giá trị trong http.clienthttp.server vẫn có sẵn để tương thích ngược. (Được đóng góp bởi Demian Brecht trong bpo-21793.)

  • Khi trình tải nhập xác định exec_module(), dự kiến nó cũng sẽ xác định create_module() (tăng DeprecationWarning ngay bây giờ, sẽ là lỗi trong Python 3.6). Nếu trình tải kế thừa từ importlib.abc.Loader thì không cần phải làm gì, nếu không thì chỉ cần xác định create_module() để trả về None. (Được đóng góp bởi Brett Cannon trong bpo-23014.)

  • Hàm re.split() luôn bỏ qua các kết quả khớp mẫu trống, vì vậy mẫu "x*" hoạt động giống như "x+" và mẫu "\b" không bao giờ hoạt động. Bây giờ re.split() đưa ra cảnh báo nếu mẫu có thể khớp với một chuỗi trống. Để tương thích, hãy sử dụng các mẫu không bao giờ khớp với chuỗi trống (ví dụ: "x+" thay vì "x*"). Các mẫu chỉ có thể khớp với một chuỗi trống (chẳng hạn như "\b") hiện sẽ gây ra lỗi. (Được đóng góp bởi Serhiy Storchaka trong bpo-22818.)

  • Giao diện giống như lệnh http.cookies.Morsel đã được tự nhất quán: so sánh từng phần hiện tính đến keyvalue, copy() hiện dẫn đến một phiên bản Morsel thay vì dictupdate() giờ đây sẽ đưa ra một ngoại lệ nếu bất kỳ khóa nào trong từ điển cập nhật không hợp lệ. Ngoài ra, tham số LegalChars không có giấy tờ của set() không được dùng nữa và hiện bị bỏ qua. (Được đóng góp bởi Demian Brecht trong bpo-2211.)

  • PEP 488 đã xóa các tệp .pyo khỏi Python và giới thiệu thẻ opt- tùy chọn trong tên tệp .pyc. Zz001zz đã đạt được tham số optimization để giúp kiểm soát thẻ opt-. Vì lý do này, tham số debug_override của hàm hiện không được dùng nữa. Các tệp .pyo cũng không còn được hỗ trợ dưới dạng đối số tệp cho trình thông dịch Python và do đó không phục vụ mục đích nào khi được phân phối riêng (tức là phân phối mã không nguồn). Do số ma thuật cho mã byte đã thay đổi trong Python 3.5, tất cả các tệp .pyo cũ từ các phiên bản trước của Python đều không hợp lệ bất kể PEP này.

  • Mô-đun socket hiện xuất hằng số CAN_RAW_FD_FRAMES trên linux 3.6 trở lên.

  • Hàm ssl.cert_time_to_seconds() hiện diễn giải thời gian đầu vào là UTC chứ không phải giờ địa phương, theo RFC 5280. Ngoài ra, giá trị trả về luôn là int. (Được đóng góp bởi Akira Li trong bpo-19940.)

  • Công cụ pygettext.py hiện sử dụng định dạng +NNNN tiêu chuẩn cho các múi giờ trong tiêu đề POT-Creation-Date.

  • Mô-đun smtplib hiện sử dụng sys.stderr thay vì biến stderr cấp mô-đun trước đó cho đầu ra gỡ lỗi. Nếu chương trình (kiểm tra) của bạn phụ thuộc vào việc vá biến cấp mô-đun để ghi lại kết quả gỡ lỗi, thì thay vào đó, bạn sẽ cần cập nhật nó để ghi lại sys.stderr.

  • Các phương thức str.startswith()str.endswith() không còn trả về True khi tìm thấy chuỗi trống và các chỉ mục hoàn toàn nằm ngoài phạm vi. (Được đóng góp bởi Serhiy Storchaka trong bpo-24284.)

  • Hàm inspect.getdoc() hiện trả về các chuỗi tài liệu được kế thừa từ các lớp cơ sở. Chuỗi tài liệu không còn cần phải được sao chép nếu tài liệu được kế thừa phù hợp. Để loại bỏ một chuỗi được kế thừa, một chuỗi trống phải được chỉ định (hoặc có thể điền vào tài liệu). Thay đổi này ảnh hưởng đến đầu ra của mô-đun pydoc và chức năng help(). (Được đóng góp bởi Serhiy Storchaka trong bpo-15582.)

  • Các cuộc gọi functools.partial() lồng nhau hiện đã được làm phẳng. Nếu bạn đang dựa vào hành vi trước đó thì bây giờ bạn có thể thêm thuộc tính vào đối tượng functools.partial() hoặc bạn có thể tạo một lớp con của functools.partial(). (Được đóng góp bởi Alexander Belopolsky trong bpo-7830.)

Những thay đổi trong C API

  • Thành viên format không có giấy tờ của cấu trúc PyMemoryViewObject (không công khai) đã bị xóa. 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 phải được xây dựng lại.

  • Cấu trúc PyMemAllocator được đổi tên thành PyMemAllocatorEx và trường calloc mới đã được thêm vào.

  • Đã xóa macro PyObject_REPR() không có tài liệu làm rò rỉ tài liệu tham khảo. Sử dụng ký tự định dạng %R trong các hàm giống PyUnicode_FromFormat() để định dạng repr() của đối tượng. (Được đóng góp bởi Serhiy Storchaka trong bpo-22453.)

  • Do việc thiếu thuộc tính __module__ sẽ làm gián đoạn quá trình tẩy rửa và xem xét nội tâm, nên cảnh báo không dùng nữa hiện đã được đưa ra đối với các loại dựng sẵn không có thuộc tính __module__. Đây sẽ là một AttributeError trong tương lai. (Được đóng góp bởi Serhiy Storchaka trong bpo-20204.)

  • Là một phần của quá trình triển khai PEP 492, khe tp_reserved của PyTypeObject đã được thay thế bằng khe tp_as_async. Tham khảo Đối tượng Coroutine để biết các loại, cấu trúc và chức năng mới.

Những thay đổi đáng chú ý trong Python 3.5.4

Mục tiêu xây dựng make regen-all mới

Để đơn giản hóa quá trình biên dịch chéo và để đảm bảo rằng CPython có thể được biên dịch một cách đáng tin cậy mà không yêu cầu phải có sẵn phiên bản Python hiện có, hệ thống xây dựng dựa trên autotools không còn cố gắng biên dịch lại các tệp được tạo dựa trên thời gian sửa đổi tệp một cách ngầm định nữa.

Thay vào đó, lệnh make regen-all mới đã được thêm vào để buộc tái tạo các tệp này khi muốn (ví dụ: sau khi phiên bản ban đầu của Python đã được xây dựng dựa trên các phiên bản được tạo trước).

Các mục tiêu tái tạo có chọn lọc hơn cũng được xác định - xem Makefile.pre.in để biết chi tiết.

(Được đóng góp bởi Victor Stinner trong bpo-23404.)

Added in version 3.5.4.

Loại bỏ mục tiêu xây dựng make touch

Mục tiêu xây dựng make touch trước đây được sử dụng để yêu cầu tái tạo ngầm các tệp được tạo bằng cách cập nhật thời gian sửa đổi của chúng đã bị xóa.

Nó đã được thay thế bằng mục tiêu make regen-all mới.

(Được đóng góp bởi Victor Stinner trong bpo-23404.)

Thay đổi trong phiên bản 3.5.4.