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
**kwargsbâ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ô-đunasynciokhô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 choResourceWarningcũ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
secretsmớ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 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óascrypt().
Cải tiến Windows:
PEP 528 và PEP 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.exevàpythonw.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
._pthcó 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.ziphiện hoạt động như một điểm mốc để suy raPYTHONHOME. 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.
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 kê: 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__.
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' và '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 await và yield 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:
mã đá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.
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, ví 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 là 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
mô 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.
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 os và os.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")) là 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.datetime và datetime.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() và 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.stdout và sys.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 Hettinger là first 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
0xCBBộ nhớ giải phóng được lấp đầy bằng byte
0xDBPhá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ởiPyMem_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 là FORBIDDENBYTE, như mong đợi.
8 byte đệm ở tail=0x7fbcd41666fc không phải tất cả đều là 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-26516 và bpo-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
globalhoặcnonlocalbâ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ếcSyntaxWarning.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ànhNonethì 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ủaImportError) 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 khaiasyncio.Futurenhanh 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àmgetaddrinfocủ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_exceptionbây giờ sẽ tăngTypeErrorkhi 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_NODELAYhiệ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
FuturevàTaskhiệ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-26081 và bpo-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.inf và cmath.nan để khớp với math.inf và math.nan, đồng thời cmath.infj và cmath.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ố verbose và rename 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 typing là typing.ContextManager. (Được đóng góp bởi Brett Cannon trong bpo-25609.)
ngày giờ¶
Các lớp datetime và time 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() và date.strftime() hiện hỗ trợ các chỉ thị ngày ISO 8601 %G, %u và %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: Flag và IntFlag. 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() và 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() và 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() và 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-33768 và bpo-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.BuiltinImporter và importlib.machinery.ExtensionFileLoader không thể sử dụng được với importlib.util.LazyLoader.
importlib.util.cache_from_source(), importlib.util.source_from_cache() và 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() và 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 math và cmath. (Đượ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 os và os.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() và 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' và 'Python', nhưng không khớp với 'PYTHON'; '(?i)g(?-i:v)r' khớp với 'GvR' và '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-25011 và bpo-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_PEERSEC và SO_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_ALG và sendmsg_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_TIMEOUT và TCP_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.server và wsgiref.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-27850 và bpo-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 IntEnum và IntFlag. (Đượ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ố encoding và errors. 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, stdout và stderr. (Đượ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_gmtoff và tm_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() và trace_info() trong lớp tkinter.Variable. Chúng thay thế các phương thức cũ trace_variable(), trace(), trace_vdelete() và 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 typing là provisional 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 gõ 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:
Hai phương thức mới,
Mock.assert_called()vàMock.assert_called_once()để kiểm tra xem đối tượng giả có được gọi hay không. (Được đóng góp bởi Amit Saha trong bpo-26323.)Phương thức
Mock.reset_mock()hiện chỉ có hai đối số từ khóa tùy chọn: return_value và side_effect. (Được đóng góp bởi Kushal Das trong bpo-21271.)
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-delay và Request-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-26568 và bpo-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, MessageBeep và PlaySound (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() và 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-26647 và bpo-28050.)
Lớp
asyncio.Futurehiệ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.Taskhiệ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,ignorevàreplace(Đượ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,replacevàsurrogateescape(Được đóng góp bởi Victor Stinner trong bpo-25301).bytes % argshiện nhanh hơn tới 2 lần. (Được đóng góp bởi Victor Stinner trong bpo-25349).bytearray % argshiệ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()và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'.')và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àmmalloc()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ụngmalloc()cho các khối bộ nhớ lớn hơn. (Được đóng góp bởi Victor Stinner trong bpo-26249).pickle.load()và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()vàiglob()được tối ưu hóa trong mô-đunglob; 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
pathlibbằng cách sử dụngos.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-25873 và bpo-25869.)Việc tạo các phiên bản
fractions.Fractiontừ 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 7 và bpo-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_Printbâ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ủaImportErrorđể 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ạoResourceWarningcung 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()và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ẽ insys.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¶
async và await 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__ và __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() và 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-25791 và bpo-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, keyfile và check_hostname trong ftplib, http.client, imaplib, poplib và smtplib đã 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-28022 và bpo-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.minidomvàxml.saxkhô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() và 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ế chore.sub(), chúng vẫn được phép nhưng không được dùng nữa. Cờre.LOCALEhiệ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.Ignorevà các phương thứctraceback.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ô-đuntraceback. 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()vàtk_bindForTraversal()trong các lớp tiện íchtkinterđã 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ớpzipfile.ZipFilekhông còn hỗ trợ chế độ'U'(không được dùng nữa kể từ Python 3.4). Sử dụngio.TextIOWrapperđể đọc tệp văn bản nén ở chế độ universal newlines.Các mô-đun
IN,CDROM,DLFCN,TYPES,CDIOvàSTROPTSkhông có giấy tờ đã bị xóa. Chúng đã có sẵn trong các thư mụcLib/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.fifokhô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_COUNThoặcSHOW_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 rastderrthay 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.)sqlite3khô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 đặtTypeErrorkhi đố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_lnotabcủ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ụngframe.f_lineno,PyFrame_GetLineNumber()hoặcPyCode_Addr2Line()không bị ảnh hưởng. Cần cập nhật các hàm giải mã trực tiếpco_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. XemObjects/lnotab_notes.txtđể biết định dạngco_lnotabvà cách giải mã nó, đồng thời xem PEP 511 để biết lý do.Các hàm trong mô-đun
compileallhiện trả về boolean thay vì1hoặc0để 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 cho1hoặc0. Xem bpo-25768.Việc đọc thuộc tính
portcủa kết quảurllib.parse.urlsplit()vàurlparse()hiện tăngValueErrorcho các giá trị ngoài phạm vi, thay vì trả vềNone. Xem bpo-20059.Mô-đun
imphiện tăngDeprecationWarningthay 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,threadingvàwave. Điều này có nghĩa là họ sẽ xuất các ký hiệu mới khi sử dụngimport *. (Đượ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__.parentthìImportWarningsẽ đượ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ì
ImportErrorsẽ được nâng lên. Trước đây,SystemErrorcó 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 tronghttp.server,xmlrpc.servervàwsgiref.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ưSystemExithoặcKeyboardInterruptthì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ăngPermissionErrorthay vìKeyErrornế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.SMTPChannelvàsmtpd.SMTPServerhiện tại làFalsetheo mặc định. Điều này có nghĩa là đối số được truyền choprocess_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()vàloads()cũng như các hàm tạo của lớpJSONEncodervàJSONDecodertrong mô-đunjsonhiện là keyword-only. (Được đóng góp bởi Serhiy Storchaka trong bpo-18726.)Các lớp con của
typekhô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 choobject.__init_subclass__(). Điều này có nghĩa là cảtype.__new__vàtype.__init__đều chấp nhận các đối số từ khóa tùy ý, nhưngobject.__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ànhtype.__new__(dù là trực tiếp hay thông quasuper) cho phù hợp.Trong
distutils.command.sdist.sdist, thuộc tínhdefault_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ệpsetup.cfgchứ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.requestvà phương thứchttp.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_CRYPTsẽ không còn được thêm vàocrypt.methodsnế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ố verbose và rename 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 trongLD_LIBRARY_PATHcác thư viện dùng chung. (Được đóng góp bởi Vinay Sajip trong bpo-9998.)Lớp
imaplib.IMAP4hiệ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()vàpkgutil.walk_packages()hiện trả về các bộ dữ liệu có tênModuleInfo. (Đượ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.ZipFilebây giờ sẽ tăngNotImplementedErrorcho các giá trị nén không được nhận dạng. Trước đây mộtRuntimeErrorđơn giản đã được nâng lên. Ngoài ra, việc gọi các phương thứcZipFiletrên ZipFile đã đóng hoặc gọi phương thứcwrite()trên ZipFile được tạo bằng chế độ'r'sẽ tạo ra mộtValueError. 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ớitype.__new__để khởi tạo. Không làm như vậy sẽ dẫn đếnDeprecationWarningtrong Python 3.6 vàRuntimeErrortrong 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ốngmalloc(). Các ứng dụng gọiPyMem_Malloc()mà không giữ GIL hiện có thể bị lỗi. Đặt biến môi trườngPYTHONMALLOCthànhdebugđể 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-26647 và bpo-28050.)
Các mã hoạt động
FORMAT_VALUEvàBUILD_STRINGmớ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_MAPmớ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_KWvàBUILD_MAP_UNPACK_WITH_CALLđã được sửa đổi, các mã hoạt độngCALL_FUNCTION_EXvàBUILD_TUPLE_UNPACK_WITH_CALLmới đã được thêm vào, đồng thời các mã hoạt độngCALL_FUNCTION_VAR,CALL_FUNCTION_VAR_KWvàMAKE_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_ANNOTATIONSvàSTORE_ANNOTATIONmớ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-22898 và bpo-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.minidom và xml.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ả ; và & làm dấu tách tham số truy vấn trong urllib.parse.parse_qs() và 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() và 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)