Phát hành ngôn ngữ lập trình Python 3.11

Sau một năm phát triển, bản phát hành quan trọng của ngôn ngữ lập trình Python 3.11 đã được xuất bản. Chi nhánh mới sẽ được hỗ trợ trong một năm rưỡi, sau đó trong ba năm rưỡi nữa, các bản sửa lỗi sẽ được tạo ra để loại bỏ các lỗ hổng bảo mật.

Đồng thời, thử nghiệm alpha của nhánh Python 3.12 đã bắt đầu (theo lịch phát triển mới, công việc trên nhánh mới bắt đầu năm tháng trước khi phát hành nhánh trước đó và đạt đến giai đoạn thử nghiệm alpha vào thời điểm phát hành tiếp theo ). Nhánh Python 3.12 sẽ ở dạng bản phát hành alpha trong bảy tháng, trong thời gian đó các tính năng mới sẽ được bổ sung và sửa lỗi. Sau đó, các phiên bản beta sẽ được thử nghiệm trong ba tháng, trong thời gian đó việc bổ sung các tính năng mới sẽ bị cấm và mọi sự chú ý sẽ tập trung vào việc sửa lỗi. Trong hai tháng cuối cùng trước khi phát hành, chi nhánh sẽ ở giai đoạn ứng cử viên phát hành, tại đó quá trình ổn định cuối cùng sẽ được thực hiện.

Các bổ sung mới cho Python 3.11 bao gồm:

  • Công việc quan trọng đã được thực hiện để tối ưu hóa hiệu suất. Nhánh mới bao gồm các thay đổi liên quan đến tăng tốc và triển khai nội tuyến các lệnh gọi hàm, việc sử dụng trình thông dịch nhanh của các thao tác tiêu chuẩn (x+x, x*x, xx, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), cũng như các tính năng tối ưu hóa do dự án Cinder và HotPy chuẩn bị. Tùy thuộc vào loại tải, tốc độ thực thi mã tăng từ 10-60%. Trung bình, hiệu suất trên bộ thử nghiệm pyperformance tăng 25%.

    Cơ chế lưu vào bộ nhớ đệm mã byte đã được thiết kế lại, giúp giảm thời gian khởi động trình thông dịch xuống 10-15%. Các đối tượng có mã và mã byte hiện được trình thông dịch phân bổ tĩnh, giúp loại bỏ các giai đoạn sắp xếp mã byte được trích xuất từ ​​bộ nhớ đệm và chuyển đổi các đối tượng có mã để đặt vào bộ nhớ động.

  • Khi hiển thị dấu vết cuộc gọi trong thông báo chẩn đoán, giờ đây có thể hiển thị thông tin về biểu thức gây ra lỗi (trước đây chỉ đánh dấu dòng mà không nêu chi tiết phần nào của dòng gây ra lỗi). Thông tin theo dõi mở rộng cũng có thể được lấy thông qua API và được sử dụng để ánh xạ các hướng dẫn mã byte riêng lẻ tới một vị trí cụ thể trong mã nguồn bằng phương thức codeobject.co_positions() hoặc hàm API PyCode_Addr2Location(). Sự thay đổi này giúp việc gỡ lỗi các vấn đề với các đối tượng từ điển lồng nhau, nhiều lệnh gọi hàm và các biểu thức số học phức tạp trở nên dễ dàng hơn nhiều. TracBack (cuộc gọi gần đây nhất gần đây nhất): File "alumation.py", dòng 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: chia cho XNUMX
  • Đã thêm hỗ trợ cho các nhóm ngoại lệ, giúp chương trình có khả năng tạo và xử lý nhiều ngoại lệ khác nhau cùng một lúc. Để nhóm nhiều ngoại lệ và nâng cao chúng lại với nhau, các loại ngoại lệ mới ExceptionGroup và BaseExceptionGroup đã được đề xuất và biểu thức “ngoại trừ*” đã được thêm vào để làm nổi bật các ngoại lệ riêng lẻ trong một nhóm.
  • Phương thức add_note() đã được thêm vào lớp BaseException, cho phép bạn đính kèm ghi chú văn bản vào ngoại lệ, ví dụ: thêm thông tin theo ngữ cảnh không có sẵn khi ngoại lệ được ném ra.
  • Đã thêm loại Bản thân đặc biệt để thể hiện lớp riêng tư hiện tại. Self có thể được sử dụng để chú thích các phương thức trả về một thể hiện của lớp của nó theo cách đơn giản hơn so với sử dụng TypeVar. lớp MyLock: def __enter__(self) -> Self: self.lock() return self
  • Đã thêm loại LiteralString đặc biệt chỉ có thể bao gồm các chuỗi ký tự bằng chữ tương thích với loại LiteralString (tức là các chuỗi trần và LiteralString, chứ không phải các chuỗi str tùy ý hoặc kết hợp). Loại LiteralString có thể được sử dụng để hạn chế việc truyền đối số chuỗi cho các hàm, việc thay thế tùy ý các phần của chuỗi có thể dẫn đến lỗ hổng, chẳng hạn như khi tạo chuỗi cho truy vấn SQL hoặc lệnh shell. def run_query(sql: LiteralString) -> ... ... def người gọi( tùy ý_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Không: run_query("CHỌN * TỪ sinh viên") # ok run_query(literal_string) # ok run_query( "CHỌN * TỪ" + chữ_string) # ok run_query(arbitrary_string) # Lỗi run_query( # Lỗi f"CHỌN * TỪ sinh viên WHERE tên = {arbitrary_string}" )
  • Loại TypeVarTuple đã được thêm vào, cho phép sử dụng các dạng tổng quát có thể thay đổi, không giống như TypeVar, không bao gồm một loại mà bao gồm một số loại tùy ý.
  • Thư viện chuẩn bao gồm mô-đun tomllib với các chức năng phân tích cú pháp định dạng TOML.
  • Có thể đánh dấu các thành phần riêng lẻ của từ điển đã nhập (TypedDict) bằng nhãn Bắt buộc và Không bắt buộc để xác định các trường bắt buộc và tùy chọn (theo mặc định, tất cả các trường đã khai báo là bắt buộc nếu tổng tham số không được đặt thành Sai). class Movie(TypedDict): title: str năm: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (trường năm là tùy chọn) m3: Movie = {“year”: 2022} # Lỗi, trường tiêu đề bắt buộc không được điền)
  • Lớp TaskGroup đã được thêm vào mô-đun asyncio với việc triển khai trình quản lý bối cảnh không đồng bộ để chờ một nhóm nhiệm vụ hoàn thành. Việc thêm nhiệm vụ vào một nhóm được thực hiện bằng phương thức create_task(). async def main(): không đồng bộ với asyncio.TaskGroup() dưới dạng tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Cả hai tác vụ đều đã hoàn thành .")
  • Đã thêm trình trang trí @dataclass_transform cho các lớp, phương thức và hàm, khi được chỉ định, hệ thống kiểm tra kiểu tĩnh sẽ xử lý đối tượng như thể đang sử dụng trình trang trí @dataclasses.dataclass. Trong ví dụ bên dưới, lớp CustomerModel khi kiểm tra các loại sẽ được xử lý tương tự như một lớp có trình trang trí @dataclasses.dataclass, tức là. vì có phương thức __init__ chấp nhận các biến id và name. @dataclass_transform() lớp ModelBase: ... class CustomerModel(ModelBase): id: int name: str
  • Trong các biểu thức chính quy, khả năng sử dụng nhóm nguyên tử ((?>...)) và bộ định lượng sở hữu (*+, ++, ?+, {m,n}+) đã được thêm vào.
  • Đã thêm tùy chọn dòng lệnh "-P" và biến môi trường PYTHONSAFEPATH để tắt tính năng tự động đính kèm các đường dẫn tệp có khả năng không an toàn vào sys.path.
  • Tiện ích py.exe dành cho nền tảng Windows đã được cải thiện đáng kể, bổ sung thêm hỗ trợ cho cú pháp “-V:”. / " ngoài "- . "
  • Nhiều macro trong API C được chuyển đổi thành các hàm nội tuyến thông thường hoặc tĩnh.
  • Các mô-đun uu, cgi, pipe, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev và sunau không còn được dùng nữa và sẽ bị xóa trong Python Bản phát hành 3.13. Đã xóa hàm PyUnicode_Encode*.

Nguồn: opennet.ru

Thêm một lời nhận xét