Có gì mới trong Python 3.6

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.6, so với 3.5. Python 3.6 được phát hành vào ngày 23 tháng 12 năm 2016. Xem changelog để biết danh sách đầy đủ các thay đổi.

Xem thêm

PEP 494 - Lịch phát hành Python 3.6

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 498, chuỗi ký tự được định dạng.

  • PEP 515, dấu gạch dưới trong chữ số.

  • PEP 526, cú pháp cho các chú thích biến.

  • PEP 525, máy phát điện không đồng bộ.

  • PEP 530: hiểu không đồng bộ.

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

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

  • Loại dict đã được triển khai lại để sử dụng more compact representation dựa trên a proposal by Raymond Hettinger và tương tự như PyPy dict implementation. Điều này dẫn đến việc các từ điển sử dụng bộ nhớ ít hơn từ 20% đến 25% khi so sánh với Python 3.5.

  • Việc tùy chỉnh tạo lớp đã được đơn giản hóa với new protocol.

  • Thứ tự định nghĩa thuộc tính lớp là now preserved.

  • Thứ tự các phần tử trong **kwargs bây giờ là corresponds to the order trong đó các đối số từ khóa được truyền cho hàm.

  • DTrace và SystemTap probing support đã được thêm vào.

  • Biến môi trường PYTHONMALLOC mới hiện có thể được sử dụng để gỡ lỗi các lỗi truy cập và phân bổ bộ nhớ trình thông dịch.

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

  • Mô-đun asyncio đã nhận được các tính năng mới, cải tiến đáng kể về hiệu suất và khả năng sử dụng cũng như sửa một số lỗi đáng kể. Bắt đầu với Python 3.6, mô-đun asyncio không còn là tạm thời nữa và API của nó được coi là ổn định.

  • Một file system path protocol mới đã được triển khai để hỗ trợ path-like objects. Tất cả các chức năng thư viện tiêu chuẩn hoạt động trên đường dẫn đã được cập nhật để hoạt động với giao thức mới.

  • Mô-đun datetime đã được hỗ trợ cho Local Time Disambiguation.

  • Mô-đun typing đã nhận được một số improvements.

  • Mô-đun tracemalloc đã được làm lại đáng kể và hiện được sử dụng để cung cấp đầu ra tốt hơn cho ResourceWarning cũng như cung cấp chẩn đoán tốt hơn về các lỗi phân bổ bộ nhớ. Xem PYTHONMALLOC section để biết thêm thông tin.

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

  • Mô-đun secrets mới đã được thêm vào để đơn giản hóa việc tạo các số giả ngẫu nhiên mạnh về mặt mật mã phù hợp để quản lý các bí mật như xác thực tài khoản, mã thông báo, v.v.

  • Trên Linux, os.urandom() hiện chặn cho đến khi nhóm entropy urandom của hệ thống được khởi tạo để tăng tính bảo mật. Xem PEP 524 để biết lý do.

  • Các mô-đun hashlibssl hiện hỗ trợ OpenSSL 1.1.0.

  • Các cài đặt mặc định và bộ tính năng của mô-đun ssl đã được cải thiện.

  • Mô-đun hashlib đã nhận được hỗ trợ cho các thuật toán băm BLAKE2, SHA-3 và SHAKE cũng như hàm dẫn xuất khóa scrypt().

Cải tiến Windows:

  • PEP 528PEP 529, mã hóa bảng điều khiển và hệ thống tập tin Windows đã đổi thành UTF-8.

  • Trình khởi chạy py.exe, khi được sử dụng tương tác, không còn thích Python 2 hơn Python 3 khi người dùng không chỉ định phiên bản (thông qua đối số dòng lệnh hoặc tệp cấu hình). Việc xử lý các dòng shebang vẫn không thay đổi - "python" đề cập đến Python 2 trong trường hợp đó.

  • python.exepythonw.exe đã được đánh dấu là nhận biết đường dẫn dài, điều đó có nghĩa là giới hạn đường dẫn 260 ký tự có thể không còn được áp dụng. Xem removing the MAX_PATH limitation để biết chi tiết.

  • Một tệp ._pth có thể được thêm vào để buộc chế độ cách ly và chỉ định đầy đủ tất cả các đường dẫn tìm kiếm để tránh việc tra cứu sổ đăng ký và môi trường. Xem the documentation để biết thêm thông tin.

  • Tệp python36.zip hiện hoạt động như một điểm mốc để suy ra PYTHONHOME. Xem the documentation để biết thêm thông tin.

Tính năng mới

PEP 498: Chuỗi ký tự được định dạng

PEP 498 giới thiệu một loại chuỗi ký tự mới: f-strings hoặc formatted string literals.

Các chuỗi ký tự được định dạng có tiền tố là 'f' và tương tự như các chuỗi định dạng được str.format() chấp nhận. Chúng chứa các trường thay thế được bao quanh bởi các dấu ngoặc nhọn. Các trường thay thế là các biểu thức, được đánh giá trong thời gian chạy, sau đó được định dạng bằng giao thức format():

>>> tên = "Fred"
>>> f"Anh ấy nói tên anh ấy là {name}."
'Anh ấy nói tên anh ấy là Fred.'
>>> chiều rộng = 10
>>> độ chính xác = 4
>>> giá trị = thập phân.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" các trường # nested
'kết quả: 12.35'

Xem thêm

PEP 498 -- Nội suy chuỗi ký tự.

PEP được viết và triển khai bởi Eric V. Smith.

Feature documentation.

PEP 526: Cú pháp chú thích biến

PEP 484 đã giới thiệu tiêu chuẩn cho chú thích kiểu của các tham số hàm, hay còn gọi là gợi ý kiểu. Zz001zz này thêm cú pháp vào Python để chú thích các loại biến bao gồm biến lớp và biến thể hiện

số nguyên tố: Danh sách[int] = []

đội trưởng: str # Note: không có giá trị ban đầu!

lớp phi thuyền:
    số liệu thống : Dict[str, int] = {}

Cũng giống như đối với các chú thích hàm, trình thông dịch Python không gắn bất kỳ ý nghĩa cụ thể nào vào các chú thích biến và chỉ lưu trữ chúng trong thuộc tính __annotations__ của một lớp hoặc mô-đun.

Ngược lại với các khai báo biến trong các ngôn ngữ được gõ tĩnh, mục tiêu của cú pháp chú thích là cung cấp một cách dễ dàng để chỉ định siêu dữ liệu loại có cấu trúc cho các công cụ và thư viện của bên thứ ba thông qua cây cú pháp trừu tượng và thuộc tính __annotations__.

Xem thêm

PEP 526 -- Cú pháp cho các chú thích biến.

PEP được viết bởi Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach và Guido van Rossum. Được thực hiện bởi Ivan Levkivskyi.

Các công cụ đang sử dụng hoặc sẽ sử dụng cú pháp mới: mypy, pytype, PyCharm, v.v.

PEP 515: Dấu gạch dưới trong chữ số

PEP 515 bổ sung khả năng sử dụng dấu gạch dưới trong chữ số để cải thiện khả năng đọc. Ví dụ:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

Cho phép sử dụng dấu gạch dưới đơn giữa các chữ số và sau bất kỳ mã xác định cơ sở nào. Không được phép sử dụng dấu gạch đầu dòng, dấu gạch dưới hoặc nhiều dấu gạch dưới liên tiếp.

Ngôn ngữ string formatting hiện cũng hỗ trợ tùy chọn '_' để báo hiệu việc sử dụng dấu gạch dưới cho dấu phân cách hàng nghìn cho các kiểu trình bày dấu phẩy động và cho kiểu trình bày số nguyên 'd'. Đối với các kiểu trình bày số nguyên 'b', 'o', 'x''X', dấu gạch dưới sẽ được chèn sau mỗi 4 chữ số:

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

Xem thêm

PEP 515 -- Dấu gạch dưới trong chữ số

PEP được viết bởi Georg Brandl và Serhiy Storchaka.

PEP 525: Máy phát điện không đồng bộ

PEP 492 đã giới thiệu tính năng hỗ trợ cho coroutine gốc và cú pháp async/await cho Python 3.5. Một hạn chế đáng chú ý của việc triển khai Python 3.5 là không thể sử dụng awaityield trong cùng một nội dung hàm. Trong Python 3.6, hạn chế này đã được dỡ bỏ, giúp có thể xác định asynchronous generators:

 đánh dấu không đồng bộ (độ trễ, đến):
    """Cho ra các số từ 0 đến *to* mỗi giây *delay*."""
    cho tôi trong phạm vi (đến):
        nhường tôi
        đang chờ asyncio.sleep(delay)

Cú pháp mới cho phép mã nhanh hơn và ngắn gọn hơn.

Xem thêm

PEP 525 -- Trình tạo không đồng bộ

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

PEP 530: Hiểu không đồng bộ

PEP 530 bổ sung hỗ trợ cho việc sử dụng async for trong danh sách, tập hợp, hiểu chính tả và biểu thức trình tạo

result = [i async for i in aiter() if i % 2]

Ngoài ra, các biểu thức await được hỗ trợ ở mọi mức độ hiểu:

result = [await fun() cho vui trong funcs if chờ điều kiện()]

Xem thêm

PEP 530 -- Hiểu không đồng bộ

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

PEP 487: Tùy chỉnh tạo lớp đơn giản hơn

Bây giờ có thể tùy chỉnh việc tạo lớp con mà không cần sử dụng siêu dữ liệu. Phương thức lớp __init_subclass__ mới sẽ được gọi trên lớp cơ sở bất cứ khi nào một lớp con mới được tạo

lớp PluginBase:
    lớp con = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

lớp Plugin1(PluginBase):
    vượt qua

lớp Plugin2 (PluginBase):
    vượt qua

Để cho phép các lệnh gọi super() không đối số hoạt động chính xác từ quá trình triển khai __init_subclass__(), siêu dữ liệu tùy chỉnh phải đảm bảo rằng mục nhập không gian tên __classcell__ mới được truyền tới type.__new__ (như được mô tả trong Tạo đối tượng lớp).

Xem thêm

PEP 487 -- Tùy chỉnh tạo lớp đơn giản hơn

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

Feature documentation

PEP 487: Cải tiến giao thức mô tả

PEP 487 mở rộng giao thức mô tả để bao gồm phương thức __set_name__() tùy chọn mới. Bất cứ khi nào một lớp mới được định nghĩa, phương thức mới sẽ được gọi trên tất cả các bộ mô tả có trong định nghĩa, cung cấp cho chúng một tham chiếu đến lớp được định nghĩa và tên được đặt cho bộ mô tả trong không gian tên của lớp. Nói cách khác, các phiên bản của bộ mô tả bây giờ có thể biết tên thuộc tính của bộ mô tả trong lớp chủ sở hữu:

lớp IntField:
    def __get__(bản thân,  dụ, chủ sở hữu):
        trả về instance.__dict__[self.name]

    def __set__(bản thân, thể hiện, giá trị):
        nếu không phải  isinstance(value, int):
            raise ValueError(f'kỳ vọng số nguyên trong {self.name}')
        instance.__dict__[self.name] = giá trị

    # this là trình khởi tạo mới:
    def __set_name__(bản thân, chủ sở hữu, tên):
        self.name = tên

 hình lớp:
    int_field = IntField()

Xem thêm

PEP 487 -- Tùy chỉnh tạo lớp đơn giản hơn

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

Feature documentation

PEP 519: Thêm giao thức đường dẫn hệ thống tệp

Đường dẫn hệ thống tệp trước đây được biểu diễn dưới dạng đối tượng str hoặc bytes. Điều này khiến những người viết mã hoạt động trên đường dẫn hệ thống tệp cho rằng các đối tượng đó chỉ là một trong hai loại đó (int đại diện cho bộ mô tả tệp không được tính vì đó không phải là đường dẫn tệp). Thật không may, giả định đó ngăn cản việc biểu diễn đối tượng thay thế của các đường dẫn hệ thống tệp như pathlib hoạt động với mã có sẵn, bao gồm cả thư viện chuẩn của Python.

Để khắc phục tình trạng này, một giao diện mới được đại diện bởi os.PathLike đã được xác định. Bằng cách triển khai phương thức __fspath__(), một đối tượng báo hiệu rằng nó đại diện cho một đường dẫn. Sau đó, một đối tượng có thể cung cấp biểu diễn cấp thấp của đường dẫn hệ thống tệp dưới dạng đối tượng str hoặc bytes. Điều này có nghĩa là một đối tượng được coi là path-like nếu nó triển khai os.PathLike hoặc là đối tượng str hoặc bytes đại diện cho đường dẫn hệ thống tệp. Mã có thể sử dụng os.fspath(), os.fsdecode() hoặc os.fsencode() để nhận được biểu diễn str và/hoặc bytes của một đối tượng giống đường dẫn một cách rõ ràng.

Hàm open() tích hợp đã được cập nhật để chấp nhận các đối tượng os.PathLike, cũng như có tất cả các hàm liên quan trong mô-đun osos.path cũng như hầu hết các hàm và lớp khác trong thư viện chuẩn. Lớp os.DirEntry và các lớp liên quan trong pathlib cũng đã được cập nhật để triển khai os.PathLike.

Hy vọng rằng việc cập nhật các chức năng cơ bản để vận hành trên đường dẫn hệ thống tệp sẽ khiến mã của bên thứ ba ngầm hỗ trợ tất cả path-like objects mà không có bất kỳ thay đổi mã nào hoặc ít nhất là những thay đổi rất tối thiểu (ví dụ: gọi os.fspath() ở đầu mã trước khi thao tác trên một đối tượng giống đường dẫn).

Dưới đây là một số ví dụ về cách giao diện mới cho phép sử dụng pathlib.Path dễ dàng và minh bạch hơn với mã có sẵn:

>>> nhập pathlib
>>> với open(pathlib.Path("README"))  f:
... nội dung = f.read()
...
>>> nhập os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> nhập hệ điều hành
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(Được thực hiện bởi Brett Cannon, Ethan Furman, Dusty Phillips và Jelle Zijlstra.)

Xem thêm

PEP 519 -- Thêm giao thức đường dẫn hệ thống tệp

PEP được viết bởi Brett Cannon và Koos Zevenhoven.

PEP 495: Định hướng giờ địa phương

Ở hầu hết các địa điểm trên thế giới, đã và sẽ có lúc đồng hồ địa phương được lùi lại. Vào những thời điểm đó, các khoảng thời gian được đưa ra trong đó đồng hồ địa phương hiển thị cùng một thời điểm hai lần trong cùng một ngày. Trong những trường hợp này, thông tin hiển thị trên đồng hồ cục bộ (hoặc được lưu trữ trong phiên bản ngày giờ của Python) không đủ để xác định một thời điểm cụ thể.

PEP 495 thêm thuộc tính fold mới vào các phiên bản của lớp datetime.datetimedatetime.time để phân biệt giữa hai thời điểm mà thời gian địa phương giống nhau:

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> cho i trong phạm vi (4):
... u = u0 + i*HOUR
... t = u.astimezone(Miền Đông)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

Các giá trị của thuộc tính fold có giá trị 0 cho tất cả các trường hợp ngoại trừ các trường hợp đại diện cho thời điểm thứ hai (theo trình tự thời gian) trong trường hợp không rõ ràng.

Xem thêm

PEP 495 -- Định hướng giờ địa phương

PEP được viết bởi Alexander Belopolsky và Tim Peters, được thực hiện bởi Alexander Belopolsky.

PEP 529: Thay đổi mã hóa hệ thống tệp Windows thành UTF-8

Việc biểu diễn đường dẫn hệ thống tệp được thực hiện tốt nhất bằng str (Unicode) thay vì byte. Tuy nhiên, có một số trường hợp sử dụng byte là đủ và chính xác.

Trước Python 3.6, việc mất dữ liệu có thể xảy ra khi sử dụng đường dẫn byte trên Windows. Với thay đổi này, việc sử dụng byte để biểu thị đường dẫn hiện đã được hỗ trợ trên Windows, miễn là các byte đó được mã hóa bằng mã hóa được trả về bởi sys.getfilesystemencoding(), hiện được mặc định là 'utf-8'.

Các ứng dụng không sử dụng str để biểu thị đường dẫn nên sử dụng os.fsencode()os.fsdecode() để đảm bảo byte của chúng được mã hóa chính xác. Để hoàn nguyên về hành vi trước đó, hãy đặt PYTHONLEGACYWINDOWSFSENCODING hoặc gọi sys._enablelegacywindowsfsencoding().

Xem PEP 529 để biết thêm thông tin và thảo luận về các sửa đổi mã có thể được yêu cầu.

PEP 528: Thay đổi mã hóa bảng điều khiển Windows thành UTF-8

Bảng điều khiển mặc định trên Windows giờ đây sẽ chấp nhận tất cả các ký tự Unicode và cung cấp các đối tượng str đọc chính xác cho mã Python. sys.stdin, sys.stdoutsys.stderr hiện được mã hóa mặc định thành utf-8.

Thay đổi này chỉ áp dụng khi sử dụng bảng điều khiển tương tác chứ không áp dụng khi chuyển hướng tệp hoặc đường ống. Để hoàn nguyên về hành vi trước đó khi sử dụng bảng điều khiển tương tác, hãy đặt PYTHONLEGACYWINDOWSSTDIO.

Xem thêm

PEP 528 -- Thay đổi mã hóa bảng điều khiển Windows thành UTF-8

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

PEP 520: Giữ nguyên thứ tự định nghĩa thuộc tính lớp

Các thuộc tính trong nội dung định nghĩa lớp có thứ tự tự nhiên: cùng thứ tự với các tên xuất hiện trong nguồn. Thứ tự này hiện được giữ nguyên trong thuộc tính __dict__ của lớp mới.

Ngoài ra, không gian tên execution lớp mặc định hiệu quả (được trả về từ type.__prepare__()) hiện là ánh xạ bảo toàn thứ tự chèn.

Xem thêm

PEP 520 -- Giữ nguyên thứ tự định nghĩa thuộc tính lớp

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

PEP 468: Giữ nguyên thứ tự đối số từ khóa

**kwargs trong chữ ký hàm hiện được đảm bảo là ánh xạ bảo toàn thứ tự chèn.

Xem thêm

PEP 468 -- Giữ nguyên thứ tự đối số từ khóa

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

Triển khai dict mới

Loại dict hiện sử dụng cách biểu diễn "nhỏ gọn" dựa trên a proposal by Raymond Hettingerfirst implemented by PyPy. Mức sử dụng bộ nhớ của dict() mới nhỏ hơn từ 20% đến 25% so với Python 3.5.

Khía cạnh duy trì trật tự của triển khai mới này được coi là một chi tiết triển khai và không nên dựa vào (điều này có thể thay đổi trong tương lai, nhưng người ta mong muốn triển khai dict mới này bằng ngôn ngữ cho một số bản phát hành trước khi thay đổi thông số ngôn ngữ để bắt buộc ngữ nghĩa duy trì trật tự cho tất cả các triển khai Python hiện tại và tương lai; điều này cũng giúp duy trì khả năng tương thích ngược với các phiên bản cũ hơn của ngôn ngữ nơi thứ tự lặp ngẫu nhiên vẫn có hiệu lực, ví dụ: Python 3.5).

(Được đóng góp bởi INADA Naoki trong bpo-27350. Ý tưởng originally suggested by Raymond Hettinger.)

PEP 523: Thêm đánh giá khung API vào CPython

Mặc dù Python cung cấp hỗ trợ rộng rãi để tùy chỉnh cách thực thi mã, nhưng có một điểm nó chưa làm được như vậy là đánh giá các đối tượng khung. Nếu bạn muốn một số cách để chặn việc đánh giá khung trong Python thì thực sự không có cách nào mà không thao tác trực tiếp các con trỏ hàm cho các hàm đã xác định.

PEP 523 thay đổi điều này bằng cách cung cấp API để thực hiện đánh giá khung có thể cắm được ở cấp độ C. Điều này sẽ cho phép các công cụ như trình gỡ lỗi và JIT chặn việc đánh giá khung trước khi bắt đầu thực thi mã Python. Điều này cho phép sử dụng các triển khai đánh giá thay thế cho mã Python, đánh giá khung theo dõi, v.v.

Zz000zz này không phải là một phần của C API giới hạn và được đánh dấu là riêng tư để báo hiệu rằng việc sử dụng API này dự kiến sẽ bị hạn chế và chỉ áp dụng cho các trường hợp sử dụng cấp thấp, rất chọn lọc. Ngữ nghĩa của API sẽ thay đổi bằng Python nếu cần.

Xem thêm

PEP 523 -- Thêm đánh giá khung API vào CPython

PEP được viết bởi Brett Cannon và Dino Viehland.

biến môi trường PYTHONMALLOC

Biến môi trường PYTHONMALLOC mới cho phép thiết lập bộ cấp phát bộ nhớ Python và cài đặt các móc gỡ lỗi.

Hiện tại có thể cài đặt móc gỡ lỗi trên bộ cấp phát bộ nhớ Python trên Python được biên dịch ở chế độ phát hành bằng PYTHONMALLOC=debug. Tác dụng của móc gỡ lỗi:

  • Bộ nhớ mới được cấp phát chứa đầy byte 0xCB

  • Bộ nhớ giải phóng được lấp đầy bằng byte 0xDB

  • Phát hiện các vi phạm của bộ cấp phát bộ nhớ Python API. Ví dụ: PyObject_Free() gọi khối bộ nhớ được phân bổ bởi PyMem_Malloc().

  • Phát hiện việc ghi trước khi bắt đầu bộ đệm (chảy bộ đệm)

  • Phát hiện việc ghi sau khi kết thúc bộ đệm (tràn bộ đệm)

  • Kiểm tra xem GIL có được giữ hay không khi các hàm cấp phát của miền PYMEM_DOMAIN_OBJ (ví dụ: PyObject_Malloc()) và PYMEM_DOMAIN_MEM (ví dụ: PyMem_Malloc()) được gọi.

Kiểm tra xem GIL có được giữ hay không cũng là một tính năng mới của Python 3.6.

Xem hàm PyMem_SetupDebugHooks() để biết các móc gỡ lỗi trên bộ cấp phát bộ nhớ Python.

Giờ đây, bạn cũng có thể buộc sử dụng bộ cấp phát malloc() của thư viện C cho tất cả các cấp phát bộ nhớ Python bằng PYTHONMALLOC=malloc. Điều này hữu ích khi sử dụng trình gỡ lỗi bộ nhớ ngoài như Valgrind trên Python được biên dịch ở chế độ phát hành.

Do lỗi, các móc gỡ lỗi trên bộ cấp phát bộ nhớ Python hiện sử dụng mô-đun tracemalloc để lấy lại dấu vết nơi khối bộ nhớ được phân bổ.

Ví dụ về lỗi nghiêm trọng khi tràn bộ đệm bằng python3.6 -X tracemalloc=5 (lưu trữ 5 khung hình trong dấu vết):

Khối bộ nhớ gỡ lỗi tại địa chỉ p=0x7fbcd41666f8: API 'o'
    4 byte được yêu cầu ban đầu
    7 byte pad  p-7  FORBIDDENBYTE, như mong đợi.
    8 byte đệm  tail=0x7fbcd41666fc không phải tất cả đều  FORBIDDENBYTE (0xfb):
         đuôi+0: 0x02 *** OUCH
         đuôi+1: 0xfb
         đuôi+2: 0xfb
         đuôi+3: 0xfb
         đuôi+4: 0xfb
         đuôi+5: 0xfb
         đuôi+6: 0xfb
         đuôi+7: 0xfb
    Khối này được tạo bằng lệnh gọi #1233329 để gỡ lỗi malloc/realloc.
    Dữ liệu tại p: 1a 2b 30 00

Khối bộ nhớ được phân bổ tại (cuộc gọi gần đây nhất trước tiên):
  Tệp "test/test_bytes.py", dòng 323
  Tệp "unittest/case.py", dòng 600
  Tệp "unittest/case.py", dòng 648
  Tệp "unittest/suite.py", dòng 122
  Tệp "unittest/suite.py", dòng 84

Lỗi Python nghiêm trọng: byte đệm cuối không hợp lệ

Chuỗi hiện tại 0x00007fbcdbd32700 (cuộc gọi gần đây nhất trước):
  Tệp "test/test_bytes.py", dòng 323 trong test_hex
  Tệp "unittest/case.py", dòng 600 đang chạy
  Tệp "unittest/case.py", dòng 648 trong __call__
  Tệp "unittest/suite.py", dòng 122 đang chạy
  Tệp "unittest/suite.py", dòng 84 trong __call__
  Tệp "unittest/suite.py", dòng 122 đang chạy
  Tệp "unittest/suite.py", dòng 84 trong __call__
  ...

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

Hỗ trợ thăm dò DTrace và SystemTap

Giờ đây, Python có thể được xây dựng --with-dtrace để kích hoạt các điểm đánh dấu tĩnh cho các sự kiện sau trong trình thông dịch:

  • gọi/trả lại hàm

  • việc thu gom rác đã bắt đầu/kết thúc

  • dòng mã được thực thi.

Điều này có thể được sử dụng để hỗ trợ các trình thông dịch đang chạy trong sản xuất mà không cần phải biên dịch lại debug builds cụ thể hoặc cung cấp mã lược tả/gỡ lỗi dành riêng cho ứng dụng.

Thêm chi tiết trong Thiết bị CPython với DTrace và SystemTap.

Việc triển khai hiện tại đã được thử nghiệm trên Linux và macOS. Các điểm đánh dấu bổ sung có thể được thêm vào trong tương lai.

(Được đóng góp bởi Łukasz Langa trong bpo-21590, dựa trên các bản vá của Jesús Cea Avión, David Malcolm và Nikhil Benesch.)

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

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

  • Câu lệnh global hoặc nonlocal bây giờ phải xuất hiện dưới dạng văn bản trước lần sử dụng đầu tiên của tên bị ảnh hưởng trong cùng phạm vi. Trước đây đây là một chiếc SyntaxWarning.

  • Hiện tại có thể đặt special method thành None để cho biết rằng thao tác tương ứng không khả dụng. Ví dụ: nếu một lớp đặt __iter__() thành None thì lớp đó không thể lặp lại được. (Được đóng góp bởi Andrew Barnert và Ivan Levkivskyi trong bpo-25958.)

  • Chuỗi dài các dòng truy ngược lặp lại hiện được viết tắt là "[Previous line repeated {count} more times]" (xem truy nguyên để biết ví dụ). (Được đóng góp bởi Emanuel Barry trong bpo-26823.)

  • Bây giờ, quá trình nhập sẽ đưa ra ngoại lệ mới ModuleNotFoundError (lớp con của ImportError) khi không thể tìm thấy mô-đun. Mã hiện đang kiểm tra ImportError (trong lần thử ngoại trừ) sẽ vẫn hoạt động. (Được đóng góp bởi Eric Snow trong bpo-15767.)

  • Các phương thức lớp dựa trên super() không đối số giờ đây sẽ hoạt động chính xác khi được gọi từ các phương thức siêu dữ liệu trong quá trình tạo lớp. (Được đóng góp bởi Martin Teichmann trong bpo-23722.)

Mô-đun mới

bí mật

Mục đích chính của mô-đun secrets mới là cung cấp một cách rõ ràng để tạo ra các giá trị giả ngẫu nhiên mạnh về mặt mật mã phù hợp để quản lý bí mật, chẳng hạn như xác thực tài khoản, mã thông báo, v.v.

Cảnh báo

Lưu ý rằng các trình tạo giả ngẫu nhiên trong mô-đun random nên được sử dụng NOT cho mục đích bảo mật. Sử dụng secrets trên Python 3.6+ và os.urandom() trên Python 3.5 trở về trước.

Xem thêm

PEP 506 -- Thêm mô-đun bí mật vào thư viện chuẩn

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

Mô-đun cải tiến

mảng

Các trình vòng lặp đã hết của array.array giờ đây sẽ vẫn cạn kiệt ngay cả khi mảng lặp được mở rộng. Điều này phù hợp với hành vi của các trình tự có thể thay đổi khác.

Đóng góp bởi Serhiy Storchaka trong bpo-26492.

ast

Nút ast.Constant AST mới đã được thêm vào. Nó có thể được sử dụng bởi các trình tối ưu hóa AST bên ngoài cho mục đích gấp liên tục.

Đóng góp của Victor Stinner trong bpo-26146.

asyncio

Bắt đầu với Python 3.6, mô-đun asyncio không còn là tạm thời nữa và API của nó được coi là ổn định.

Những thay đổi đáng chú ý trong mô-đun asyncio kể từ Python 3.5.0 (tất cả được chuyển về 3.5.x do trạng thái tạm thời):

  • Hàm get_event_loop() đã được thay đổi để luôn trả về vòng lặp hiện đang chạy khi được gọi từ coroutine và lệnh gọi lại. (Được đóng góp bởi Yury Selivanov trong bpo-28613.)

  • 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.)

  • 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 trong bpo-27041.)

  • 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 trong bpo-27040.)

  • 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.)

  • Hiệu suất của StreamReader.readexactly() đã được cải thiện. (Được đóng góp bởi Mark Korenberg trong bpo-28370.)

  • Phương thức loop.getaddrinfo() đượ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.)

  • Phương thức loop.stop() đã được thay đổi để dừng vòng lặp ngay sau lần lặp hiện tại. Mọi lệnh gọi lại mới được lên lịch do lần lặp cuối cùng sẽ bị loại bỏ. (Được đóng góp bởi Guido van Rossum trong bpo-25593.)

  • Future.set_exception bây giờ sẽ tăng TypeError khi vượt qua một phiên bản của ngoại lệ StopIteration. (Được đóng góp bởi Chris Angelico trong bpo-26221.)

  • Phương thức loop.connect_accepted_socket() mới sẽ được sử dụng bởi các máy chủ chấp nhận kết nối bên ngoài asyncio nhưng sử dụng asyncio để xử lý chúng. (Được đóng góp bởi Jim Fulton trong bpo-27392.)

  • Cờ TCP_NODELAY hiện được đặt cho tất cả các lần vận chuyển TCP theo mặc định. (Được đóng góp bởi Yury Selivanov trong bpo-27456.)

  • Zz000zz mới để đóng đúng cách các bộ tạo không đồng bộ đang chờ xử lý trước khi đóng vòng lặp. (Được đóng góp bởi Yury Selivanov trong bpo-28003.)

  • Các lớp FutureTask hiện có cách triển khai C được tối ưu hóa, giúp mã asyncio nhanh hơn tới 30%. (Được đóng góp bởi Yury Selivanov và INADA Naoki trong bpo-26081bpo-28544.)

binascii

Hàm b2a_base64() hiện chấp nhận đối số từ khóa newline tùy chọn để kiểm soát xem ký tự dòng mới có được thêm vào giá trị trả về hay không. (Được đóng góp bởi Victor Stinner trong bpo-25357.)

cmath

Hằng số cmath.tau (τ) mới đã được thêm vào. (Được đóng góp bởi Lisa Roach trong bpo-12345, xem PEP 628 để biết chi tiết.)

Các hằng số mới: cmath.infcmath.nan để khớp với math.infmath.nan, đồng thời cmath.infjcmath.nanj để khớp với định dạng được sử dụng bởi đại diện phức tạp. (Được đóng góp bởi Mark Dickinson trong bpo-23229.)

bộ sưu tập

Lớp cơ sở trừu tượng Collection mới đã được thêm vào để thể hiện các lớp chứa có thể lặp lại có kích thước. (Được đóng góp bởi Ivan Levkivskyi, tài liệu của Neil Girdhar trên bpo-27598.)

Lớp cơ sở trừu tượng Reversible mới đại diện cho các lớp có thể lặp lại cũng cung cấp phương thức __reversed__(). (Được đóng góp bởi Ivan Levkivskyi trong bpo-25987.)

Lớp cơ sở trừu tượng AsyncGenerator mới đại diện cho các trình tạo không đồng bộ. (Được đóng góp bởi Yury Selivanov trong bpo-28720.)

Hàm namedtuple() hiện chấp nhận một đối số từ khóa tùy chọn module, mà khi được chỉ định, sẽ được sử dụng cho thuộc tính __module__ của lớp tuple có tên được trả về. (Được đóng góp bởi Raymond Hettinger trong bpo-17941.)

Các đối số verboserename cho namedtuple() hiện chỉ có từ khóa. (Được đóng góp bởi Raymond Hettinger trong bpo-25628.)

Hiện tại, các phiên bản collections.deque đệ quy có thể được chọn. (Được đóng góp bởi Serhiy Storchaka trong bpo-26482.)

đồng thời.futures

Hàm tạo của lớp ThreadPoolExecutor hiện chấp nhận một đối số thread_name_prefix tùy chọn để có thể tùy chỉnh tên của các luồng được tạo bởi nhóm. (Được đóng góp bởi Gregory P. Smith trong bpo-27664.)

bối cảnh

Lớp contextlib.AbstractContextManager đã được thêm vào để cung cấp lớp cơ sở trừu tượng cho người quản lý bối cảnh. Nó cung cấp cách triển khai mặc định hợp lý cho __enter__(), trả về self và để lại __exit__() một phương thức trừu tượng. Một lớp phù hợp đã được thêm vào mô-đun typingtyping.ContextManager. (Được đóng góp bởi Brett Cannon trong bpo-25609.)

ngày giờ

Các lớp datetimetime có thuộc tính fold mới được sử dụng để phân biệt giờ địa phương khi cần thiết. Nhiều chức năng trong datetime đã được cập nhật để hỗ trợ định hướng giờ địa phương. Xem phần Local Time Disambiguation để biết thêm thông tin. (Được đóng góp bởi Alexander Belopolsky trong bpo-24773.)

Các phương thức datetime.strftime()date.strftime() hiện hỗ trợ các chỉ thị ngày ISO 8601 %G, %u%V. (Được đóng góp bởi Ashley Anderson trong bpo-12006.)

Hàm datetime.isoformat() hiện chấp nhận đối số timespec tùy chọn chỉ định số lượng thành phần bổ sung của giá trị thời gian cần đưa vào. (Được đóng góp bởi Alessandro Cucci và Alexander Belopolsky trong bpo-19475.)

datetime.combine() hiện chấp nhận đối số tzinfo tùy chọn. (Được đóng góp bởi Alexander Belopolsky trong bpo-27661.)

số thập phân

Phương thức Decimal.as_integer_ratio() mới trả về một cặp số nguyên (n, d) biểu thị phiên bản Decimal đã cho dưới dạng phân số, ở dạng thấp nhất và có mẫu số dương:

>>> Số thập phân('-3.14').as_integer_ratio()
(-157, 50)

(Được đóng góp bởi Stefan Krah amd Mark Dickinson trong bpo-25928.)

nước cất

Thuộc tính default_format đã bị xóa khỏi distutils.command.sdist.sdist và thuộc tính formats mặc định là ['gztar']. Mặc dù không lường trước được nhưng bất kỳ mã nào dựa vào sự hiện diện của default_format đều có thể cần phải được điều chỉnh. Xem bpo-27819 để biết thêm chi tiết.

email

Email mới API, được kích hoạt thông qua từ khóa policy cho các nhà xây dựng khác nhau, không còn mang tính tạm thời nữa. Tài liệu email đã được sắp xếp lại và viết lại để tập trung vào API mới, trong khi vẫn giữ lại tài liệu cũ cho API cũ. (Được đóng góp bởi R. David Murray trong bpo-24277.)

Các lớp email.mime hiện đều chấp nhận từ khóa policy tùy chọn. (Được đóng góp bởi Berker Peksag trong bpo-27331.)

DecodedGenerator hiện hỗ trợ từ khóa policy.

Có một thuộc tính policy mới, message_factory, kiểm soát lớp nào được sử dụng theo mặc định khi trình phân tích cú pháp tạo đối tượng thông báo mới. Đối với chính sách email.policy.compat32, đây là Message, đối với các chính sách mới, đó là EmailMessage. (Được đóng góp bởi R. David Murray trong bpo-20476.)

mã hóa

Trên Windows, đã thêm mã hóa 'oem' để sử dụng CP_OEMCP và bí danh 'ansi' cho mã hóa 'mbcs' hiện có, sử dụng trang mã CP_ACP. (Được đóng góp bởi Steve Dower trong bpo-27959.)

liệt kê

Hai lớp cơ sở liệt kê mới đã được thêm vào mô-đun enum: FlagIntFlag. Cả hai đều được sử dụng để xác định các hằng số có thể được kết hợp bằng toán tử bitwise. (Được đóng góp bởi Ethan Furman trong bpo-23591.)

Nhiều mô-đun thư viện tiêu chuẩn đã được cập nhật để sử dụng lớp IntFlag cho các hằng số của chúng.

Giá trị enum.auto mới có thể được sử dụng để tự động gán giá trị cho các thành viên enum

>>> from enum import Enum, auto
>>> Màu lớp (Enum):
... đỏ = tự động()
... xanh = tự động()
... xanh = tự động()
...
>>> danh sách (Màu)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

người xử lý lỗi

Trên Windows, mô-đun faulthandler hiện cài đặt trình xử lý các ngoại lệ của Windows: xem faulthandler.enable(). (Được đóng góp bởi Victor Stinner trong bpo-23848.)

đầu vào tập tin

hook_encoded() hiện hỗ trợ đối số errors. (Được đóng góp bởi Joseph Hackman trong bpo-25788.)

hàm băm

hashlib hỗ trợ OpenSSL 1.1.0. Phiên bản khuyến nghị tối thiểu là 1.0.2. (Được đóng góp bởi Christian Heimes trong bpo-26470.)

Các hàm băm BLAKE2 đã được thêm vào mô-đun. blake2b()blake2s() luôn có sẵn và hỗ trợ bộ tính năng đầy đủ của BLAKE2. (Được đóng góp bởi Christian Heimes trong bpo-26798 dựa trên mã của Dmitry Chestnykh và Samuel Neves. Tài liệu được viết bởi Dmitry Chestnykh.)

Các hàm băm SHA-3 sha3_224(), sha3_256(), sha3_384(), sha3_512() và SHAKE các hàm băm shake_128()shake_256() đã được thêm vào. (Được đóng góp bởi Christian Heimes trong bpo-16113. Gói mã Keccak của Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche và Ronny Van Keer.)

Hàm dẫn xuất khóa dựa trên mật khẩu scrypt() hiện có sẵn với OpenSSL 1.1.0 trở lên. (Được đóng góp bởi Christian Heimes trong bpo-27928.)

http.client

Cả HTTPConnection.request()endheaders() hiện đều hỗ trợ các nội dung yêu cầu mã hóa theo khối. (Được đóng góp bởi Demian Brecht và Rolf Krahl trong bpo-12319.)

nhàn rỗi và IDLE

Gói idlib đang được hiện đại hóa và tái cấu trúc để giúp IDLE trông và hoạt động tốt hơn, đồng thời giúp mã dễ hiểu, kiểm tra và cải tiến hơn. Một phần giúp IDLE trông đẹp hơn, đặc biệt là trên Linux và Mac, là sử dụng các tiện ích ttk, chủ yếu trong các hộp thoại. Kết quả là IDLE không còn chạy với tcl/tk 8.4 nữa. Bây giờ nó yêu cầu tcl/tk 8.5 hoặc 8.6. Chúng tôi khuyên bạn nên chạy bản phát hành mới nhất của một trong hai.

'Hiện đại hóa' bao gồm đổi tên và hợp nhất các mô-đun Idlelib. Việc đổi tên các tệp có tên viết hoa một phần cũng tương tự như việc đổi tên Tkinter và TkFont thành tkinter và tkinter.font trong 3.0. Do đó, việc nhập các tệp Idlelib hoạt động ở phiên bản 3.5 thường sẽ không hoạt động ở phiên bản 3.6. Ít nhất cần phải thay đổi tên mô-đun (xem idlib/README.txt), đôi khi còn hơn thế nữa. (Những thay đổi về tên do Al Swiegart và Terry Reedy đóng góp trong bpo-24225. Hầu hết các bản vá idlib kể từ đó đã và sẽ là một phần của quá trình.)

Đổi lại, kết quả cuối cùng là một số lớp Idlelib sẽ dễ sử dụng hơn, với các API và chuỗi tài liệu tốt hơn giải thích chúng. Thông tin hữu ích bổ sung sẽ được thêm vào Idlelib khi có sẵn.

Mới trong phiên bản 3.6.2:

Nhiều bản sửa lỗi để tự động hoàn thành. (Được đóng góp bởi Louie Lu trong bpo-15786.)

Mới trong phiên bản 3.6.3:

Trình duyệt mô-đun (trên menu Tệp, trước đây gọi là Trình duyệt lớp), giờ đây hiển thị các hàm và lớp lồng nhau bên cạnh các hàm và lớp cấp cao nhất. (Được đóng góp bởi Guilherme Polo, Cheryl Sabella và Terry Jan Reedy trong bpo-1612262.)

Các tính năng IDLE trước đây được triển khai dưới dạng tiện ích mở rộng đã được triển khai lại dưới dạng các tính năng thông thường. Cài đặt của chúng đã được chuyển từ tab Tiện ích mở rộng sang các tab hộp thoại khác. (Được đóng góp bởi Charles Wohlganger và Terry Jan Reedy trong bpo-27099.)

Hộp thoại Cài đặt (Tùy chọn, Định cấu hình IDLE) đã được viết lại một phần để cải thiện cả về hình thức lẫn chức năng. (Được đóng góp bởi Cheryl Sabella và Terry Jan Reedy trong nhiều số báo.)

Mới trong 3.6.4:

Mẫu phông chữ hiện bao gồm lựa chọn các ký tự không phải tiếng Latinh để người dùng có thể thấy rõ hơn tác dụng của việc chọn một phông chữ cụ thể. (Được đóng góp bởi Terry Jan Reedy trong bpo-13802.) Mẫu có thể được chỉnh sửa để bao gồm các ký tự khác. (Được đóng góp bởi Serhiy Storchaka trong bpo-31860.)

Mới trong phiên bản 3.6.6:

Tùy chọn ngữ cảnh mã soạn thảo đã được sửa đổi. Hộp hiển thị tất cả các dòng ngữ cảnh cho đến dòng tối đa. Nhấp vào một dòng ngữ cảnh sẽ chuyển trình soạn thảo tới dòng đó. Màu ngữ cảnh cho chủ đề tùy chỉnh được thêm vào tab Nổi bật của hộp thoại Cài đặt. (Được đóng góp bởi Cheryl Sabella và Terry Jan Reedy trong bpo-33642, bpo-33768bpo-33679.)

Trên Windows, lệnh gọi API mới cho Windows biết rằng tk chia tỷ lệ cho DPI. Trên Windows 8.1+ hoặc 10, với các thuộc tính tương thích DPI của tệp nhị phân Python không thay đổi và độ phân giải màn hình lớn hơn 96 DPI, điều này sẽ làm cho văn bản và đường nét sắc nét hơn. Nếu không thì nó sẽ không có tác dụng. (Được đóng góp bởi Terry Jan Reedy trong bpo-33656.)

Mới trong phiên bản 3.6.7:

Đầu ra trên N dòng (50 theo mặc định) được nén xuống một nút. N có thể được thay đổi trong phần PyShell của trang Chung của hộp thoại Cài đặt. Các dòng ít hơn, nhưng có thể dài hơn, có thể được nén bằng cách nhấp chuột phải vào đầu ra. Đầu ra bị nén có thể được mở rộng tại chỗ bằng cách nhấp đúp vào nút hoặc vào bảng tạm hoặc một cửa sổ riêng bằng cách nhấp chuột phải vào nút. (Được đóng góp bởi Tal Einat trong bpo-1529353.)

nhập khẩu

Bây giờ, quá trình nhập sẽ đưa ra ngoại lệ mới ModuleNotFoundError (lớp con của ImportError) khi không thể tìm thấy mô-đun. Mã kiểm tra hiện tại cho ImportError (trong lần thử ngoại trừ) sẽ vẫn hoạt động. (Được đóng góp bởi Eric Snow trong bpo-15767.)

importlib.util.LazyLoader hiện gọi create_module() trên trình tải được bao bọc, loại bỏ hạn chế rằng importlib.machinery.BuiltinImporterimportlib.machinery.ExtensionFileLoader không thể sử dụng được với importlib.util.LazyLoader.

importlib.util.cache_from_source(), importlib.util.source_from_cache()importlib.util.spec_from_file_location() hiện chấp nhận path-like object.

kiểm tra

Hàm inspect.signature() hiện báo cáo các tham số .0 ẩn được tạo bởi trình biên dịch để hiểu và phạm vi biểu thức trình tạo như thể chúng là các tham số chỉ có vị trí được gọi là implicit0. (Được đóng góp bởi Jelle Zijlstra trong bpo-19611.)

Để giảm tình trạng xáo trộn mã khi nâng cấp từ Python 2.7 và inspect.getargspec() API cũ, việc ngừng sử dụng inspect.getfullargspec() được ghi lại trước đây đã được hủy bỏ. Mặc dù chức năng này thuận tiện cho các cơ sở mã Python 2/3 đơn/nguồn, nhưng giao diện inspect.signature() phong phú hơn vẫn là phương pháp được đề xuất cho mã mới. (Được đóng góp bởi Nick Coghlan trong bpo-27172)

json

json.load()json.loads() hiện hỗ trợ đầu vào nhị phân. JSON được mã hóa phải được thể hiện bằng UTF-8, UTF-16 hoặc UTF-32. (Được đóng góp bởi Serhiy Storchaka trong bpo-17909.)

khai thác gỗ

Phương thức WatchedFileHandler.reopenIfNeeded() mới đã được thêm vào để thêm khả năng kiểm tra xem tệp nhật ký có cần được mở lại hay không. (Được đóng góp bởi Marian Hurban trong bpo-24884.)

môn toán

Hằng số tau (τ) đã được thêm vào mô-đun mathcmath. (Được đóng góp bởi Lisa Roach trong bpo-12345, xem PEP 628 để biết chi tiết.)

đa xử lý

Proxy Objects được trả về bởi multiprocessing.Manager() hiện có thể được lồng vào nhau. (Được đóng góp bởi Davin Potts trong bpo-6766.)

hệ điều hành

Xem phần tóm tắt về PEP 519 để biết chi tiết về cách các mô-đun osos.path hiện hỗ trợ path-like objects.

scandir() hiện hỗ trợ đường dẫn bytes trên Windows.

Một phương thức close() mới cho phép đóng một trình vòng lặp scandir() một cách rõ ràng. Trình lặp scandir() hiện hỗ trợ giao thức context manager. Nếu trình vòng lặp scandir() không bị cạn kiệt cũng như không bị đóng rõ ràng thì ResourceWarning sẽ được phát ra trong hàm hủy của nó. (Được đóng góp bởi Serhiy Storchaka trong bpo-25994.)

Trên Linux, os.urandom() hiện chặn cho đến khi nhóm entropy urandom của hệ thống được khởi tạo để tăng tính bảo mật. Xem PEP 524 để biết lý do.

Tòa nhà cao tầng Linux getrandom() (nhận byte ngẫu nhiên) hiện được hiển thị dưới dạng hàm os.getrandom() mới. (Được đóng góp bởi Victor Stinner, một phần của PEP 524)

đường dẫn

pathlib hiện hỗ trợ path-like objects. (Được đóng góp bởi Brett Cannon trong bpo-27186.)

Xem tổng hợp PEP 519 để biết chi tiết.

pdb

Hàm tạo của lớp Pdb có một đối số readrc tùy chọn mới để kiểm soát xem có nên đọc tệp .pdbrc hay không.

dưa chua

Các đối tượng cần __new__ được gọi bằng đối số từ khóa giờ đây có thể được chọn bằng pickle protocols cũ hơn giao thức phiên bản 4. Giao thức phiên bản 4 đã hỗ trợ trường hợp này. (Được đóng góp bởi Serhiy Storchaka trong bpo-24164.)

dụng cụ dưa chua

pickletools.dis() hiện xuất ra chỉ mục ghi nhớ ngầm cho opcode MEMOIZE. (Được đóng góp bởi Serhiy Storchaka trong bpo-25382.)

pydoc

Mô-đun pydoc đã học cách tôn trọng biến môi trường MANPAGER. (Được đóng góp bởi Matthias Klose trong bpo-8637.)

help()pydoc hiện có thể liệt kê các trường bộ dữ liệu được đặt tên theo thứ tự chúng được xác định thay vì theo thứ tự bảng chữ cái. (Được đóng góp bởi Raymond Hettinger trong bpo-24879.)

ngẫu nhiên

Hàm choices() mới trả về danh sách các phần tử có kích thước được chỉ định từ tập hợp đã cho với các trọng số tùy chọn. (Được đóng góp bởi Raymond Hettinger trong bpo-18844.)

lại

Đã thêm hỗ trợ cho các phạm vi sửa đổi trong biểu thức thông thường. Ví dụ: '(?i:p)ython' khớp với 'python''Python', nhưng không khớp với 'PYTHON'; '(?i)g(?-i:v)r' khớp với 'GvR''gvr', nhưng không khớp với 'GVR'. (Được đóng góp bởi Serhiy Storchaka trong bpo-433028.)

Các nhóm đối tượng phù hợp có thể được truy cập bởi __getitem__, tương đương với group(). Vậy mo['name'] bây giờ tương đương với mo.group('name'). (Được đóng góp bởi Eric Smith trong bpo-24454.)

Các đối tượng Match hiện hỗ trợ index-like objects dưới dạng chỉ mục nhóm. (Được đóng góp bởi Jeroen Demeyer và Xiang Zhang trong bpo-27177.)

dòng đọc

Đã thêm set_auto_history() để bật hoặc tắt tính năng tự động thêm đầu vào vào danh sách lịch sử. (Được đóng góp bởi Tyler Crompton trong bpo-26870.)

người hoàn thành rl

Tên thuộc tính riêng tư và đặc biệt hiện bị bỏ qua trừ khi tiền tố bắt đầu bằng dấu gạch dưới. Một dấu cách hoặc dấu hai chấm được thêm vào sau một số từ khóa đã hoàn thành. (Được đóng góp bởi Serhiy Storchaka trong bpo-25011bpo-25209.)

shlex

shlex có nhiều improved shell compatibility thông qua đối số punctuation_chars mới để kiểm soát những ký tự nào được coi là dấu câu. (Được đóng góp bởi Vinay Sajip trong bpo-1521950.)

trang web

Khi chỉ định đường dẫn để thêm vào sys.path trong tệp .pth, giờ đây bạn có thể chỉ định đường dẫn tệp ở đầu thư mục (ví dụ: tệp zip). (Được đóng góp bởi Wolfgang Langner trong bpo-26587).

sqlite3

sqlite3.Cursor.lastrowid hiện hỗ trợ câu lệnh REPLACE. (Được đóng góp bởi Alex LordThorsen trong bpo-16864.)

ổ cắm

Chức năng ioctl() hiện hỗ trợ mã điều khiển SIO_LOOPBACK_FAST_PATH. (Được đóng góp bởi Daniel Stokes trong bpo-26536.)

Các hằng số getsockopt() SO_DOMAIN, SO_PROTOCOL, SO_PEERSECSO_PASSSEC hiện được hỗ trợ. (Được đóng góp bởi Christian Heimes trong bpo-26907.)

Zz000zz hiện hỗ trợ dạng setsockopt(level, optname, None, optlen: int). (Được đóng góp bởi Christian Heimes trong bpo-27744.)

Mô-đun ổ cắm hiện hỗ trợ họ địa chỉ AF_ALG để giao tiếp với Linux Kernel crypto API. ALG_*, SOL_ALGsendmsg_afalg() đã được thêm vào. (Được đóng góp bởi Christian Heimes trong bpo-27744 với sự hỗ trợ của Victor Stinner.)

Các hằng số Linux mới TCP_USER_TIMEOUTTCP_CONGESTION đã được thêm vào. (Được đóng góp bởi Omar Sandoval, bpo-26273).

máy chủ ổ cắm

Các máy chủ dựa trên mô-đun socketserver, bao gồm các máy chủ được xác định trong http.server, xmlrpc.serverwsgiref.simple_server, hiện hỗ trợ giao thức context manager. (Được đóng góp bởi Aviv Palivoda trong bpo-26404.)

Thuộc tính wfile của các lớp StreamRequestHandler hiện triển khai giao diện có thể ghi io.BufferedIOBase. Đặc biệt, gọi write() hiện nay đảm bảo gửi dữ liệu đầy đủ. (Được đóng góp bởi Martin Panter trong bpo-26721.)

ssl

ssl hỗ trợ OpenSSL 1.1.0. Phiên bản khuyến nghị tối thiểu là 1.0.2. (Được đóng góp bởi Christian Heimes trong bpo-26470.)

3DES đã bị xóa khỏi bộ mật mã mặc định và bộ mật mã ChaCha20 Poly1305 đã được thêm vào. (Được đóng góp bởi Christian Heimes trong bpo-27850bpo-27766.)

SSLContext có cấu hình mặc định tốt hơn cho các tùy chọn và mật mã. (Được đóng góp bởi Christian Heimes trong bpo-28043.)

Phiên SSL có thể được sao chép từ kết nối phía máy khách này sang kết nối phía máy khách khác bằng lớp SSLSession mới. Việc tiếp tục phiên TLS có thể tăng tốc độ bắt tay ban đầu, giảm độ trễ và cải thiện hiệu suất (Được đóng góp bởi Christian Heimes trong bpo-19500 dựa trên bản nháp của Alex Warhawk.)

Phương pháp get_ciphers() mới có thể được sử dụng để lấy danh sách các mật mã được kích hoạt theo thứ tự ưu tiên của mật mã.

Tất cả các hằng số và cờ đã được chuyển đổi thành IntEnumIntFlag. (Được đóng góp bởi Christian Heimes trong bpo-28025.)

Các giao thức TLS cụ thể phía máy chủ và máy khách dành cho SSLContext đã được thêm vào. (Được đóng góp bởi Christian Heimes trong bpo-28085.)

Đã thêm ssl.SSLContext.post_handshake_auth để bật và ssl.SSLSocket.verify_client_post_handshake() để bắt đầu xác thực sau bắt tay TLS 1.3. (Được đóng góp bởi Christian Heimes trong gh-78851.)

thống kê

Một chức năng harmonic_mean() mới đã được thêm vào. (Được đóng góp bởi Steven D'Aprano trong bpo-27181.)

cấu trúc

struct hiện hỗ trợ các float có độ chính xác một nửa IEEE 754 thông qua công cụ xác định định dạng 'e'. (Được đóng góp bởi Eli Stevens, Mark Dickinson trong bpo-11734.)

quy trình con

Hàm hủy subprocess.Popen hiện phát ra cảnh báo ResourceWarning nếu tiến trình con vẫn đang chạy. Sử dụng giao thức quản lý bối cảnh (with proc: ...) hoặc gọi phương thức wait() một cách rõ ràng để đọc trạng thái thoát của tiến trình con. (Được đóng góp bởi Victor Stinner trong bpo-26741.)

Hàm tạo subprocess.Popen và tất cả các hàm truyền đối số cho nó hiện chấp nhận các đối số encodingerrors. Việc chỉ định một trong hai tùy chọn này sẽ bật chế độ văn bản cho các luồng stdin, stdoutstderr. (Được đóng góp bởi Steve Dower trong bpo-6135.)

hệ thống

Hàm getfilesystemencodeerrors() mới trả về tên của chế độ lỗi được sử dụng để chuyển đổi giữa tên tệp Unicode và tên tệp byte. (Được đóng góp bởi Steve Dower trong bpo-27781.)

Trên Windows, giá trị trả về của hàm getwindowsversion() hiện bao gồm trường platform_version chứa phiên bản chính, phiên bản phụ và số bản dựng chính xác của hệ điều hành hiện tại, thay vì phiên bản đang được mô phỏng cho quy trình (Được đóng góp bởi Steve Dower trong bpo-27932.)

telnetlib

telnetlib.Telnet hiện là trình quản lý bối cảnh (được đóng góp bởi Stéphane Wirtel trong bpo-25485).

thời gian

Các thuộc tính struct_time tm_gmtofftm_zone hiện có sẵn trên tất cả các nền tảng.

đã đến lúc

Phương thức tiện lợi Timer.autorange() mới đã được thêm vào để gọi Timer.timeit() liên tục để tổng thời gian chạy lớn hơn hoặc bằng 200 mili giây. (Được đóng góp bởi Steven D'Aprano trong bpo-6422.)

timeit hiện cảnh báo khi có sự chênh lệch đáng kể (4x) giữa thời điểm tốt nhất và tồi tệ nhất. (Được đóng góp bởi Serhiy Storchaka trong bpo-23552.)

tkinter

Đã thêm các phương thức Variable.trace_add(), Variable.trace_remove()trace_info() trong lớp tkinter.Variable. Chúng thay thế các phương thức cũ trace_variable(), trace(), trace_vdelete()trace_vinfo() sử dụng các lệnh Tcl lỗi thời và có thể không hoạt động trong các phiên bản Tcl trong tương lai. (Được đóng góp bởi Serhiy Storchaka trong bpo-22115).

truy nguyên

Cả mô-đun truy nguyên và hiển thị ngoại lệ dựng sẵn của trình thông dịch giờ đây đều viết tắt các chuỗi dài của các dòng lặp lại trong truy nguyên như trong ví dụ sau:

>>> def f(): f()
...
>>> f()
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
  Tệp "<stdin>", dòng 1, trong f
  Tệp "<stdin>", dòng 1, trong f
  Tệp "<stdin>", dòng 1, trong f
  [Dòng trước lặp lại 995 lần nữa]
RecursionError: vượt quá độ sâu đệ quy tối đa

(Được đóng góp bởi Emanuel Barry trong bpo-26823.)

dấu vết

Mô-đun tracemalloc hiện hỗ trợ theo dõi phân bổ bộ nhớ trong nhiều không gian địa chỉ khác nhau.

Lớp bộ lọc DomainFilter mới đã được thêm vào để lọc dấu vết khối theo không gian địa chỉ (miền) của chúng.

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

đánh máy

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

Mô-đun typing hỗ trợ cải tiến hơn nhiều cho các bí danh loại chung. Ví dụ: Dict[str, Tuple[S, T]] hiện là chú thích loại hợp lệ. (Được đóng góp bởi Guido van Rossum trong Github #195.)

Lớp typing.ContextManager đã được thêm vào để đại diện cho contextlib.AbstractContextManager. (Được đóng góp bởi Brett Cannon trong bpo-25609.)

Lớp typing.Collection đã được thêm vào để đại diện cho collections.abc.Collection. (Được đóng góp bởi Ivan Levkivskyi trong bpo-27598.)

Cấu trúc kiểu typing.ClassVar đã được thêm vào để đánh dấu các biến lớp. Như đã giới thiệu trong PEP 526, chú thích biến được bao bọc trong ClassVar cho biết rằng một thuộc tính nhất định được dự định sử dụng làm biến lớp và không được đặt trên các phiên bản của lớp đó. (Được đóng góp bởi Ivan Levkivskyi trong Github #280.)

Một hằng số TYPE_CHECKING mới được bộ kiểm tra kiểu tĩnh giả định là True nhưng lại là False khi chạy. (Được đóng góp bởi Guido van Rossum trong Github #230.)

Một chức năng trợ giúp NewType() mới đã được thêm vào để tạo các loại riêng biệt nhẹ cho chú thích:

từ việc  nhập NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

Trình kiểm tra kiểu tĩnh sẽ xử lý kiểu mới như thể nó là một lớp con của kiểu ban đầu. (Được đóng góp bởi Ivan Levkivskyi trong Github #189.)

dữ liệu unicode

Mô-đun unicodedata hiện sử dụng dữ liệu từ Unicode 9.0.0. (Được đóng góp bởi Benjamin Peterson.)

unittest.mock

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

urllib.request

Nếu một yêu cầu HTTP có một tệp hoặc nội dung có thể lặp lại (không phải đối tượng byte) nhưng không có tiêu đề Content-Length, thay vì đưa ra lỗi, thì AbstractHTTPHandler giờ đây sẽ quay lại sử dụng mã hóa truyền theo khối. (Được đóng góp bởi Demian Brecht và Rolf Krahl trong bpo-12319.)

urllib.robotparser

RobotFileParser hiện hỗ trợ các tiện ích mở rộng Crawl-delayRequest-rate. (Được đóng góp bởi Nikolay Bogoychev trong bpo-16099.)

venv

venv chấp nhận tham số mới --prompt. Tham số này cung cấp tiền tố thay thế cho môi trường ảo. (Được đề xuất bởi Łukasz Balcerzak và được Stéphane Wirtel chuyển sang phiên bản 3.6 trong bpo-22829.)

cảnh báo

Một tham số source tùy chọn mới đã được thêm vào hàm warnings.warn_explicit(): đối tượng bị phá hủy phát ra ResourceWarning. Thuộc tính source cũng đã được thêm vào warnings.WarningMessage (do Victor Stinner đóng góp trong bpo-26568bpo-26567).

Khi cảnh báo ResourceWarning được ghi lại, mô-đun tracemalloc hiện được sử dụng để cố truy xuất dấu vết nơi đối tượng bị phá hủy được phân bổ.

Ví dụ với tập lệnh example.py:

cảnh báo nhập khẩu

def func():
    quay lại mở(__file__)

f = func()
f = Không

Đầu ra của lệnh python3.6 -Wd -X tracemalloc=5 example.py:

example.py:7: ResourceWarning: tệp không được tiết lộ <_io.TextIOWrapper name='example.py' mode='r' Encoding='UTF-8'>
  f = Không
Đối tượng được phân bổ tại (cuộc gọi gần đây nhất trước):
  Tệp "example.py", lineno 4
    quay lại mở(__file__)
  Tệp "example.py", lineno 6
    f = func()

Truy nguyên "Đối tượng được phân bổ tại" là mới và chỉ được hiển thị nếu tracemalloc đang theo dõi phân bổ bộ nhớ Python và nếu mô-đun warnings đã được nhập.

winreg

Đã thêm loại số nguyên 64 bit REG_QWORD. (Được đóng góp bởi Clement Rouault trong bpo-23026.)

chiến thắng

Đối số từ khóa được phép chuyển tới Beep, MessageBeepPlaySound (bpo-27982).

xmlrpc.client

Mô-đun xmlrpc.client hiện hỗ trợ sắp xếp lại các loại dữ liệu bổ sung được sử dụng bởi quá trình triển khai XML-RPC của Apache cho số và None. (Được đóng góp bởi Serhiy Storchaka trong bpo-26885.)

tập tin zip

Phương thức lớp ZipInfo.from_file() mới cho phép tạo một phiên bản ZipInfo từ tệp hệ thống tệp. Một phương thức ZipInfo.is_dir() mới có thể được sử dụng để kiểm tra xem phiên bản ZipInfo có đại diện cho một thư mục hay không. (Được đóng góp bởi Thomas Kluyver trong bpo-26039.)

Phương thức ZipFile.open() hiện có thể được sử dụng để ghi dữ liệu vào tệp ZIP cũng như để trích xuất dữ liệu. (Được đóng góp bởi Thomas Kluyver trong bpo-26039.)

zlib

Các hàm compress()decompress() hiện chấp nhận các đối số từ khóa. (Được đóng góp bởi Aviv Palivoda trong bpo-26243 và Xiang Zhang trong bpo-16764.)

Tối ưu hóa

  • Trình thông dịch Python hiện sử dụng mã từ 16 bit thay vì mã byte, điều này giúp thực hiện một số tối ưu hóa mã opcode. (Được đóng góp bởi Demur Rumed với ý kiến đóng góp và đánh giá từ Serhiy Storchaka và Victor Stinner trong bpo-26647bpo-28050.)

  • Lớp asyncio.Future hiện có triển khai C được tối ưu hóa. (Được đóng góp bởi Yury Selivanov và INADA Naoki trong bpo-26081.)

  • Lớp asyncio.Task hiện có triển khai C được tối ưu hóa. (Được đóng góp bởi Yury Selivanov trong bpo-28544.)

  • Nhiều cải tiến triển khai khác nhau trong mô-đun typing (chẳng hạn như bộ nhớ đệm của các loại chung) cho phép cải thiện hiệu suất lên tới 30 lần và giảm dung lượng bộ nhớ.

  • Bộ giải mã ASCII hiện nhanh hơn tới 60 lần đối với các trình xử lý lỗi surrogateescape, ignorereplace (Được đóng góp bởi Victor Stinner trong bpo-24870).

  • Bộ mã hóa ASCII và Latin1 hiện có tốc độ nhanh gấp 3 lần đối với trình xử lý lỗi surrogateescape (Được đóng góp bởi Victor Stinner trong bpo-25227).

  • Bộ mã hóa UTF-8 hiện nhanh hơn tới 75 lần đối với các trình xử lý lỗi ignore, replace, surrogateescape, surrogatepass (Được đóng góp bởi Victor Stinner trong bpo-25267).

  • Bộ giải mã UTF-8 hiện nhanh hơn tới 15 lần đối với các trình xử lý lỗi ignore, replacesurrogateescape (Được đóng góp bởi Victor Stinner trong bpo-25301).

  • bytes % args hiện nhanh hơn tới 2 lần. (Được đóng góp bởi Victor Stinner trong bpo-25349).

  • bytearray % args hiện nhanh hơn từ 2,5 đến 5 lần. (Được đóng góp bởi Victor Stinner trong bpo-25399).

  • Tối ưu hóa bytes.fromhex()bytearray.fromhex(): chúng hiện nhanh hơn từ 2 đến 3,5 lần. (Được đóng góp bởi Victor Stinner trong bpo-25401).

  • Tối ưu hóa bytes.replace(b'', b'.')bytearray.replace(b'', b'.'): nhanh hơn tới 80%. (Được đóng góp bởi Josh Snider trong bpo-26574).

  • Các hàm cấp phát của miền PyMem_Malloc() (PYMEM_DOMAIN_MEM) hiện sử dụng hàm pymalloc memory allocator thay vì hàm malloc() của thư viện C. Bộ cấp phát pymalloc được tối ưu hóa cho các đối tượng nhỏ hơn hoặc bằng 512 byte với thời gian tồn tại ngắn và sử dụng malloc() cho các khối bộ nhớ lớn hơn. (Được đóng góp bởi Victor Stinner trong bpo-26249).

  • pickle.load()pickle.loads() hiện nhanh hơn tới 10% khi giải tuần tự hóa nhiều đối tượng nhỏ (Được đóng góp bởi Victor Stinner trong bpo-27056).

  • Việc truyền keyword arguments cho một hàm có chi phí cao hơn so với việc truyền positional arguments. Giờ đây, trong các chức năng mở rộng được triển khai bằng cách sử dụng Argument Clinic, chi phí này đã giảm đáng kể. (Được đóng góp bởi Serhiy Storchaka trong bpo-27574).

  • Các chức năng glob()iglob() được tối ưu hóa trong mô-đun glob; bây giờ chúng nhanh hơn khoảng 3--6 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-25596).

  • Tối ưu hóa toàn cầu trong pathlib bằng cách sử dụng os.scandir(); bây giờ nó nhanh hơn khoảng 1,5--4 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-26032).

  • Hiệu suất phân tích cú pháp, lặp và deepcopy của xml.etree.ElementTree đã được cải thiện đáng kể. (Được đóng góp bởi Serhiy Storchaka trong bpo-25638, bpo-25873bpo-25869.)

  • Việc tạo các phiên bản fractions.Fraction từ số float và số thập phân hiện nhanh hơn từ 2 đến 3 lần. (Được đóng góp bởi Serhiy Storchaka trong bpo-25971.)

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

  • Python hiện yêu cầu một số hỗ trợ C99 trong chuỗi công cụ để xây dựng. Đáng chú ý nhất, Python hiện sử dụng các loại số nguyên và macro tiêu chuẩn thay cho các macro tùy chỉnh như PY_LONG_LONG. Để biết thêm thông tin, hãy xem PEP 7bpo-17884.

  • Biên dịch chéo CPython với Android NDK và cấp độ Android API được đặt thành 21 (Android 5.0 Lollipop) hoặc cao hơn sẽ chạy thành công. Mặc dù Android chưa phải là nền tảng được hỗ trợ nhưng bộ thử nghiệm Python chạy trên trình giả lập Android chỉ có khoảng 16 lần thử nghiệm thất bại. Xem vấn đề về meta Android bpo-26865.

  • Cờ cấu hình --enable-optimizations đã được thêm vào. Bật nó lên sẽ kích hoạt các tối ưu hóa đắt tiền như PGO. (Bản vá gốc của Alecsandru Patrascu của Intel trong bpo-26359.)

  • Bây giờ, GIL phải được giữ khi các hàm cấp phát của miền PYMEM_DOMAIN_OBJ (ví dụ: PyObject_Malloc()) và PYMEM_DOMAIN_MEM (ví dụ: PyMem_Malloc()) được gọi.

  • Py_FinalizeEx() API mới cho biết liệu việc xóa dữ liệu được lưu vào bộ đệm có thất bại hay không. (Được đóng góp bởi Martin Panter trong bpo-5319.)

  • PyArg_ParseTupleAndKeywords() hiện hỗ trợ positional-only parameters. Các tham số chỉ có vị trí được xác định bằng tên trống. (Được đóng góp bởi Serhiy Storchaka trong bpo-26282).

  • Phương thức PyTraceback_Print bây giờ viết tắt các chuỗi dài các dòng lặp lại là "[Previous line repeated {count} more times]". (Được đóng góp bởi Emanuel Barry trong bpo-26823.)

  • Hàm PyErr_SetImportErrorSubclass() mới cho phép chỉ định một lớp con của ImportError để nâng cao. (Được đóng góp bởi Eric Snow trong bpo-15767.)

  • Hàm PyErr_ResourceWarning() mới có thể được sử dụng để tạo ResourceWarning cung cấp nguồn phân bổ tài nguyên. (Được đóng góp bởi Victor Stinner trong bpo-26567.)

  • Hàm PyOS_FSPath() mới trả về biểu diễn hệ thống tệp của path-like object. (Được đóng góp bởi Brett Cannon trong bpo-27186.)

  • Các hàm PyUnicode_FSConverter()PyUnicode_FSDecoder() hiện sẽ chấp nhận path-like objects.

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

  • Khi --version (dạng ngắn: -V) được cung cấp hai lần, Python sẽ in sys.version để biết thông tin chi tiết.

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, ngày 21 tháng 11 năm 2016, 20:55:04)
    [GCC 4.2.1 Tương thích Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

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. Bắt đầu từ Python 3.6, việc sử dụng async hoặc await làm tên sẽ tạo ra DeprecationWarning.

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 DeprecationWarning và sẽ kích hoạt RuntimeError trong Python 3.7. Xem PEP 479: Thay đổi cách xử lý StopIteration bên trong máy phát điện để biết chi tiết.

Phương thức __aiter__() hiện được mong đợi sẽ trả về trực tiếp một trình vòng lặp không đồng bộ thay vì trả về một thứ có thể chờ đợi như trước đây. Làm như trước sẽ kích hoạt DeprecationWarning. Khả năng tương thích ngược sẽ bị xóa trong Python 3.7. (Được đóng góp bởi Yury Selivanov trong bpo-27243.)

Cặp ký tự dấu gạch chéo ngược không phải là chuỗi thoát hợp lệ hiện tạo ra DeprecationWarning. Mặc dù điều này cuối cùng sẽ trở thành SyntaxError, nhưng điều đó sẽ không dành cho một số bản phát hành Python. (Được đóng góp bởi Emanuel Barry trong bpo-27364.)

Khi thực hiện nhập tương đối, việc quay lại __name____path__ từ mô-đun gọi khi __spec__ hoặc __package__ không được xác định hiện sẽ tăng ImportWarning. (Được đóng góp bởi Rose Ames trong bpo-25791.)

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

asyncchat

asynchat không còn được dùng nữa để thay thế bằng asyncio. (Được đóng góp bởi Mariatta trong bpo-25002.)

không đồng bộ

asyncore không còn được dùng nữa để thay thế bằng asyncio. (Được đóng góp bởi Mariatta trong bpo-25002.)

dbm

Không giống như các triển khai dbm khác, mô-đun dbm.dumb tạo cơ sở dữ liệu với chế độ 'rw' và cho phép sửa đổi cơ sở dữ liệu được mở bằng chế độ 'r'. Hành vi này hiện không còn được dùng nữa và sẽ bị xóa trong phiên bản 3.8. (Được đóng góp bởi Serhiy Storchaka trong bpo-21708.)

nước cất

Đối số extra_path không có giấy tờ cho hàm tạo distutils.Distribution hiện được coi là không dùng nữa và sẽ đưa ra cảnh báo nếu được đặt. Hỗ trợ cho tham số này sẽ bị xóa trong bản phát hành Python trong tương lai. Xem bpo-27919 để biết chi tiết.

grp

Việc hỗ trợ các đối số không nguyên trong getgrgid() đã không còn được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-26129.)

nhập khẩu

Các phương thức importlib.machinery.SourceFileLoader.load_module()importlib.machinery.SourcelessFileLoader.load_module() hiện không được dùng nữa. Chúng là những triển khai duy nhất còn lại của importlib.abc.Loader.load_module() trong importlib không bị phản đối trong các phiên bản Python trước đó thay vì importlib.abc.Loader.exec_module().

Lớp importlib.machinery.WindowsRegistryFinder hiện không được dùng nữa. Kể từ phiên bản 3.6.0, nó vẫn được thêm vào sys.meta_path theo mặc định (trên Windows), nhưng điều này có thể thay đổi trong các bản phát hành sau này.

hệ điều hành

Hỗ trợ không có giấy tờ cho bytes-like objects chung dưới dạng đường dẫn trong các hàm os, compile() và các hàm tương tự hiện không được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-25791bpo-26754.)

lại

Hỗ trợ cho cờ nội tuyến (?letters) ở giữa biểu thức chính quy không được dùng nữa và sẽ bị xóa trong phiên bản Python trong tương lai. Cờ ở đầu biểu thức chính quy vẫn được phép. (Được đóng góp bởi Serhiy Storchaka trong bpo-22493.)

ssl

OpenSSL 0.9.8, 1.0.0 và 1.0.1 không được dùng nữa và không còn được hỗ trợ. Trong tương lai, mô-đun ssl sẽ yêu cầu ít nhất OpenSSL 1.0.2 hoặc 1.1.0.

Các đối số liên quan đến SSL như certfile, keyfilecheck_hostname trong ftplib, http.client, imaplib, poplibsmtplib đã không còn được dùng nữa để thay thế cho context. (Được đóng góp bởi Christian Heimes trong bpo-28022.)

Một số giao thức và chức năng của mô-đun ssl hiện không còn được dùng nữa. Một số tính năng sẽ không còn khả dụng trong các phiên bản OpenSSL trong tương lai. Các tính năng khác không được dùng nữa để thay thế bằng một chiếc API khác. (Được đóng góp bởi Christian Heimes trong bpo-28022bpo-26470.)

tkinter

Mô-đun tkinter.tix hiện không được dùng nữa. Người dùng tkinter nên sử dụng tkinter.ttk thay thế.

venv

Tập lệnh pyvenv không còn được dùng nữa để thay thế cho python3 -m venv. Điều này ngăn ngừa sự nhầm lẫn về việc trình thông dịch Python pyvenv được kết nối với cái gì và do đó trình thông dịch Python nào sẽ được môi trường ảo sử dụng. (Được đóng góp bởi Brett Cannon trong bpo-25154.)

xml

  • Để giảm thiểu khả năng truy xuất DTD và thực thể bên ngoài, các mô-đun xml.dom.minidomxml.sax không còn xử lý các thực thể bên ngoài theo mặc định nữa. (Được đóng góp bởi Christian Heimes trong gh-61441.)

Các chức năng và loại không dùng nữa của C API

Các hàm không có giấy tờ PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode()PyUnicode_AsDecodedUnicode() hiện không được dùng nữa. Thay vào đó hãy sử dụng generic codec based API.

Tùy chọn bản dựng không được dùng nữa

Cờ cấu hình --with-system-ffi hiện được bật theo mặc định trên các nền tảng UNIX không phải macOS. Nó có thể bị vô hiệu hóa bằng cách sử dụng --without-system-ffi, nhưng việc sử dụng cờ này không được dùng nữa và sẽ không được chấp nhận trong Python 3.7. macOS không bị ảnh hưởng bởi thay đổi này. Lưu ý rằng nhiều nhà phân phối hệ điều hành đã sử dụng cờ --with-system-ffi khi xây dựng hệ thống Python của họ.

Đã xóa

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

  • Các lối thoát không xác định bao gồm '\' và một chữ cái ASCII trong biểu thức thông thường giờ đây sẽ gây ra lỗi. Trong các mẫu thay thế cho re.sub(), chúng vẫn được phép nhưng không được dùng nữa. Cờ re.LOCALE hiện chỉ có thể được sử dụng với các mẫu nhị phân.

  • inspect.getmoduleinfo() đã bị xóa (không được dùng nữa kể từ CPython 3.3). inspect.getmodulename() nên được sử dụng để lấy tên mô-đun cho một đường dẫn nhất định. (Được đóng góp bởi Yury Selivanov trong bpo-13248.)

  • Lớp traceback.Ignore và các phương thức traceback.usage, traceback.modname, traceback.fullmodname, traceback.find_lines_from_code, traceback.find_lines, traceback.find_strings, traceback.find_executable_lines đã bị xóa khỏi mô-đun traceback. Chúng là các phương thức không có giấy tờ không được dùng nữa vì Python 3.2 và chức năng tương đương có sẵn từ các phương thức riêng tư.

  • Các phương thức giả tk_menuBar()tk_bindForTraversal() trong các lớp tiện ích tkinter đã bị xóa (các lệnh Tk tương ứng đã lỗi thời kể từ Tk 4.0).

  • Phương thức open() của lớp zipfile.ZipFile không còn hỗ trợ chế độ 'U' (không được dùng nữa kể từ Python 3.4). Sử dụng io.TextIOWrapper để đọc tệp văn bản nén ở chế độ universal newlines.

  • Các mô-đun IN, CDROM, DLFCN, TYPES, CDIOSTROPTS không có giấy tờ đã bị xóa. Chúng đã có sẵn trong các thư mục Lib/plat-*/ dành riêng cho nền tảng, nhưng thường xuyên lỗi thời, khả dụng không nhất quán trên các nền tảng và không được bảo trì. Tập lệnh tạo ra các mô-đun này vẫn có sẵn trong bản phân phối nguồn tại Tools/scripts/h2py.py.

  • Lớp asynchat.fifo không được dùng nữa đã bị xóa.

Chuyển sang Python 3.6

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

Những thay đổi trong hành vi lệnh 'python'

  • Đầu ra của bản dựng Python đặc biệt với các macro COUNT_ALLOCS, SHOW_ALLOC_COUNT hoặc SHOW_TRACK_COUNT được xác định hiện bị tắt theo mặc định. Nó có thể được kích hoạt lại bằng tùy chọn -X showalloccount. Bây giờ nó xuất ra stderr thay vì stdout. (Được đóng góp bởi Serhiy Storchaka trong bpo-23034.)

Những thay đổi trong Python API

  • open() sẽ không còn cho phép kết hợp cờ chế độ 'U' với '+' nữa. (Được đóng góp bởi Jeff Balogh và John O'Connor trong bpo-2091.)

  • sqlite3 không còn thực hiện ngầm một giao dịch mở trước các câu lệnh DDL nữa.

  • Trên Linux, os.urandom() hiện chặn cho đến khi nhóm entropy urandom của hệ thống được khởi tạo để tăng tính bảo mật.

  • Khi importlib.abc.Loader.exec_module() được xác định, importlib.abc.Loader.create_module() cũng phải được xác định.

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

  • Định dạng của thuộc tính co_lnotab của các đối tượng mã đã thay đổi để hỗ trợ delta số dòng âm. Theo mặc định, Python không phát ra mã byte có số dòng delta âm. Các chức năng sử dụng frame.f_lineno, PyFrame_GetLineNumber() hoặc PyCode_Addr2Line() không bị ảnh hưởng. Cần cập nhật các hàm giải mã trực tiếp co_lnotab để sử dụng loại số nguyên 8 bit có dấu cho số dòng delta, nhưng điều này chỉ được yêu cầu để hỗ trợ các ứng dụng sử dụng delta số dòng âm. Xem Objects/lnotab_notes.txt để biết định dạng co_lnotab và cách giải mã nó, đồng thời xem PEP 511 để biết lý do.

  • Các hàm trong mô-đun compileall hiện trả về boolean thay vì 1 hoặc 0 để thể hiện thành công hay thất bại tương ứng. Nhờ booleans là một lớp con của số nguyên, điều này chỉ thành vấn đề nếu bạn đang thực hiện kiểm tra danh tính cho 1 hoặc 0. Xem bpo-25768.

  • Việc đọc thuộc tính port của kết quả urllib.parse.urlsplit()urlparse() hiện tăng ValueError cho các giá trị ngoài phạm vi, thay vì trả về None. Xem bpo-20059.

  • Mô-đun imp hiện tăng DeprecationWarning thay vì PendingDeprecationWarning.

  • Các mô-đun sau đã thiếu API được thêm vào thuộc tính __all__ để khớp với các API được ghi lại: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threadingwave. Điều này có nghĩa là họ sẽ xuất các ký hiệu mới khi sử dụng import *. (Được đóng góp bởi Joel Taddei và Jacek Kołodziej trong bpo-23883.)

  • Khi thực hiện nhập tương đối, nếu __package__ không so sánh bằng __spec__.parent thì ImportWarning sẽ được nâng lên. (Được đóng góp bởi Brett Cannon trong bpo-25791.)

  • Khi quá trình nhập tương đối được thực hiện và không có gói cha nào được biết thì ImportError sẽ được nâng lên. Trước đây, SystemError có thể được nâng lên. (Được đóng góp bởi Brett Cannon trong bpo-18018.)

  • Các máy chủ dựa trên mô-đun socketserver, bao gồm các máy chủ được xác định trong http.server, xmlrpc.serverwsgiref.simple_server, hiện chỉ bắt được các ngoại lệ bắt nguồn từ Exception. Do đó, nếu trình xử lý yêu cầu đưa ra một ngoại lệ như SystemExit hoặc KeyboardInterrupt thì handle_error() sẽ không còn được gọi nữa và ngoại lệ đó sẽ dừng máy chủ đơn luồng. (Được đóng góp bởi Martin Panter trong bpo-23430.)

  • spwd.getspnam() hiện tăng PermissionError thay vì KeyError nếu người dùng không có đặc quyền.

  • Phương thức socket.socket.close() hiện đưa ra một ngoại lệ nếu lệnh gọi hệ thống cơ bản báo cáo một lỗi (ví dụ: EBADF). (Được đóng góp bởi Martin Panter trong bpo-26685.)

  • Đối số decode_data cho các hàm tạo smtpd.SMTPChannelsmtpd.SMTPServer hiện tại là False theo mặc định. Điều này có nghĩa là đối số được truyền cho process_message() hiện là đối tượng byte theo mặc định và process_message() sẽ được truyền đối số từ khóa. Mã đã được cập nhật theo cảnh báo không dùng nữa do phiên bản 3.5 tạo ra sẽ không bị ảnh hưởng.

  • Tất cả các đối số tùy chọn của các hàm dump(), dumps(), load()loads() cũng như các hàm tạo của lớp JSONEncoderJSONDecoder trong mô-đun json hiện là keyword-only. (Được đóng góp bởi Serhiy Storchaka trong bpo-18726.)

  • Các lớp con của type không ghi đè type.__new__ có thể không còn sử dụng biểu mẫu một đối số để lấy loại đối tượng nữa.

  • Là một phần của PEP 487, việc xử lý các đối số từ khóa được truyền cho type (ngoài gợi ý siêu dữ liệu, metaclass) hiện được ủy quyền nhất quán cho object.__init_subclass__(). Điều này có nghĩa là cả type.__new__type.__init__ đều chấp nhận các đối số từ khóa tùy ý, nhưng object.__init_subclass__() (được gọi từ type.__new__) sẽ từ chối chúng theo mặc định. Các siêu dữ liệu tùy chỉnh chấp nhận các đối số từ khóa bổ sung sẽ cần điều chỉnh lệnh gọi của chúng thành type.__new__ (dù là trực tiếp hay thông qua super) cho phù hợp.

  • Trong distutils.command.sdist.sdist, thuộc tính default_format đã bị xóa và không còn được vinh danh nữa. Thay vào đó, định dạng tarfile được nén bằng gzipped là mặc định trên tất cả các nền tảng và không có lựa chọn dành riêng cho nền tảng nào được thực hiện. Trong môi trường nơi các bản phân phối được xây dựng trên Windows và cần có bản phân phối zip, hãy định cấu hình dự án bằng tệp setup.cfg chứa các nội dung sau:

    [sdist]
    định dạng=zip
    

    Hành vi này cũng đã được chuyển ngược lại sang các phiên bản Python trước đó bởi Setuptools 26.0.0.

  • Trong mô-đun urllib.request và phương thức http.client.HTTPConnection.request(), nếu không có trường tiêu đề Độ dài nội dung nào được chỉ định và nội dung yêu cầu là một đối tượng tệp thì giờ đây nó sẽ được gửi với mã hóa chunked HTTP 1.1. Nếu một đối tượng tệp phải được gửi đến máy chủ HTTP 1.0 thì giá trị Độ dài nội dung bây giờ phải được người gọi chỉ định. (Được đóng góp bởi Demian Brecht và Rolf Krahl với những chỉnh sửa từ Martin Panter trong bpo-12319.)

  • Zz000zz hiện trả về các hàng loại OrderedDict. (Được đóng góp bởi Steve Holden trong bpo-27842.)

  • crypt.METHOD_CRYPT sẽ không còn được thêm vào crypt.methods nếu nền tảng này không hỗ trợ. (Được đóng góp bởi Victor Stinner trong bpo-25287.)

  • Các đối số verboserename cho namedtuple() hiện chỉ có từ khóa. (Được đóng góp bởi Raymond Hettinger trong bpo-25628.)

  • Trên Linux, ctypes.util.find_library() hiện tìm kiếm trong LD_LIBRARY_PATH các thư viện dùng chung. (Được đóng góp bởi Vinay Sajip trong bpo-9998.)

  • Lớp imaplib.IMAP4 hiện xử lý các cờ chứa ký tự ']' trong các tin nhắn được gửi từ máy chủ để cải thiện khả năng tương thích trong thế giới thực. (Được đóng góp bởi Lita Cho trong bpo-21815.)

  • Hàm mmap.mmap.write() hiện trả về số byte được ghi giống như các phương thức ghi khác. (Được đóng góp bởi Jakub Stasiak trong bpo-26335.)

  • Các hàm pkgutil.iter_modules()pkgutil.walk_packages() hiện trả về các bộ dữ liệu có tên ModuleInfo. (Được đóng góp bởi Ramchandra Apte trong bpo-17211.)

  • re.sub() hiện gây ra lỗi đối với các tham chiếu nhóm số không hợp lệ trong các mẫu thay thế ngay cả khi không tìm thấy mẫu trong chuỗi. Thông báo lỗi cho tham chiếu nhóm không hợp lệ hiện bao gồm chỉ mục nhóm và vị trí của tham chiếu. (Được đóng góp bởi SilentGhost, Serhiy Storchaka trong bpo-25953.)

  • zipfile.ZipFile bây giờ sẽ tăng NotImplementedError cho các giá trị nén không được nhận dạng. Trước đây một RuntimeError đơn giản đã được nâng lên. Ngoài ra, việc gọi các phương thức ZipFile trên ZipFile đã đóng hoặc gọi phương thức write() trên ZipFile được tạo bằng chế độ 'r' sẽ tạo ra một ValueError. Trước đây, RuntimeError đã được đưa ra trong các trường hợp đó.

  • khi siêu dữ liệu tùy chỉnh được kết hợp với super() không đối số hoặc tham chiếu trực tiếp từ các phương thức đến biến đóng __class__ ẩn, mục nhập không gian tên __classcell__ ngầm hiện phải được chuyển tới type.__new__ để khởi tạo. Không làm như vậy sẽ dẫn đến DeprecationWarning trong Python 3.6 và RuntimeError trong Python 3.8.

  • Với sự ra đời của ModuleNotFoundError, người tiêu dùng hệ thống nhập khẩu có thể bắt đầu mong đợi các hệ thống thay thế nhập khẩu sẽ đưa ra ngoại lệ cụ thể hơn khi thích hợp, thay vì ImportError ít cụ thể hơn. Để cung cấp khả năng tương thích trong tương lai với những người tiêu dùng như vậy, những người triển khai hệ thống nhập thay thế thay thế hoàn toàn __import__() sẽ cần cập nhật cách triển khai của họ để nâng cấp lớp con mới khi không thể tìm thấy mô-đun nào cả. Những người triển khai các plugin tuân thủ hệ thống nhập mặc định không cần thực hiện bất kỳ thay đổi nào vì hệ thống nhập mặc định sẽ nâng cao lớp con mới khi thích hợp.

Những thay đổi trong C API

  • Dòng cấp phát PyMem_Malloc() hiện sử dụng pymalloc allocator thay vì hệ thống malloc(). Các ứng dụng gọi PyMem_Malloc() mà không giữ GIL hiện có thể bị lỗi. Đặt biến môi trường PYTHONMALLOC thành debug để xác thực việc sử dụng bộ cấp phát bộ nhớ trong ứng dụng của bạn. Xem bpo-26249.

  • Py_Exit() (và trình thông dịch chính) hiện ghi đè trạng thái thoát bằng 120 nếu việc xóa dữ liệu được lưu vào bộ đệm không thành công. Xem bpo-5319.

Thay đổi mã byte CPython

Đã có một số thay đổi lớn đối với bytecode trong Python 3.6.

  • Trình thông dịch Python hiện sử dụng mã từ 16 bit thay vì mã byte. (Được đóng góp bởi Demur Rumed với ý kiến đóng góp và đánh giá từ Serhiy Storchaka và Victor Stinner trong bpo-26647bpo-28050.)

  • Các mã hoạt động FORMAT_VALUEBUILD_STRING mới như một phần của quá trình triển khai formatted string literal. (Được đóng góp bởi Eric Smith trong bpo-25483 và Serhiy Storchaka trong bpo-27078.)

  • Opcode BUILD_CONST_KEY_MAP mới để tối ưu hóa việc tạo từ điển với các phím không đổi. (Được đóng góp bởi Serhiy Storchaka trong bpo-27140.)

  • Các mã lệnh gọi hàm đã được làm lại rất nhiều để có hiệu suất tốt hơn và triển khai đơn giản hơn. Các mã hoạt động MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KWBUILD_MAP_UNPACK_WITH_CALL đã được sửa đổi, các mã hoạt động CALL_FUNCTION_EXBUILD_TUPLE_UNPACK_WITH_CALL mới đã được thêm vào, đồng thời các mã hoạt động CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KWMAKE_CLOSURE đã bị xóa. (Được đóng góp bởi Demur Rumed trong bpo-27095 và Serhiy Storchaka trong bpo-27213, bpo-28257.)

  • Các opcode SETUP_ANNOTATIONSSTORE_ANNOTATION mới đã được thêm vào để hỗ trợ cú pháp variable annotation mới. (Được đóng góp bởi Ivan Levkivskyi trong bpo-27985.)

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

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

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

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

Singleton PyExc_RecursionErrorInst là một phần của API công khai đã bị xóa vì các thành viên của nó không bao giờ bị xóa có thể gây ra lỗi phân tách trong quá trình hoàn thiện trình thông dịch. (Được đóng góp bởi Xavier de Gaye trong bpo-22898bpo-30697.)

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

Hàm locale.localeconv() hiện đặt tạm thời ngôn ngữ LC_CTYPE thành ngôn ngữ LC_NUMERIC trong một số trường hợp. (Được đóng góp bởi Victor Stinner trong bpo-31900.)

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

Các mô-đun xml.dom.minidomxml.sax không còn xử lý các thực thể bên ngoài theo mặc định nữa. Xem thêm gh-61441.

Trong 3.6.7, mô-đun tokenize hiện ngầm phát ra mã thông báo NEWLINE khi được cung cấp đầu vào không có dòng mới ở cuối. Hành vi này hiện khớp với những gì mã thông báo C thực hiện trong nội bộ. (Được đóng góp bởi Ammar Askar trong bpo-33899.)

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

Do những lo ngại đáng kể về bảo mật, tham số reuse_address của asyncio.loop.create_datagram_endpoint() không còn được hỗ trợ. Điều này là do hoạt động của tùy chọn ổ cắm SO_REUSEADDR trong UDP. Để biết thêm chi tiết, hãy xem tài liệu về loop.create_datagram_endpoint(). (Được đóng góp bởi Kyle Stanley, Antoine Pitrou và Yury Selivanov trong bpo-37228.)

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

Các phiên bản Python trước đó cho phép sử dụng cả ;& làm dấu tách tham số truy vấn trong urllib.parse.parse_qs()urllib.parse.parse_qsl(). Do lo ngại về bảo mật và để phù hợp với các đề xuất W3C mới hơn, điều này đã được thay đổi để chỉ cho phép một khóa phân tách duy nhất, với & làm mặc định. Thay đổi này cũng ảnh hưởng đến cgi.parse()cgi.parse_multipart() khi chúng sử dụng các chức năng bị ảnh hưởng trong nội bộ. Để biết thêm chi tiết, vui lòng xem tài liệu tương ứng của họ. (Được đóng góp bởi Adam Goldschmidt, Senthil Kumaran và Ken Jin trong bpo-42967.)

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

Bản sửa lỗi bảo mật sẽ thay đổi hành vi của ftplib.FTP để không tin cậy địa chỉ IPv4 được gửi từ máy chủ từ xa khi thiết lập kênh dữ liệu thụ động. Thay vào đó, chúng tôi sử dụng lại địa chỉ IP của máy chủ ftp. Đối với mã bất thường yêu cầu hành vi cũ, hãy đặt thuộc tính trust_server_pasv_ipv4_address trên phiên bản FTP của bạn thành True. (Xem gh-87451)

Sự hiện diện của các ký tự tab hoặc dòng mới trong các phần của URL cho phép thực hiện một số hình thức tấn công. Theo thông số kỹ thuật WHATWG cập nhật RFC 3986, các ký tự dòng mới \n, \r và tab \t bị loại bỏ khỏi URL bởi trình phân tích cú pháp urllib.parse() để ngăn chặn các cuộc tấn công như vậy. Các ký tự loại bỏ được điều khiển bởi biến cấp độ mô-đun mới urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (Xem gh-88048)