Có gì mới trong Python 2.6

tác giả:

A.M. Kuchling (amk tại amk.ca)

Bài viết này giải thích các tính năng mới trong Python 2.6, được phát hành vào ngày 1 tháng 10 năm 2008. Lịch phát hành được mô tả trong PEP 361.

Chủ đề chính của Python 2.6 là chuẩn bị đường dẫn di chuyển sang Python 3.0, một bản thiết kế lại chính của ngôn ngữ. Bất cứ khi nào có thể, Python 2.6 kết hợp các tính năng và cú pháp mới từ 3.0 trong khi vẫn tương thích với mã hiện có bằng cách không xóa các tính năng hoặc cú pháp cũ hơn. Khi không thể thực hiện điều đó, Python 2.6 sẽ cố gắng làm những gì có thể, thêm các chức năng tương thích trong mô-đun future_builtins và công tắc -3 để cảnh báo về các cách sử dụng sẽ không được hỗ trợ trong 3.0.

Một số gói mới quan trọng đã được thêm vào thư viện tiêu chuẩn, chẳng hạn như mô-đun multiprocessingjson, nhưng không có nhiều tính năng mới không liên quan đến Python 3.0 theo một cách nào đó.

Python 2.6 cũng có một số cải tiến và sửa lỗi trong toàn bộ mã nguồn. Tìm kiếm qua nhật ký thay đổi cho thấy đã có 259 bản vá được áp dụng và 612 lỗi đã được sửa giữa Python 2.5 và 2.6. Cả hai con số đều có khả năng bị đánh giá thấp.

Bài viết này không cố gắng cung cấp thông số kỹ thuật đầy đủ về các tính năng mới mà thay vào đó cung cấp một cái nhìn tổng quan thuận tiện. Để biết chi tiết đầy đủ, bạn nên tham khảo tài liệu dành cho Python 2.6. Nếu bạn muốn hiểu lý do thiết kế và triển khai, hãy tham khảo PEP để biết một tính năng mới cụ thể. Bất cứ khi nào có thể, "Có gì mới trong Python" sẽ liên kết đến mục lỗi/bản vá cho mỗi thay đổi.

Python 3.0

Chu trình phát triển cho phiên bản Python 2.6 và 3.0 đã được đồng bộ hóa, với các bản phát hành alpha và beta cho cả hai phiên bản đều được thực hiện trong cùng một ngày. Sự phát triển của 3.0 đã ảnh hưởng đến nhiều tính năng trong 2.6.

Python 3.0 là một bản thiết kế lại sâu rộng của Python, phá vỡ khả năng tương thích với dòng 2.x. Điều này có nghĩa là mã Python hiện tại sẽ cần một số chuyển đổi để chạy trên Python 3.0. Tuy nhiên, không phải tất cả những thay đổi trong phiên bản 3.0 đều phá vỡ tính tương thích. Trong trường hợp các tính năng mới không khiến mã hiện có bị hỏng, chúng sẽ được chuyển về phiên bản 2.6 và được mô tả trong tài liệu này ở vị trí thích hợp. Một số tính năng có nguồn gốc từ 3.0 là:

  • Phương pháp __complex__() để chuyển đổi đối tượng thành số phức.

  • Cú pháp thay thế để bắt ngoại lệ: except TypeError as exc.

  • Việc bổ sung functools.reduce() làm từ đồng nghĩa với chức năng reduce() tích hợp.

Python 3.0 bổ sung thêm một số hàm dựng sẵn mới và thay đổi ngữ nghĩa của một số hàm dựng sẵn hiện có. Các hàm mới trong 3.0 như bin() vừa được thêm vào Python 2.6, nhưng các nội dung hiện có vẫn chưa được thay đổi; thay vào đó, mô-đun future_builtins có các phiên bản với ngữ nghĩa 3.0 mới. Mã được viết để tương thích với 3.0 có thể thực hiện from future_builtins import hex, map nếu cần.

Công tắc dòng lệnh mới, -3, cho phép cảnh báo về các tính năng sẽ bị xóa trong Python 3.0. Bạn có thể chạy mã bằng nút chuyển này để xem cần bao nhiêu công việc để chuyển mã sang 3.0. Giá trị của khóa chuyển này có sẵn cho mã Python dưới dạng biến boolean sys.py3kwarning và cho mã mở rộng C dưới dạng Py_Py3kWarningFlag.

Xem thêm

Chuỗi PEP 3xxx, chứa các đề xuất cho Python 3.0. PEP 3000 mô tả quá trình phát triển Python 3.0. Bắt đầu với PEP 3100 mô tả các mục tiêu chung cho Python 3.0, sau đó khám phá các PEP được đánh số cao hơn đề xuất các tính năng cụ thể.

Những thay đổi trong quá trình phát triển

Trong khi 2.6 đang được phát triển, quy trình phát triển Python đã trải qua hai thay đổi quan trọng: chúng tôi đã chuyển từ trình theo dõi vấn đề của SourceForge sang bản cài đặt Roundup tùy chỉnh và tài liệu đã được chuyển đổi từ LaTeX sang reStructuredText.

Trình theo dõi vấn đề mới: Tổng hợp

Trong một thời gian dài, các nhà phát triển Python ngày càng khó chịu với trình theo dõi lỗi của SourceForge. Giải pháp lưu trữ trên máy chủ của SourceForge không cho phép tùy chỉnh nhiều; ví dụ: không thể tùy chỉnh vòng đời của sự cố.

Do đó, ủy ban cơ sở hạ tầng của Python Software Foundation đã đăng lời kêu gọi người theo dõi vấn đề, yêu cầu các tình nguyện viên thiết lập các sản phẩm khác nhau và nhập một số lỗi và bản vá từ SourceForge. Bốn trình theo dõi khác nhau đã được kiểm tra: Jira, Launchpad, RoundupTrac. Ủy ban cuối cùng đã quyết định Jira và Roundup là hai ứng cử viên. Jira là một sản phẩm thương mại cung cấp các phiên bản được lưu trữ miễn phí cho các dự án phần mềm miễn phí; Roundup là một dự án nguồn mở yêu cầu tình nguyện viên quản lý nó và một máy chủ để lưu trữ nó.

Sau khi đăng lời kêu gọi tình nguyện viên, bản cài đặt Roundup mới đã được thiết lập tại https://bugs.python.org.. Một bản cài đặt Roundup có thể lưu trữ nhiều trình theo dõi và máy chủ này hiện cũng lưu trữ các trình theo dõi sự cố cho Jython và cho trang web Python. Nó chắc chắn sẽ tìm thấy những công dụng khác trong tương lai. Nếu có thể, ấn bản "Có gì mới trong Python" này liên kết đến mục lỗi/bản vá cho mỗi thay đổi.

Dịch vụ lưu trữ của trình theo dõi lỗi Python được cung cấp bởi Upfront Systems ở Stellenbosch, Nam Phi. Martin von Löwis đã nỗ lực rất nhiều trong việc nhập các lỗi và bản vá lỗi hiện có từ SourceForge; các tập lệnh của anh ấy cho hoạt động nhập này có dung lượng https://svn.python.org/view/tracker/importer/ và có thể hữu ích cho các dự án khác muốn chuyển từ SourceForge sang Roundup.

Xem thêm

https://bugs.python.org

Trình theo dõi lỗi Python.

https://bugs.jython.org:

Trình theo dõi lỗi Jython.

https://roundup.sourceforge.io/

Tải xuống và tài liệu tổng hợp.

https://svn.python.org/view/tracker/importer/

Kịch bản chuyển đổi của Martin von Löwis.

Định dạng tài liệu mới: Văn bản được cấu trúc lại bằng Sphinx

Tài liệu Python được viết bằng LaTeX kể từ khi dự án bắt đầu vào khoảng năm 1989. Trong những năm 1980 và đầu những năm 1990, hầu hết tài liệu được in ra để nghiên cứu sau này chứ không thể xem trực tuyến. LaTeX được sử dụng rộng rãi vì nó cung cấp bản in hấp dẫn trong khi vẫn dễ viết sau khi đã học các quy tắc cơ bản của đánh dấu.

Ngày nay LaTeX vẫn được sử dụng để viết các ấn phẩm dành cho in ấn, nhưng bối cảnh dành cho các công cụ lập trình đã thay đổi. Chúng tôi không còn in ra hàng loạt tài liệu nữa; thay vào đó, chúng tôi duyệt qua nó trực tuyến và HTML đã trở thành định dạng quan trọng nhất cần được hỗ trợ. Thật không may, việc chuyển đổi LaTeX sang HTML khá phức tạp và Fred L. Drake Jr., người biên tập tài liệu Python lâu năm, đã dành rất nhiều thời gian để duy trì quá trình chuyển đổi. Đôi khi mọi người đề xuất chuyển đổi tài liệu sang SGML và sau đó là XML, nhưng thực hiện chuyển đổi tốt là một nhiệm vụ quan trọng và chưa có ai cam kết thời gian cần thiết để hoàn thành công việc.

Trong chu kỳ phát triển 2.6, Georg Brandl đã nỗ lực rất nhiều vào việc xây dựng chuỗi công cụ mới để xử lý tài liệu. Gói kết quả được gọi là Sphinx và có sẵn từ https://www.sphinx-doc.org/.

Sphinx tập trung vào đầu ra HTML, tạo ra HTML có kiểu dáng hấp dẫn và hiện đại; đầu ra in vẫn được hỗ trợ thông qua chuyển đổi sang LaTeX. Định dạng đầu vào là reStructuredText, một cú pháp đánh dấu hỗ trợ các lệnh và phần mở rộng tùy chỉnh thường được sử dụng trong cộng đồng Python.

Sphinx là một gói độc lập có thể được sử dụng để viết và gần hai chục dự án khác (listed on the Sphinx web site) đã sử dụng Sphinx làm công cụ tài liệu của họ.

Xem thêm

Documenting Python

Mô tả cách viết tài liệu của Python.

Sphinx

Tài liệu và mã cho chuỗi công cụ Sphinx.

Docutils

Bộ công cụ và trình phân tích cú pháp reStructuredText cơ bản.

PEP 343: Câu lệnh 'với'

Phiên bản trước, Python 2.5, đã thêm câu lệnh 'with' làm tính năng tùy chọn, được kích hoạt bằng lệnh from __future__ import with_statement. Trong 2.6, câu lệnh không cần phải được kích hoạt đặc biệt nữa; điều này có nghĩa là with hiện luôn là một từ khóa. Phần còn lại của phần này là bản sao của phần tương ứng từ tài liệu "Có gì mới trong Python 2.5"; nếu bạn đã quen với câu lệnh 'with' từ Python 2.5, bạn có thể bỏ qua phần này.

Câu lệnh 'with' làm rõ mã mà trước đây sẽ sử dụng các khối try...finally để đảm bảo rằng mã dọn dẹp được thực thi. Trong phần này, tôi sẽ thảo luận về tuyên bố vì nó thường được sử dụng. Trong phần tiếp theo, tôi sẽ xem xét chi tiết triển khai và chỉ ra cách viết các đối tượng để sử dụng với câu lệnh này.

Câu lệnh 'with' là cấu trúc luồng điều khiển có cấu trúc cơ bản là:

với biểu thức [dưới dạng biến]:
     khối

Biểu thức được đánh giá và nó sẽ tạo ra một đối tượng hỗ trợ giao thức quản lý ngữ cảnh (nghĩa là có các phương thức __enter__()__exit__()).

__enter__() của đối tượng được gọi trước khi with-block được thực thi và do đó có thể chạy mã thiết lập. Nó cũng có thể trả về một giá trị được gắn với tên variable, nếu được đưa ra. (Lưu ý cẩn thận rằng variablenot được gán kết quả của expression.)

Sau khi thực hiện xong with-block, phương thức __exit__() của đối tượng sẽ được gọi, ngay cả khi khối đưa ra một ngoại lệ và do đó có thể chạy mã dọn dẹp.

Một số đối tượng Python tiêu chuẩn hiện hỗ trợ giao thức quản lý ngữ cảnh và có thể được sử dụng với câu lệnh 'with'. Các đối tượng tệp là một ví dụ:

với open('/etc/passwd', 'r')  f:
    cho dòng trong f:
        dòng in
        ... thêm  xử  ...

Sau khi câu lệnh này được thực thi, đối tượng tệp trong f sẽ tự động bị đóng, ngay cả khi vòng lặp for đưa ra một ngoại lệ giữa chừng trong khối.

Ghi chú

Trong trường hợp này, f chính là đối tượng được tạo bởi open(), vì __enter__() trả về self.

Các biến điều kiện và khóa của mô-đun threading cũng hỗ trợ câu lệnh 'with':

lock = threading.Lock()
 khóa:
    phần  # Critical
    ...

Khóa được lấy trước khi khối được thực thi và luôn được giải phóng sau khi khối hoàn tất.

Hàm localcontext() trong mô-đun decimal giúp dễ dàng lưu và khôi phục bối cảnh thập phân hiện tại, bao gồm độ chính xác mong muốn và các đặc tính làm tròn để tính toán:

từ nhập thập phân Thập phân, Ngữ cảnh, ngữ cảnh cục bộ

# Displays với độ chính xác mặc định là 28 chữ số
v = Số thập phân('578')
in v.sqrt()

với bối cảnh cục bộ(Ngữ cảnh(prec=16)):
     # All trong khối này sử dụng độ chính xác 16 chữ số.
    Ngữ cảnh ban đầu của # The được khôi phục khi thoát khỏi khối.
    in v.sqrt()

Viết trình quản lý bối cảnh

Nhìn sâu hơn, câu lệnh 'with' khá phức tạp. Hầu hết mọi người sẽ chỉ sử dụng 'with' cùng với các đối tượng hiện có và không cần biết những chi tiết này, vì vậy bạn có thể bỏ qua phần còn lại của phần này nếu muốn. Tác giả của các đối tượng mới sẽ cần hiểu chi tiết về cách triển khai cơ bản và nên tiếp tục đọc.

Giải thích cấp cao về giao thức quản lý bối cảnh là:

  • Biểu thức được đánh giá và sẽ tạo ra một đối tượng được gọi là "trình quản lý ngữ cảnh". Trình quản lý bối cảnh phải có các phương thức __enter__()__exit__().

  • Phương thức __enter__() của trình quản lý bối cảnh được gọi. Giá trị trả về được gán cho VAR. Nếu không có mệnh đề as VAR, giá trị sẽ bị loại bỏ.

  • Mã trong BLOCK được thực thi.

  • Nếu BLOCK đưa ra một ngoại lệ, phương thức __exit__() của trình quản lý bối cảnh sẽ được gọi với ba đối số, chi tiết ngoại lệ (type, value, traceback, các giá trị tương tự được trả về bởi sys.exc_info(), cũng có thể là None nếu không có ngoại lệ nào xảy ra). Giá trị trả về của phương thức sẽ kiểm soát xem một ngoại lệ có được tái xuất hiện hay không: bất kỳ giá trị sai nào cũng sẽ tái xuất hiện ngoại lệ đó và True sẽ dẫn đến việc loại bỏ ngoại lệ đó. Bạn sẽ hiếm khi muốn loại bỏ ngoại lệ, bởi vì nếu bạn làm như vậy thì tác giả của mã chứa câu lệnh 'with' sẽ không bao giờ nhận ra có điều gì sai.

  • Nếu BLOCK không đưa ra ngoại lệ thì phương thức __exit__() vẫn được gọi, nhưng type, valuetraceback đều là None.

Hãy suy nghĩ thông qua một ví dụ. Tôi sẽ không trình bày mã chi tiết mà chỉ phác thảo các phương thức cần thiết cho cơ sở dữ liệu hỗ trợ các giao dịch.

(Dành cho những người không quen với thuật ngữ cơ sở dữ liệu: một tập hợp các thay đổi đối với cơ sở dữ liệu được nhóm thành một giao dịch. Các giao dịch có thể được thực hiện, nghĩa là tất cả các thay đổi được ghi vào cơ sở dữ liệu hoặc được khôi phục, nghĩa là tất cả các thay đổi đều bị loại bỏ và cơ sở dữ liệu không thay đổi. Xem bất kỳ sách giáo khoa cơ sở dữ liệu nào để biết thêm thông tin.)

Giả sử có một đối tượng đại diện cho kết nối cơ sở dữ liệu. Mục tiêu của chúng tôi là cho phép người dùng viết mã như thế này

db_connection=Kết nối  sở dữ liệu()
với db_connection  con trỏ:
    con trỏ.execute('chèn vào ...')
    con trỏ.execute('xóa khỏi ...')
    # ... thêm hoạt động ...

Giao dịch phải được cam kết nếu mã trong khối chạy hoàn hảo hoặc được khôi phục nếu có ngoại lệ. Đây là giao diện cơ bản của DatabaseConnection mà tôi giả sử:

Kết nối  sở dữ liệu lớp:
    giao diện # Database
    con trỏ def (tự):
        "Trả về một đối tượng con trỏ và bắt đầu một giao dịch mới"
    cam kết chắc chắn (tự):
        "Cam kết giao dịch hiện tại"
    khôi phục def (tự):
        "Quay lại giao dịch hiện tại"

Phương pháp __enter__() khá dễ dàng, chỉ cần bắt đầu một giao dịch mới. Đối với ứng dụng này, đối tượng con trỏ thu được sẽ là một kết quả hữu ích nên phương thức sẽ trả về nó. Sau đó, người dùng có thể thêm as cursor vào câu lệnh 'with' của họ để liên kết con trỏ với tên biến.

Kết nối  sở dữ liệu lớp:
    ...
    chắc chắn __enter__(tự):
        # Code để bắt đầu giao dịch mới
        con trỏ = self.cursor()
        con trỏ trở lại

Phương pháp __exit__() phức tạp nhất vì đó là nơi phải thực hiện hầu hết công việc. Phương pháp này phải kiểm tra xem có ngoại lệ xảy ra hay không. Nếu không có ngoại lệ, giao dịch được cam kết. Giao dịch được khôi phục nếu có ngoại lệ.

Trong đoạn mã bên dưới, quá trình thực thi sẽ nằm ở phần cuối của hàm, trả về giá trị mặc định là None. None là sai nên ngoại lệ sẽ tự động được đưa ra lại. Nếu muốn, bạn có thể nói rõ hơn và thêm câu lệnh return vào vị trí được đánh dấu.

Kết nối  sở dữ liệu lớp:
    ...
    def __exit__(self, type, value, tb):
        nếu tb  Không:
            ngoại lệ # No, vì vậy hãy cam kết
            tự.commit()
        khác:
            # Exception đã xảy ra nên hãy quay lại.
            self.rollback()
            # return Sai

Mô-đun ngữ cảnh

Mô-đun contextlib cung cấp một số chức năng và một trình trang trí hữu ích khi viết các đối tượng để sử dụng với câu lệnh 'with'.

Trình trang trí được gọi là contextmanager() và cho phép bạn viết một hàm tạo duy nhất thay vì xác định một lớp mới. Trình tạo sẽ mang lại chính xác một giá trị. Mã lên tới yield sẽ được thực thi dưới dạng phương thức __enter__() và giá trị mang lại sẽ là giá trị trả về của phương thức sẽ được liên kết với biến trong mệnh đề as của câu lệnh 'with', nếu có. Mã sau yield sẽ được thực thi theo phương thức __exit__(). Bất kỳ ngoại lệ nào được đưa ra trong khối sẽ được đưa ra bởi câu lệnh yield.

Sử dụng trình trang trí này, ví dụ về cơ sở dữ liệu của chúng tôi từ phần trước có thể được viết là:

từ trình quản  bối cảnh nhập khẩu contextlib

@contextmanager
def db_transaction (kết nối):
    con trỏ = kết nối.cursor()
    thử:
        con trỏ năng suất
    ngoại trừ:
        kết nối.rollback()
        nâng cao
    khác:
        kết nối.commit()

db = Kết nối  sở dữ liệu()
với db_transaction(db) làm con trỏ:
    ...

Mô-đun contextlib cũng có chức năng nested(mgr1, mgr2, ...) kết hợp một số trình quản lý ngữ cảnh để bạn không cần phải viết các câu lệnh 'with' lồng nhau. Trong ví dụ này, câu lệnh 'with' vừa bắt đầu giao dịch cơ sở dữ liệu vừa thu được khóa luồng

lock = threading.Lock()
với (db_transaction(db), lock) lồng nhau  (con trỏ, đã khóa):
    ...

Cuối cùng, hàm closing() trả về đối số của nó để nó có thể được liên kết với một biến và gọi phương thức .close() của đối số ở cuối khối.

nhập urllib, sys
từ việc đóng nhập ngữ cảnh

với việc đóng(urllib.urlopen('http://www.yahoo.com')) as f:
    cho dòng trong f:
        sys.stdout.write(dòng)

Xem thêm

PEP 343 - Câu lệnh "với"

PEP được viết bởi Guido van Rossum và Nick Coghlan; được thực hiện bởi Mike Bland, Guido van Rossum và Neal Norwitz. Zz002zz hiển thị mã được tạo cho câu lệnh 'with', mã này có thể hữu ích trong việc tìm hiểu cách hoạt động của câu lệnh.

Tài liệu dành cho mô-đun contextlib.

PEP 366: Nhập tương đối rõ ràng từ mô-đun chính

Công tắc -m của Python cho phép chạy mô-đun dưới dạng tập lệnh. Khi bạn chạy một mô-đun nằm bên trong một gói, quá trình nhập tương đối không hoạt động chính xác.

Bản sửa lỗi cho Python 2.6 thêm thuộc tính module.__package__. Khi có thuộc tính này, việc nhập tương đối sẽ liên quan đến giá trị của thuộc tính này thay vì thuộc tính __name__.

Sau đó, các nhà nhập kiểu PEP 302 có thể đặt __package__ nếu cần. Mô-đun runpy triển khai bộ chuyển đổi -m hiện thực hiện việc này, do đó, quá trình nhập tương đối giờ đây sẽ hoạt động chính xác trong các tập lệnh chạy từ bên trong một gói.

PEP 370: Thư mục site-packages cho mỗi người dùng

Khi bạn chạy Python, đường dẫn tìm kiếm mô-đun sys.path thường bao gồm một thư mục có đường dẫn kết thúc bằng "site-packages". Thư mục này nhằm mục đích chứa các gói được cài đặt cục bộ có sẵn cho tất cả người dùng sử dụng máy hoặc cài đặt trang web cụ thể.

Python 2.6 giới thiệu quy ước cho các thư mục trang web dành riêng cho người dùng. Thư mục khác nhau tùy thuộc vào nền tảng:

  • Unix và Mac OS X: ~/.local/

  • Windows: %APPDATA%/Python

Trong thư mục này, sẽ có các thư mục con dành riêng cho phiên bản, chẳng hạn như lib/python2.6/site-packages trên Unix/Mac OS và Python26/site-packages trên Windows.

Nếu bạn không thích thư mục mặc định, nó có thể bị ghi đè bởi một biến môi trường. PYTHONUSERBASE đặt thư mục gốc được sử dụng cho tất cả các phiên bản Python hỗ trợ tính năng này. Trên Windows, thư mục dành cho dữ liệu dành riêng cho ứng dụng có thể được thay đổi bằng cách đặt biến môi trường APPDATA. Bạn cũng có thể sửa đổi tệp site.py để cài đặt Python.

Tính năng này có thể bị tắt hoàn toàn bằng cách chạy Python với tùy chọn -s hoặc đặt biến môi trường PYTHONNOUSERSITE.

Xem thêm

PEP 370 - Thư mục site-packages cho mỗi người dùng

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

PEP 371: Gói multiprocessing

Gói multiprocessing mới cho phép các chương trình Python tạo các quy trình mới sẽ thực hiện tính toán và trả về kết quả cho cấp độ gốc. Các tiến trình cha và con có thể giao tiếp bằng cách sử dụng hàng đợi và đường ống, đồng bộ hóa các hoạt động của chúng bằng cách sử dụng khóa và ngữ nghĩa, đồng thời có thể chia sẻ các mảng dữ liệu đơn giản.

Mô-đun multiprocessing bắt đầu như một mô phỏng chính xác của mô-đun threading bằng cách sử dụng các tiến trình thay vì các luồng. Mục tiêu đó đã bị loại bỏ trong quá trình chuyển sang Python 2.6, nhưng cách tiếp cận chung của mô-đun vẫn tương tự. Lớp cơ bản là Process, được truyền một đối tượng có thể gọi được và một tập hợp các đối số. Phương thức start() thiết lập phương thức có thể gọi đang chạy trong một quy trình con, sau đó bạn có thể gọi phương thức is_alive() để kiểm tra xem quy trình con đó có còn chạy hay không và phương thức join() để đợi quá trình thoát ra.

Đây là một ví dụ đơn giản trong đó quy trình con sẽ tính giai thừa. Hàm thực hiện phép tính được viết một cách kỳ lạ nên sẽ mất nhiều thời gian hơn đáng kể khi đối số đầu vào là bội số của 4.

thời gian nhập khẩu
từ quá trình nhập đa xử , hàng đợi


giai thừa def (hàng đợi, N):
    "Tính giai thừa."
    # If N là bội số của 4, chức năng này sẽ mất nhiều thời gian hơn.
    nếu (N% 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate kết quả
    thực tế = 1L
    cho i trong phạm vi (1, N+1):
        sự thật = sự thật * tôi

    # Put kết quả trên hàng đợi
    queue.put(thực tế)

nếu __name__ == '__main__':
    hàng đợi = Hàng đợi()

    N = 5

    p = Quá trình(đích=giai thừa, args=(hàng đợi, N))
    p.start()
    p.join()

    kết quả = queue.get()
    in 'Giai thừa', N, '=', kết quả

Một Queue được sử dụng để truyền đạt kết quả của giai thừa. Đối tượng Queue được lưu trữ trong một biến toàn cục. Tiến trình con sẽ sử dụng giá trị của biến khi tiến trình con được tạo; vì là Queue nên cha mẹ và con cái có thể sử dụng đối tượng này để liên lạc. (Nếu cha thay đổi giá trị của biến toàn cục thì giá trị của biến con sẽ không bị ảnh hưởng và ngược lại.)

Hai lớp khác, PoolManager, cung cấp giao diện cấp cao hơn. Pool sẽ tạo một số quy trình công nhân cố định và sau đó các yêu cầu có thể được phân phối đến các công nhân bằng cách gọi apply() hoặc apply_async() để thêm một yêu cầu duy nhất và map() hoặc map_async() để thêm một số yêu cầu. Đoạn mã sau sử dụng Pool để phân tán các yêu cầu trên 5 quy trình công nhân và truy xuất danh sách kết quả:

từ nhóm nhập đa xử 

giai thừa def(N, từ điển):
    "Tính giai thừa."
    ...
p = Nhóm (5)
kết quả = p.map(giai thừa, phạm vi (1, 1000, 10))
cho v trong kết quả:
    in v

Điều này tạo ra đầu ra sau:

1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...

Giao diện cấp cao khác, lớp Manager, tạo ra một quy trình máy chủ riêng biệt có thể chứa các bản sao chính của cấu trúc dữ liệu Python. Các quy trình khác sau đó có thể truy cập và sửa đổi các cấu trúc dữ liệu này bằng các đối tượng proxy. Ví dụ sau tạo một từ điển dùng chung bằng cách gọi phương thức dict(); công nhân xử lý sau đó chèn các giá trị vào từ điển. (Việc khóa không được thực hiện tự động cho bạn, điều này không quan trọng trong ví dụ này. Các phương thức của Manager cũng bao gồm Lock(), RLock()Semaphore() để tạo khóa chung.)

thời gian nhập khẩu
từ nhóm nhập đa xử , Trình quản 

giai thừa def(N, từ điển):
    "Tính giai thừa."
    # Calculate kết quả
    thực tế = 1L
    cho i trong phạm vi (1, N+1):
        sự thật = sự thật * tôi

    kết quả # Store trong từ điển
    từ điển [N] = sự thật

nếu __name__ == '__main__':
    p = Nhóm (5)
    mgr = Người quản ()
    d = mgr.dict() # Create từ điển chia sẻ

    nhiệm vụ # Run sử dụng nhóm
    cho N trong phạm vi (1, 1000, 10):
        p.apply_async(giai thừa, (N, d))

    Nhóm # Mark đã đóng -- không thể thêm nhiệm vụ nào nữa.
    p.close()

    # Wait để thoát nhiệm vụ
    p.join()

    kết quả # Output
    cho k, v trong được sắp xếp(d.items()):
        in k, v

Điều này sẽ tạo ra đầu ra:

1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...

Xem thêm

Tài liệu dành cho mô-đun multiprocessing.

PEP 371 - Bổ sung gói đa xử lý

PEP được viết bởi Jesse Noller và Richard Oudkerk; được thực hiện bởi Richard Oudkerk và Jesse Noller.

PEP 3101: Định dạng chuỗi nâng cao

Trong Python 3.0, toán tử % được bổ sung bằng phương thức định dạng chuỗi mạnh hơn, format(). Hỗ trợ cho phương thức str.format() đã được chuyển sang Python 2.6.

Trong 2.6, cả chuỗi 8 bit và chuỗi Unicode đều có phương thức .format() coi chuỗi đó là mẫu và lấy các đối số để định dạng. Mẫu định dạng sử dụng dấu ngoặc nhọn ({, }) làm ký tự đặc biệt:

>>> # Substitute đối số vị trí 0 vào chuỗi.
>>> "ID người dùng: {0}".format("root")
'ID người dùng: root'
>>> # Use các đối số từ khóa được đặt tên
>>> "ID người dùng: {uid} Nhìn thấy lần cuối: {last_login}".format(
... uid="root",
... Last_login = "5 tháng 3 năm 2008 07:20")
'ID người dùng: root Nhìn thấy lần cuối: ngày 5 tháng 3 năm 2008 07:20'

Dấu ngoặc nhọn có thể được thoát bằng cách nhân đôi chúng

>>> "Lệnh trống: {{}}".format()
"Dòng lệnh trống: {}"

Tên trường có thể là số nguyên biểu thị các đối số vị trí, chẳng hạn như {0}, {1}, v.v. hoặc tên của các đối số từ khóa. Bạn cũng có thể cung cấp tên trường ghép để đọc thuộc tính hoặc truy cập khóa từ điển

>>> nhập hệ thống
>>> print 'Nền tảng: {0.platform}\nPhiên bản Python: {0.version}'.format(sys)
Nền tảng: Darwin
Phiên bản Python: 2.6a1+ (trunk:61261M, ngày 5 tháng 3 năm 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. bản dựng 5367)]'

>>> nhập  phỏng
>>> 'Loại nội dung: {0[.mp4]}'.format(mimetypes.types_map)
'Loại nội dung: video/mp4'

Lưu ý rằng khi sử dụng ký hiệu kiểu từ điển chẳng hạn như [.mp4], bạn không cần đặt bất kỳ dấu ngoặc kép nào quanh chuỗi; nó sẽ tra cứu giá trị bằng cách sử dụng .mp4 làm khóa. Chuỗi bắt đầu bằng số sẽ được chuyển thành số nguyên. Bạn không thể viết các biểu thức phức tạp hơn bên trong một chuỗi định dạng.

Cho đến nay chúng ta đã chỉ ra cách chỉ định trường nào sẽ thay thế vào chuỗi kết quả. Định dạng chính xác được sử dụng cũng có thể được kiểm soát bằng cách thêm dấu hai chấm theo sau là bộ xác định định dạng. Ví dụ:

>>> # Field 0: căn lề trái, pad 15 ký tự
>>> # Field 1: căn lề phải, pad 6 ký tự
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Đăng ký', 35)
'Đăng ký $ 35'
>>> fmt.format('Hướng dẫn', 50)
'Hướng dẫn $50'
>>> fmt.format('Tiệc', 125)
'Tiệc 125$'

Trình xác định định dạng có thể tham chiếu các trường khác thông qua lồng nhau

>>> fmt = '{0:{1}}'
>>> chiều rộng = 15
>>> fmt.format('Hóa đơn #1234', chiều rộng)
'Hóa đơn #1234'
>>> chiều rộng = 35
>>> fmt.format('Hóa đơn #1234', chiều rộng)
'Hóa đơn #1234'

Có thể chỉ định căn chỉnh của một trường trong chiều rộng mong muốn:

nhân vật

Hiệu ứng

< (mặc định)

Căn trái

>

Căn phải

^

trung tâm

=

(Chỉ dành cho loại số) Đệm sau dấu.

Bộ xác định định dạng cũng có thể bao gồm loại bản trình bày, loại này kiểm soát cách định dạng giá trị. Ví dụ: số dấu phẩy động có thể được định dạng dưới dạng số tổng quát hoặc theo ký hiệu hàm mũ:

>>> '{0:g}'.format(3.75)
'3,75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'

Một loạt các loại trình bày có sẵn. Tham khảo tài liệu 2.6 cho complete list; đây là một mẫu:

b

Nhị phân. Xuất ra số ở cơ số 2.

c

Nhân vật. Chuyển đổi số nguyên thành ký tự Unicode tương ứng trước khi in.

d

Số nguyên thập phân. Xuất ra số trong cơ số 10.

o

Định dạng bát phân. Xuất ra số trong cơ số 8.

x

Định dạng hex. Xuất ra số trong cơ số 16, sử dụng chữ cái viết thường cho các chữ số trên 9.

e

Ký hiệu số mũ. In số theo ký hiệu khoa học sử dụng chữ 'e' để biểu thị số mũ.

g

Định dạng chung. Điều này in số dưới dạng số điểm cố định, trừ khi số quá lớn, trong trường hợp đó, nó sẽ chuyển sang ký hiệu số mũ 'e'.

n

Số. Điều này giống như 'g' (đối với số float) hoặc 'd' (đối với số nguyên), ngoại trừ việc nó sử dụng cài đặt ngôn ngữ hiện tại để chèn các ký tự phân tách số thích hợp.

%

Tỷ lệ phần trăm. Nhân số với 100 và hiển thị ở định dạng cố định ('f'), theo sau là dấu phần trăm.

Các lớp và kiểu có thể định nghĩa phương thức __format__() để kiểm soát cách chúng được định dạng. Nó nhận được một đối số duy nhất, bộ xác định định dạng:

def __format__(tự, format_spec):
    nếu isinstance(format_spec, unicode):
        trả về unicode(str(self))
    khác:
        trả về str(tự)

Ngoài ra còn có một phần dựng sẵn format() sẽ định dạng một giá trị duy nhất. Nó gọi phương thức __format__() của loại với mã xác định được cung cấp:

>>> định dạng(75.6564, '.2f')
'75,66'

Xem thêm

Cú pháp định dạng chuỗi

Tài liệu tham khảo cho các trường định dạng.

PEP 3101 - Định dạng chuỗi nâng cao

PEP được viết bởi Talin. Được thực hiện bởi Eric Smith.

PEP 3105: print Là một chức năng

Câu lệnh print trở thành hàm print() trong Python 3.0. Việc biến print() thành một hàm giúp bạn có thể thay thế hàm đó bằng cách thực hiện def print(...) hoặc nhập một hàm mới từ một nơi khác.

Python 2.6 có tính năng nhập __future__ loại bỏ print dưới dạng cú pháp ngôn ngữ, thay vào đó cho phép bạn sử dụng dạng hàm. Ví dụ:

>>> từ __future__ nhập print_function
>>> print('# ofentry', len(dictionary), file=sys.stderr)

Chữ ký của hàm mới là:

def print(*args, sep=' ', end='\n', file=None)

Các thông số là:

  • args: đối số vị trí có giá trị sẽ được in ra.

  • sep: dấu phân cách, sẽ được in giữa các đối số.

  • end: văn bản kết thúc, sẽ được in sau khi tất cả các đối số được xuất ra.

  • file: đối tượng tệp mà đầu ra sẽ được gửi tới.

Xem thêm

PEP 3105 - Biến chức năng in thành một chức năng

PEP được viết bởi Georg Brandl.

PEP 3110: Thay đổi xử lý ngoại lệ

Một lỗi mà các lập trình viên Python thỉnh thoảng mắc phải là viết đoạn mã sau:

thử:
    ...
ngoại trừ TypeError, ValueError: # Wrong!
    ...

Tác giả có thể đang cố gắng nắm bắt cả hai ngoại lệ TypeErrorValueError, nhưng mã này thực sự làm điều gì đó khác biệt: nó sẽ bắt TypeError và liên kết đối tượng ngoại lệ thu được với tên cục bộ "ValueError". Ngoại lệ ValueError sẽ không bị bắt. Mã đúng chỉ định một bộ ngoại lệ:

thử:
    ...
ngoại trừ (TypeError, ValueError):
    ...

Lỗi này xảy ra do việc sử dụng dấu phẩy ở đây không rõ ràng: nó chỉ ra hai nút khác nhau trong cây phân tích cú pháp hay một nút duy nhất là một bộ dữ liệu?

Python 3.0 làm cho điều này trở nên rõ ràng bằng cách thay thế dấu phẩy bằng từ "as". Để bắt một ngoại lệ và lưu trữ đối tượng ngoại lệ trong biến exc, bạn phải viết:

thử:
    ...
ngoại trừ TypeError dưới dạng exec:
    ...

Python 3.0 sẽ chỉ hỗ trợ việc sử dụng "as" và do đó diễn giải ví dụ đầu tiên là bắt được hai ngoại lệ khác nhau. Python 2.6 hỗ trợ cả dấu phẩy và "as", vì vậy mã hiện có sẽ tiếp tục hoạt động. Do đó, chúng tôi khuyên bạn nên sử dụng "as" khi viết mã Python mới sẽ chỉ được thực thi với 2.6.

Xem thêm

PEP 3110 - Bắt ngoại lệ trong Python 3000

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

PEP 3112: Chữ Byte

Python 3.0 sử dụng Unicode làm loại chuỗi cơ bản của ngôn ngữ và biểu thị các chữ 8 bit khác nhau, dưới dạng b'string' hoặc sử dụng hàm tạo bytes. Để tương thích trong tương lai, Python 2.6 thêm bytes làm từ đồng nghĩa với loại str và nó cũng hỗ trợ ký hiệu b''.

Loại str 2.6 khác với loại bytes của 3.0 theo nhiều cách khác nhau; đáng chú ý nhất là hàm tạo hoàn toàn khác. Trong 3.0, bytes([65, 66, 67]) dài 3 phần tử, chứa các byte biểu thị ABC; trong 2.6, bytes([65, 66, 67]) trả về chuỗi 12 byte đại diện cho str() của danh sách.

Công dụng chính của bytes trong 2.6 sẽ là viết các bài kiểm tra loại đối tượng, chẳng hạn như isinstance(x, bytes). Điều này sẽ giúp ích cho bộ chuyển đổi 2to3, bộ chuyển đổi này không thể biết liệu mã 2.x có dự định chuỗi chứa ký tự hay byte 8 bit hay không; bây giờ bạn có thể sử dụng bytes hoặc str để thể hiện chính xác ý định của mình và mã kết quả cũng sẽ chính xác trong Python 3.0.

Ngoài ra còn có một thao tác nhập __future__ khiến tất cả các chuỗi ký tự đều trở thành chuỗi Unicode. Điều này có nghĩa là các chuỗi thoát \u có thể được sử dụng để bao gồm các ký tự Unicode:

từ __future__ nhập unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

in (các) len # 12 Ký tự Unicode

Ở cấp độ C, Python 3.0 sẽ đổi tên loại chuỗi 8 bit hiện có, được gọi là PyStringObject trong Python 2.x, thành PyBytesObject. Python 2.6 sử dụng #define để hỗ trợ sử dụng các tên PyBytesObject(), PyBytes_Check(), PyBytes_FromStringAndSize() cũng như tất cả các hàm và macro khác được sử dụng với chuỗi.

Các phiên bản của loại bytes là bất biến giống như các chuỗi. Loại bytearray mới lưu trữ một chuỗi byte có thể thay đổi

>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>>b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>>b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'

Mảng byte hỗ trợ hầu hết các phương thức của loại chuỗi, chẳng hạn như startswith()/endswith(), find()/rfind() và một số phương thức của danh sách, chẳng hạn như append(), pop()reverse().

>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>>b
bytearray(b'ABCde')

Ngoài ra còn có C API tương ứng, với PyByteArray_FromObject(), PyByteArray_FromStringAndSize() và nhiều chức năng khác.

Xem thêm

PEP 3112 - Byte bằng chữ trong Python 3000

PEP được viết bởi Jason Orendorff; được Christian Heimes chuyển về phiên bản 2.6.

PEP 3116: Thư viện I/O mới

Các đối tượng tệp dựng sẵn của Python hỗ trợ một số phương thức, nhưng các đối tượng giống tệp không nhất thiết phải hỗ trợ tất cả các phương thức đó. Các đối tượng bắt chước tệp thường hỗ trợ read()write(), nhưng chúng có thể không hỗ trợ readline() chẳng hạn. Python 3.0 giới thiệu thư viện I/O phân lớp trong mô-đun io giúp tách biệt các tính năng xử lý đệm và xử lý văn bản khỏi các hoạt động đọc và ghi cơ bản.

Có ba cấp độ lớp cơ sở trừu tượng được cung cấp bởi mô-đun io:

  • RawIOBase định nghĩa các hoạt động I/O thô: read(), readinto(), write(), seek(), tell(), truncate()close(). Hầu hết các phương thức của lớp này thường sẽ ánh xạ tới một lệnh gọi hệ thống duy nhất. Ngoài ra còn có các phương thức readable(), writable()seekable() để xác định những hoạt động mà một đối tượng nhất định sẽ cho phép.

    Python 3.0 có các triển khai cụ thể của lớp này cho các tệp và ổ cắm, nhưng Python 2.6 chưa cơ cấu lại các đối tượng tệp và ổ cắm của nó theo cách này.

  • BufferedIOBase là một lớp cơ sở trừu tượng đệm dữ liệu trong bộ nhớ để giảm số lượng lệnh gọi hệ thống được sử dụng, giúp quá trình xử lý I/O hiệu quả hơn. Nó hỗ trợ tất cả các phương thức của RawIOBase và thêm thuộc tính raw giữ đối tượng thô bên dưới.

    Có năm lớp cụ thể triển khai ABC này. BufferedWriterBufferedReader dành cho các đối tượng hỗ trợ việc sử dụng chỉ ghi hoặc chỉ đọc có phương thức seek() để truy cập ngẫu nhiên. Các đối tượng BufferedRandom hỗ trợ quyền truy cập đọc và ghi trên cùng một luồng cơ bản và BufferedRWPair dành cho các đối tượng như TTY có cả thao tác đọc và ghi hoạt động trên các luồng dữ liệu không được kết nối. Lớp BytesIO hỗ trợ đọc, viết và tìm kiếm trên bộ đệm trong bộ nhớ.

  • TextIOBase: Cung cấp các chức năng đọc và ghi chuỗi (hãy nhớ, chuỗi sẽ là Unicode trong Python 3.0) và hỗ trợ universal newlines. TextIOBase định nghĩa phương thức readline() và hỗ trợ lặp lại các đối tượng.

    Có hai cách triển khai cụ thể. TextIOWrapper bao bọc một đối tượng I/O được đệm, hỗ trợ tất cả các phương thức cho I/O văn bản và thêm thuộc tính buffer để truy cập vào đối tượng cơ bản. StringIO chỉ đơn giản là đệm mọi thứ vào bộ nhớ mà không cần ghi bất cứ thứ gì vào đĩa.

    (Trong Python 2.6, io.StringIO được triển khai bằng Python thuần túy, vì vậy nó khá chậm. Do đó, bây giờ bạn nên sử dụng mô-đun StringIO hoặc cStringIO hiện có. Tại một thời điểm nào đó, mô-đun io của Python 3.0 sẽ được viết lại thành C để đảm bảo tốc độ và có lẽ việc triển khai C sẽ được chuyển ngược sang bản phát hành 2.x.)

Trong Python 2.6, các triển khai cơ bản chưa được cơ cấu lại để xây dựng dựa trên các lớp của mô-đun io. Mô-đun này được cung cấp để giúp việc viết mã tương thích chuyển tiếp với 3.0 trở nên dễ dàng hơn và giúp các nhà phát triển tiết kiệm công sức viết các triển khai bộ đệm và I/O văn bản của riêng họ.

Xem thêm

PEP 3116 - I/O mới

PEP được viết bởi Daniel Stutzbach, Mike Verdone và Guido van Rossum. Mã của Guido van Rossum, Georg Brandl, Walter Doerwald, Jeremy Hylton, Martin von Löwis, Tony Lownds và những người khác.

PEP 3118: Giao thức bộ đệm được sửa đổi

Giao thức bộ đệm là API cấp C cho phép các kiểu Python trao đổi con trỏ thành các biểu diễn bên trong của chúng. Ví dụ: một tệp được ánh xạ bộ nhớ có thể được xem dưới dạng bộ đệm các ký tự và điều này cho phép một mô-đun khác, chẳng hạn như re xử lý các tệp được ánh xạ bộ nhớ dưới dạng một chuỗi ký tự cần tìm kiếm.

Người dùng chính của giao thức bộ đệm là các gói xử lý số như NumPy, hiển thị biểu diễn bên trong của mảng để người gọi có thể ghi dữ liệu trực tiếp vào một mảng thay vì phải chuyển qua API chậm hơn. Zz001zz này cập nhật giao thức bộ đệm dựa trên kinh nghiệm phát triển NumPy, bổ sung một số tính năng mới như chỉ ra hình dạng của một mảng hoặc khóa một vùng bộ nhớ.

Hàm C API mới quan trọng nhất là PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags), hàm này nhận một đối tượng và một bộ cờ rồi điền vào cấu trúc Py_buffer thông tin về biểu diễn bộ nhớ của đối tượng. Các đối tượng có thể sử dụng thao tác này để khóa bộ nhớ tại chỗ trong khi trình gọi bên ngoài có thể sửa đổi nội dung, do đó, có PyBuffer_Release(Py_buffer *view) tương ứng để cho biết rằng trình gọi bên ngoài đã hoàn tất.

Đối số flags của PyObject_GetBuffer() chỉ định các ràng buộc đối với bộ nhớ được trả về. Một số ví dụ là:

  • PyBUF_WRITABLE chỉ ra rằng bộ nhớ phải có khả năng ghi.

  • PyBUF_LOCK yêu cầu khóa chỉ đọc hoặc khóa độc quyền trên bộ nhớ.

  • PyBUF_C_CONTIGUOUSPyBUF_F_CONTIGUOUS yêu cầu bố cục mảng C-liền kề (thứ nguyên cuối cùng thay đổi nhanh nhất) hoặc Fortran-liền kề (thứ nguyên đầu tiên thay đổi nhanh nhất).

Hai mã đối số mới cho PyArg_ParseTuple(), s*z*, trả về các đối tượng bộ đệm bị khóa cho một tham số.

Xem thêm

PEP 3118 - Sửa đổi giao thức bộ đệm

PEP được viết bởi Travis Oliphant và Carl Banks; được thực hiện bởi Travis Oliphant.

PEP 3119: Lớp cơ sở trừu tượng

Một số ngôn ngữ hướng đối tượng như Java hỗ trợ giao diện, khai báo rằng một lớp có một tập hợp các phương thức nhất định hoặc hỗ trợ một giao thức truy cập nhất định. Các lớp cơ sở trừu tượng (hoặc ABC) là một tính năng tương đương với Python. Hỗ trợ ABC bao gồm một mô-đun abc chứa siêu dữ liệu có tên là ABCMeta, xử lý đặc biệt siêu dữ liệu này bằng các nội dung isinstance()issubclass() và một tập hợp các ABC cơ bản mà các nhà phát triển Python cho rằng sẽ hữu ích rộng rãi. Các phiên bản tương lai của Python có thể sẽ bổ sung thêm nhiều ABC hơn.

Giả sử bạn có một lớp cụ thể và muốn biết liệu nó có hỗ trợ truy cập kiểu từ điển hay không. Tuy nhiên, cụm từ "kiểu từ điển" khá mơ hồ. Điều đó có thể có nghĩa là việc truy cập các mục bằng obj[1] sẽ hoạt động. Điều đó có nghĩa là việc cài đặt các mục bằng obj[2] = value có hoạt động không? Hoặc đối tượng đó sẽ có các phương thức keys(), values()items()? Còn các biến thể lặp lại như iterkeys() thì sao? copy()update()? Lặp lại đối tượng bằng iter()?

Mô-đun Python 2.6 collections bao gồm một số ABC khác nhau thể hiện những khác biệt này. Iterable chỉ ra rằng một lớp định nghĩa __iter__()Container có nghĩa là lớp đó định nghĩa một phương thức __contains__() và do đó hỗ trợ các biểu thức x in y. Giao diện từ điển cơ bản về nhận vật phẩm, thiết lập vật phẩm và keys(), values()items(), được xác định bởi MutableMapping ABC.

Bạn có thể lấy các lớp của riêng mình từ một ABC cụ thể để cho biết chúng hỗ trợ giao diện của ABC đó

nhập khẩu bộ sưu tập

Lớp lưu trữ (bộ sưu tập.MutableMapping):
    ...

Ngoài ra, bạn có thể viết lớp mà không bắt nguồn từ ABC mong muốn và thay vào đó hãy đăng ký lớp bằng cách gọi phương thức register() của ABC:

nhập khẩu bộ sưu tập

lớp lưu trữ:
    ...

bộ sưu tập.MutableMapping.register(Storage)

Đối với các lớp bạn viết, việc lấy từ ABC có lẽ rõ ràng hơn. Phương thức register() rất hữu ích khi bạn viết một ABC mới có thể mô tả một kiểu hoặc lớp hiện có hoặc nếu bạn muốn khai báo rằng một số lớp bên thứ ba triển khai một ABC. Ví dụ: nếu bạn đã xác định PrintableType ABC thì việc làm đó là hợp pháp:

# Register Các loại của Python
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)

Các lớp phải tuân theo ngữ nghĩa được chỉ định bởi ABC, nhưng Python không thể kiểm tra điều này; tùy thuộc vào tác giả lớp để hiểu các yêu cầu của ABC và triển khai mã tương ứng.

Để kiểm tra xem một đối tượng có hỗ trợ một giao diện cụ thể hay không, bây giờ bạn có thể viết:

chức năng xác định (d):
    nếu không phải  isinstance(d, Collection.MutableMapping):
        raise ValueError("Đối tượng ánh xạ được mong đợi, không phải %r" % d)

Đừng cảm thấy rằng bây giờ bạn phải bắt đầu viết nhiều tờ séc như trong ví dụ trên. Python có truyền thống mạnh mẽ về kiểu gõ vịt, trong đó việc kiểm tra kiểu rõ ràng không bao giờ được thực hiện và mã chỉ đơn giản gọi các phương thức trên một đối tượng, tin tưởng rằng các phương thức đó sẽ ở đó và đưa ra một ngoại lệ nếu không có. Hãy thận trọng trong việc kiểm tra ABC và chỉ thực hiện khi thực sự cần thiết.

Bạn có thể viết ABC của riêng mình bằng cách sử dụng abc.ABCMeta làm siêu dữ liệu trong định nghĩa lớp

từ abc nhập ABCMeta, phương pháp trừu tượng

lớp  thể vẽ():
    __metaclass__ = ABCMeta

    @abstractmethod
    def draw(self, x, y, value=1.0):
        vượt qua

    def draw_doubled(self, x, y):
        self.draw(x, y, tỉ lệ=2.0)


lớp Square ( thể vẽ):
    def draw(self, x, y,scale):
        ...

Trong Drawable ABC ở trên, phương thức draw_doubled() hiển thị đối tượng có kích thước gấp đôi kích thước của nó và có thể được triển khai theo các phương thức khác được mô tả trong Drawable. Do đó, các lớp triển khai ABC này không cần cung cấp triển khai draw_doubled() của riêng chúng, mặc dù chúng có thể làm như vậy. Tuy nhiên, việc triển khai draw() là cần thiết; ABC không thể cung cấp cách triển khai chung hữu ích.

Bạn có thể áp dụng trình trang trí @~abc.abstractmethod cho các phương thức như draw() phải được triển khai; Python sau đó sẽ đưa ra một ngoại lệ cho các lớp không xác định phương thức. Lưu ý rằng ngoại lệ chỉ xuất hiện khi bạn thực sự cố gắng tạo một phiên bản của lớp con thiếu phương thức:

>>> Vòng tròn lớp ( thể vẽ được):
... vượt qua
...
>>> c = Vòng tròn()
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
TypeError: Không thể khởi tạo Vòng tròn lớp trừu tượng bằng các phương thức trừu tượng vẽ
>>>

Các thuộc tính dữ liệu trừu tượng có thể được khai báo bằng cách sử dụng trình trang trí @abstractproperty

từ abc nhập thuộc tính trừu tượng
...

@abstractproperty
def chỉ đọc (tự):
   tự trả về._x

Các lớp con sau đó phải xác định thuộc tính readonly.

Xem thêm

PEP 3119 - Giới thiệu các lớp cơ sở trừu tượng

PEP được viết bởi Guido van Rossum và Talin. Được thực hiện bởi Guido van Rossum. Được chuyển về phiên bản 2.6 bởi Benjamin Aranguren, với Alex Martelli.

PEP 3127: Cú pháp và hỗ trợ chữ số nguyên

Python 3.0 thay đổi cú pháp cho các chữ số nguyên bát phân (cơ số 8), thêm tiền tố "0o" hoặc "0O" thay vì số 0 đứng đầu và thêm hỗ trợ cho các chữ số nguyên nhị phân (cơ số 2), được báo hiệu bằng tiền tố "0b" hoặc "0B".

Python 2.6 không bỏ hỗ trợ cho số 0 đứng đầu báo hiệu số bát phân, nhưng nó có thêm hỗ trợ cho "0o" và "0b":

>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47

Nội dung oct() vẫn trả về các số có tiền tố là số 0 đứng đầu và nội dung bin() mới trả về biểu diễn nhị phân cho một số

>>> tháng 10(42)
'052'
>>> Future_buildins.oct(42)
'0o52'
>>> thùng(173)
'0b10101101'

Nội trang int()long() hiện sẽ chấp nhận tiền tố "0o" và "0b" khi base-8 hoặc base-2 được yêu cầu hoặc khi đối số base bằng 0 (báo hiệu rằng cơ sở được sử dụng phải được xác định từ chuỗi):

>>> int('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13

Xem thêm

PEP 3127 - Cú pháp và hỗ trợ chữ số nguyên

PEP được viết bởi Patrick Maupin; được Eric Smith chuyển về phiên bản 2.6.

PEP 3129: Trang trí lớp học

Trình trang trí đã được mở rộng từ chức năng đến lớp học. Bây giờ nó là hợp pháp để viết:

@foo
@bar
lớp A:
  vượt qua

Điều này tương đương với:

lớp A:
  vượt qua

A = foo(bar(A))

Xem thêm

PEP 3129 - Trang trí lớp học

PEP được viết bởi Collin Winter.

PEP 3141: Hệ thống phân cấp loại cho số

Python 3.0 bổ sung thêm một số lớp cơ sở trừu tượng cho các kiểu số lấy cảm hứng từ tháp số của Đề án. Các lớp này đã được chuyển về phiên bản 2.6 dưới dạng mô-đun numbers.

ABC chung nhất là Number. Nó không xác định bất kỳ hoạt động nào cả và chỉ tồn tại để cho phép kiểm tra xem một đối tượng có phải là số hay không bằng cách thực hiện isinstance(obj, Number).

Complex là một lớp con của Number. Số phức có thể trải qua các phép toán cơ bản như cộng, trừ, nhân, chia và lũy thừa, đồng thời bạn có thể truy xuất phần thực và phần ảo và thu được liên hợp của một số. Kiểu phức tạp tích hợp của Python là một triển khai của Complex.

Real còn bắt nguồn từ Complex và thêm các phép toán chỉ hoạt động trên số thực: floor(), trunc(), làm tròn, lấy phần dư mod N, chia tầng và so sánh.

Số Rational bắt nguồn từ Real, có thuộc tính numeratordenominator và có thể được chuyển đổi thành số float. Python 2.6 thêm một lớp số hữu tỉ đơn giản, Fraction, trong mô-đun fractions. (Nó được gọi là Fraction thay vì Rational để tránh trùng tên với numbers.Rational.)

Các số Integral xuất phát từ Rational và có thể được dịch chuyển sang trái và phải bằng <<>>, kết hợp bằng các phép toán theo bit như &|, đồng thời có thể được sử dụng làm chỉ mục mảng và ranh giới lát cắt.

Trong Python 3.0, PEP định nghĩa lại một chút các nội dung hiện có round(), math.floor(), math.ceil() và thêm một nội dung mới, math.trunc(), đã được chuyển sang Python 2.6. math.trunc() làm tròn về 0, trả về Integral gần nhất nằm giữa đối số của hàm và 0.

Xem thêm

PEP 3141 - Hệ thống phân cấp kiểu cho số

PEP được viết bởi Jeffrey Yasskin.

Scheme's numerical tower, từ hướng dẫn sử dụng Guile.

Scheme's number datatypes từ đặc tả Lược đồ R5RS.

Mô-đun fractions

Để điền vào hệ thống phân cấp của các loại số, mô-đun fractions cung cấp một lớp số hữu tỷ. Các số hữu tỷ lưu trữ các giá trị của chúng dưới dạng tử số và mẫu số tạo thành một phân số và có thể biểu thị chính xác các số như 2/3 mà các số dấu phẩy động chỉ có thể gần đúng.

Hàm tạo Fraction lấy hai giá trị Integral sẽ là tử số và mẫu số của phân số kết quả.

>>> từ phân số nhập Phân số
>>> a = Phân số(2, 3)
>>> b = Phân số(2, 5)
>>> phao(a), float(b)
(0,66666666666666663, 0,40000000000000002)
>>> a+b
Phân số(16, 15)
>>> a/b
Phân số(5, 3)

Để chuyển đổi số dấu phẩy động thành số hữu tỉ, kiểu float hiện có phương thức as_integer_ratio() trả về tử số và mẫu số cho một phân số có cùng giá trị dấu phẩy động:

>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)

Lưu ý rằng các giá trị chỉ có thể xấp xỉ bằng số dấu phẩy động, chẳng hạn như 1./3, không được đơn giản hóa thành số được xấp xỉ; phân số cố gắng khớp với giá trị dấu phẩy động exactly.

Mô-đun fractions dựa trên sự triển khai của Sjoerd Mullender đã có trong thư mục Demo/classes/ của Python trong một thời gian dài. Việc triển khai này đã được Jeffrey Yasskin cập nhật đáng kể.

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à:

  • Giờ đây, các thư mục và kho lưu trữ zip chứa tệp __main__.py có thể được thực thi trực tiếp bằng cách chuyển tên của chúng cho trình thông dịch. Thư mục hoặc kho lưu trữ zip được tự động chèn làm mục nhập đầu tiên trong sys.path. (Đề xuất và bản vá ban đầu của Andy Chu, sau đó được sửa đổi bởi Phillip J. Eby và Nick Coghlan; bpo-1739468.)

  • Hàm hasattr() đang phát hiện và bỏ qua tất cả các lỗi, với giả định rằng chúng có nghĩa là phương thức __getattr__() bị lỗi bằng cách nào đó và giá trị trả về của hasattr() sẽ là False. Tuy nhiên, logic này không nên áp dụng cho KeyboardInterruptSystemExit; Python 2.6 sẽ không còn loại bỏ các ngoại lệ như vậy khi hasattr() gặp chúng nữa. (Đã sửa bởi Benjamin Peterson; bpo-2196.)

  • Khi gọi một hàm bằng cú pháp ** để cung cấp các đối số từ khóa, bạn không còn cần phải sử dụng từ điển Python nữa; mọi ánh xạ bây giờ sẽ hoạt động

    >>> def f(**kw):
    ... in được sắp xếp(kw)
    ...
    >>> ud=UserDict.UserDict()
    >>> ud['a'] = 1
    >>> ud['b'] = 'chuỗi'
    >>> f(**ud)
    ['a', 'b']
    

    (Được đóng góp bởi Alexander Belopolsky; bpo-1686487.)

    Việc cung cấp đối số từ khóa sau đối số *args cho lệnh gọi hàm cũng trở thành hợp pháp.

    >>> def f(*args, **kw):
    ... in args, kw
    ...
    >>> f(1,2,3, *(4,5,6), từ khóa=13)
    (1, 2, 3, 4, 5, 6) {'từ khóa': 13}
    

    Trước đây đây có thể là lỗi cú pháp. (Được đóng góp bởi Amaury Forgeot d'Arc; bpo-3473.)

  • Một nội dung mới, next(iterator, [default]) trả về mục tiếp theo từ trình vòng lặp được chỉ định. Nếu đối số default được cung cấp, nó sẽ được trả về nếu iterator đã cạn kiệt; nếu không, ngoại lệ StopIteration sẽ được nâng lên. (Được chuyển ngược lại trong bpo-2719.)

  • Các bộ dữ liệu hiện có các phương thức index()count() khớp với các phương thức index()count() của loại danh sách:

    >>> t = (0,1,2,3,4,0,1,2)
    >>> t.index(3)
    3
    >>> t.count(0)
    2
    

    (Đóng góp bởi Raymond Hettinger)

  • Các loại tích hợp hiện đã hỗ trợ cải tiến cho cú pháp cắt mở rộng, chấp nhận các kết hợp khác nhau của (start, stop, step). Trước đây, sự hỗ trợ chỉ là một phần và một số trường hợp ở góc sẽ không hoạt động. (Được thực hiện bởi Thomas Wouters.)

  • Các thuộc tính hiện có ba thuộc tính, getter, setterdeleter, là các thuộc tính trang trí cung cấp các phím tắt hữu ích để thêm hàm getter, setter hoặc deleter vào thuộc tính hiện có. Bạn sẽ sử dụng chúng như thế này:

    lớp C (đối tượng):
        @property
        def x(tự):
            tự trả về._x
    
        @x.setter
        def x(tự, giá trị):
            self._x = giá trị
    
        @x.deleter
        def x(tự):
            del self._x
    
    lớp D (C):
        @C.x.getter
        def x(tự):
            tự trả về._x * 2
    
        @x.setter
        def x(tự, giá trị):
            self._x = giá trị / 2
    
  • Một số phương pháp của các loại tập hợp tích hợp hiện chấp nhận nhiều lần lặp: intersection(), intersection_update(), union(), update(), difference()difference_update().

    >>> s=set('1234567890')
    >>> s.intersection('abc123', 'cdf246') # Intersection giữa tất cả các đầu vào
    đặt(['2'])
    >>> s.difference('246', '789')
    set(['1', '0', '3', '5'])
    

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

  • Nhiều tính năng dấu phẩy động đã được thêm vào. Hàm float() bây giờ sẽ biến chuỗi nan thành giá trị IEEE 754 Not A Number và +inf-inf thành vô cực dương hoặc âm. Điều này hoạt động trên mọi nền tảng với ngữ nghĩa IEEE 754. (Được đóng góp bởi Christian Heimes; bpo-1635.)

    Các hàm khác trong mô-đun math, isinf()isnan(), trả về true nếu đối số dấu phẩy động của chúng là vô hạn hoặc Không phải là Số. (bpo-1640)

    Các hàm chuyển đổi đã được thêm vào để chuyển đổi số dấu phẩy động thành chuỗi thập lục phân (bpo-3008). Các hàm này chuyển đổi số float sang và từ một biểu diễn chuỗi mà không gây ra lỗi làm tròn từ việc chuyển đổi giữa số thập phân và số nhị phân. Float có phương thức hex() trả về một biểu diễn chuỗi và phương thức float.fromhex() chuyển đổi một chuỗi trở lại thành số

    >>> a = 3,75
    >>> a.hex()
    '0x1.e000000000000p+1'
    >>> float.fromhex('0x1.e0000000000000p+1')
    3,75
    >>> b=1./3
    >>> b.hex()
    '0x1.5555555555555p-2'
    
  • Một điểm thú vị về số: khi tạo một số phức từ hai số float trên các hệ thống hỗ trợ các số 0 có dấu (-0 và +0), hàm tạo complex() giờ đây sẽ giữ nguyên dấu của số 0. (Đã sửa bởi Mark T. Dickinson; bpo-1507.)

  • Các lớp kế thừa phương thức __hash__() từ lớp cha có thể đặt __hash__ = None để chỉ ra rằng lớp đó không thể băm được. Điều này sẽ khiến hash(obj) tăng TypeError và lớp sẽ không được chỉ định là đang triển khai Hashable ABC.

    Bạn nên thực hiện việc này khi đã xác định phương thức __cmp__() hoặc __eq__() để so sánh các đối tượng theo giá trị của chúng thay vì theo danh tính. Tất cả các đối tượng đều có phương thức băm mặc định sử dụng id(obj) làm giá trị băm. Không có cách nào rõ ràng để loại bỏ phương thức __hash__() được kế thừa từ lớp cha, vì vậy việc gán None được triển khai dưới dạng ghi đè. Ở cấp độ C, tiện ích mở rộng có thể đặt tp_hash thành PyObject_HashNotImplemented(). (Đã được sửa bởi Nick Coghlan và Amaury Forgeot d'Arc; bpo-2235.)

  • Ngoại lệ GeneratorExit hiện phân lớp BaseException thay vì Exception. Điều này có nghĩa là trình xử lý ngoại lệ thực hiện except Exception: sẽ không vô tình bắt được GeneratorExit. (Được đóng góp bởi Chad Austin; bpo-1537.)

  • Các đối tượng trình tạo hiện có thuộc tính gi_code đề cập đến đối tượng mã gốc hỗ trợ trình tạo. (Được đóng góp bởi Collin Winter; bpo-1473257.)

  • Hàm tích hợp compile() hiện chấp nhận các đối số từ khóa cũng như các tham số vị trí. (Được đóng góp bởi Thomas Wouters; bpo-1444529.)

  • Hàm tạo complex() hiện chấp nhận các chuỗi chứa số phức được đặt trong ngoặc đơn, nghĩa là complex(repr(cplx)) bây giờ sẽ có giá trị khứ hồi. Ví dụ: complex('(3+4j)') hiện trả về giá trị (3+4j). (bpo-1491866)

  • Phương thức chuỗi translate() hiện chấp nhận None làm tham số bảng dịch, được coi là phép biến đổi nhận dạng. Điều này giúp việc thực hiện các thao tác chỉ xóa ký tự trở nên dễ dàng hơn. (Được đóng góp bởi Bengt Richter và được thực hiện bởi Raymond Hettinger; bpo-1193128.)

  • Hàm dir() tích hợp hiện kiểm tra phương thức __dir__() trên các đối tượng mà nó nhận được. Phương thức này phải trả về danh sách các chuỗi chứa tên của các thuộc tính hợp lệ cho đối tượng và cho phép đối tượng kiểm soát giá trị mà dir() tạo ra. Các đối tượng có phương thức __getattr__() hoặc __getattribute__() có thể sử dụng điều này để quảng cáo các thuộc tính giả mà chúng sẽ tôn trọng. (bpo-1591665)

  • Các đối tượng phương thức thực thể có các thuộc tính mới cho đối tượng và hàm bao gồm phương thức đó; từ đồng nghĩa mới của im_self__self__im_func cũng có sẵn dưới dạng __func__. Các tên cũ vẫn được hỗ trợ trong Python 2.6 nhưng không còn ở phiên bản 3.0.

  • Một thay đổi khó hiểu: khi bạn sử dụng hàm locals() bên trong câu lệnh class, từ điển kết quả không còn trả về các biến tự do nữa. (Trong trường hợp này, các biến miễn phí là các biến được tham chiếu trong câu lệnh class không phải là thuộc tính của lớp.)

Tối ưu hóa

  • Mô-đun warnings đã được viết lại bằng C. Điều này giúp có thể gọi cảnh báo từ trình phân tích cú pháp và cũng có thể giúp trình thông dịch khởi động nhanh hơn. (Được đóng góp bởi Neal Norwitz và Brett Cannon; bpo-1631171.)

  • Các đối tượng loại hiện có một bộ nhớ đệm các phương thức có thể giảm bớt công việc cần thiết để tìm cách triển khai phương thức chính xác cho một lớp cụ thể; Sau khi được lưu vào bộ nhớ đệm, trình thông dịch không cần duyệt qua các lớp cơ sở để tìm ra phương thức phù hợp để gọi. Bộ đệm sẽ bị xóa nếu một lớp cơ sở hoặc chính lớp đó bị sửa đổi, do đó bộ đệm sẽ vẫn chính xác ngay cả khi đối mặt với bản chất động của Python. (Tối ưu hóa ban đầu do Armin Rigo triển khai, được Kevin Jacobs cập nhật cho Python 2.6; bpo-1700288.)

    Theo mặc định, thay đổi này chỉ được áp dụng cho các loại có trong lõi Python. Các mô-đun mở rộng có thể không nhất thiết phải tương thích với bộ đệm này, vì vậy chúng phải thêm Py_TPFLAGS_HAVE_VERSION_TAG một cách rõ ràng vào trường tp_flags của mô-đun để kích hoạt bộ đệm phương thức. (Để tương thích với bộ đệm phương thức, mã của mô-đun mở rộng không được truy cập và sửa đổi trực tiếp thành viên tp_dict của bất kỳ loại nào mà nó triển khai. Hầu hết các mô-đun không làm điều này, nhưng trình thông dịch Python không thể xác định điều đó. Xem bpo-1878 để biết một số cuộc thảo luận.)

  • Các lệnh gọi hàm sử dụng đối số từ khóa sẽ nhanh hơn đáng kể bằng cách thực hiện so sánh con trỏ nhanh, thường tiết kiệm thời gian so sánh chuỗi đầy đủ. (Được đóng góp bởi Raymond Hettinger, sau lần triển khai đầu tiên của Antoine Pitrou; bpo-1819.)

  • Tất cả các chức năng trong mô-đun struct đã được viết lại bằng C nhờ hoạt động ở phần chạy nước rút Need For Speed. (Được đóng góp bởi Raymond Hettinger.)

  • Một số loại tích hợp tiêu chuẩn hiện được đặt một chút trong đối tượng loại của chúng. Điều này tăng tốc độ kiểm tra xem một đối tượng có phải là lớp con của một trong các loại này hay không. (Được đóng góp bởi Neal Norwitz.)

  • Chuỗi Unicode giờ đây sử dụng mã nhanh hơn để phát hiện khoảng trắng và ngắt dòng; điều này tăng tốc phương pháp split() lên khoảng 25% và splitlines() lên 35%. (Được đóng góp bởi Antoine Pitrou.) Việc sử dụng bộ nhớ được giảm bớt bằng cách sử dụng pymalloc cho dữ liệu của chuỗi Unicode.

  • Câu lệnh with hiện lưu trữ phương thức __exit__() trên ngăn xếp, tạo ra một sự tăng tốc nhỏ. (Được thực hiện bởi Jeffrey Yasskin.)

  • Để giảm mức sử dụng bộ nhớ, trình thu gom rác giờ đây sẽ xóa danh sách trống nội bộ khi thu thập rác ở thế hệ đối tượng cao nhất. Điều này có thể trả lại bộ nhớ cho hệ điều hành sớm hơn.

Thay đổi thông dịch viên

Hai tùy chọn dòng lệnh đã được dành riêng để sử dụng cho các triển khai Python khác. Công tắc -J đã được Jython dành riêng để sử dụng cho các tùy chọn dành riêng cho Jython, chẳng hạn như các công tắc được chuyển đến JVM cơ bản. -X đã được dành riêng cho các tùy chọn dành riêng cho việc triển khai Python cụ thể như CPython, Jython hoặc IronPython. Nếu một trong hai tùy chọn được sử dụng với Python 2.6, trình thông dịch sẽ báo cáo rằng tùy chọn đó hiện không được sử dụng.

Giờ đây, bạn có thể ngăn Python ghi các tệp .pyc hoặc .pyo bằng cách cung cấp khóa chuyển -B cho trình thông dịch Python hoặc bằng cách đặt biến môi trường PYTHONDONTWRITEBYTECODE trước khi chạy trình thông dịch. Cài đặt này có sẵn cho các chương trình Python dưới dạng biến sys.dont_write_bytecode và mã Python có thể thay đổi giá trị để sửa đổi hành vi của trình thông dịch. (Được đóng góp bởi Neal Norwitz và Georg Brandl.)

Bạn có thể chỉ định mã hóa được sử dụng cho đầu vào, đầu ra và lỗi tiêu chuẩn bằng cách đặt biến môi trường PYTHONIOENCODING trước khi chạy trình thông dịch. Giá trị phải là một chuỗi ở dạng <encoding> hoặc <encoding>:<errorhandler>. Phần encoding chỉ định tên của mã hóa, ví dụ: utf-8 hoặc latin-1; phần errorhandler tùy chọn chỉ định những việc cần làm với các ký tự không thể xử lý bằng mã hóa và phải là một trong các "lỗi", "bỏ qua" hoặc "thay thế". (Được đóng góp bởi Martin von Löwis.)

Các mô-đun mới và cải tiến

Như trong mọi bản phát hành, thư viện chuẩn của Python đã nhận được một số cải tiến và sửa lỗi. Đây là danh sách một phần những thay đổi đáng chú ý nhất, được sắp xếp theo thứ tự bảng chữ cái theo tên mô-đun. Tham khảo tệp Misc/NEWS trong cây nguồn để có danh sách thay đổi đầy đủ hơn hoặc xem qua nhật ký Subversion để biết tất cả chi tiết.

  • Các mô-đun asyncoreasynchat đang được tích cực bảo trì trở lại và một số bản vá và sửa lỗi đã được áp dụng. (Được duy trì bởi Josiah Carlson; xem bpo-1736190 để biết một bản vá.)

  • Mô-đun bsddb cũng có người bảo trì mới, Jesús Cea Avión và gói này hiện có sẵn dưới dạng gói độc lập. Trang web của gói này là www.jcea.es/programacion/pybsddb.htm. Kế hoạch là xóa gói khỏi thư viện chuẩn trong Python 3.0, vì tốc độ phát hành của nó thường xuyên hơn nhiều so với Python.

    Mô-đun bsddb.dbshelve hiện sử dụng giao thức tẩy cao nhất hiện có, thay vì tự giới hạn ở giao thức 1. (Được đóng góp bởi W. Barnes.)

  • Mô-đun cgi bây giờ sẽ đọc các biến từ chuỗi truy vấn của yêu cầu HTTP POST. Điều này giúp bạn có thể sử dụng các tác vụ biểu mẫu với các URL bao gồm các chuỗi truy vấn, chẳng hạn như "/cgi-bin/add.py?category=1". (Được đóng góp bởi Alexandre Fiori và Nubis; bpo-1817.)

    Các chức năng parse_qs()parse_qsl() đã được chuyển từ mô-đun cgi sang mô-đun urlparse. Các phiên bản vẫn có sẵn trong mô-đun cgi sẽ kích hoạt thông báo PendingDeprecationWarning ở phiên bản 2.6 (bpo-600362).

  • Mô-đun cmath đã trải qua quá trình sửa đổi rộng rãi, do Mark Dickinson và Christian Heimes đóng góp. Năm chức năng mới đã được thêm vào:

    • polar() chuyển đổi số phức thành dạng cực, trả về mô đun và đối số của số phức.

    • rect() làm ngược lại, biến một mô đun, cặp đối số trở lại số phức tương ứng.

    • phase() trả về đối số (còn gọi là góc) của một số phức.

    • isnan() trả về True nếu phần thực hoặc phần ảo của đối số của nó là NaN.

    • isinf() trả về True nếu phần thực hoặc phần ảo của đối số của nó là vô hạn.

    Các bản sửa đổi cũng cải thiện độ ổn định về mặt số học của mô-đun cmath. Đối với tất cả các hàm, phần thực và phần ảo của kết quả đều chính xác trong một vài đơn vị có độ chính xác thấp nhất (ulps) bất cứ khi nào có thể. Xem bpo-1381 để biết chi tiết. Việc cắt nhánh cho asinh(), atanh(): và atan() cũng đã được sửa.

    Các thử nghiệm cho mô-đun đã được mở rộng đáng kể; gần 2000 trường hợp thử nghiệm mới thực hiện các hàm đại số.

    Trên nền tảng IEEE 754, mô-đun cmath hiện xử lý các giá trị đặc biệt của IEEE 754 và các ngoại lệ dấu phẩy động theo cách phù hợp với Phụ lục 'G' của tiêu chuẩn C99.

  • Kiểu dữ liệu mới trong mô-đun collections: namedtuple(typename, fieldnames) là một hàm xuất xưởng tạo ra các lớp con của bộ dữ liệu tiêu chuẩn có các trường có thể truy cập được theo tên cũng như chỉ mục. Ví dụ:

    >>> var_type = bộ sưu tập.namedtuple('biến',
    ... 'kích thước loại tên id')
    >>> # Names được phân tách bằng dấu cách hoặc dấu phẩy.
    >>> # 'id, name, type, size' cũng dùng được.
    >>> var_type._fields
    ('id', 'tên', 'loại', 'kích thước')
    
    >>> var = var_type(1, 'tần số', 'int', 4)
    >>> in var[0], var.id # Equivalent
    1 1
    >>> in var[2], var.type # Equivalent
    int int
    >>> var._asdict()
    {'size': 4, 'type': 'int', 'id': 1, 'name': 'tần số'}
    >>> v2 = var._replace(name='biên độ')
    >>> v2
    biến(id=1, name='biên độ', type='int', size=4)
    

    Một số vị trí trong thư viện tiêu chuẩn trả về các bộ dữ liệu đã được sửa đổi để trả về các phiên bản namedtuple(). Ví dụ: phương thức Decimal.as_tuple() hiện trả về một bộ dữ liệu có tên với các trường sign, digitsexponent.

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

  • Một thay đổi khác đối với mô-đun collections là loại deque hiện hỗ trợ tham số maxlen tùy chọn; nếu được cung cấp, kích thước của deque sẽ bị giới hạn ở không quá các mục maxlen. Việc thêm nhiều mục hơn vào một deque đầy đủ sẽ khiến các mục cũ bị loại bỏ.

    >>> từ deque nhập bộ sưu tập
    >>> dq=deque(maxlen=3)
    >>> dq
    deque([], maxlen=3)
    >>> dq.append(1); dq.append(2); dq.append(3)
    >>> dq
    deque([1, 2, 3], maxlen=3)
    >>> dq.append(4)
    >>> dq
    deque([2, 3, 4], maxlen=3)
    

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

  • Các đối tượng Morsel của mô-đun Cookie hiện hỗ trợ thuộc tính httponly. Trong một số trình duyệt. cookie có bộ thuộc tính này không thể được truy cập hoặc thao tác bằng mã JavaScript. (Được đóng góp bởi Arvin Schnell; bpo-1638033.)

  • Một phương thức cửa sổ mới trong mô-đun curses, chgat(), thay đổi thuộc tính hiển thị cho một số ký tự nhất định trên một dòng. (Được đóng góp bởi Fabian Kreutz.)

    văn bản # Boldface bắt đầu từ y=0,x=21
    # and ảnh hưởng đến phần còn lại của dòng.
    stdscr.chgat(0, 21, Curs.A_BOLD)
    

    Lớp Textbox trong mô-đun curses.textpad hiện hỗ trợ chỉnh sửa ở chế độ chèn cũng như chế độ ghi đè. Chế độ chèn được bật bằng cách cung cấp giá trị thực cho tham số insert_mode khi tạo phiên bản Textbox.

  • Các phương thức strftime() của mô-đun datetime hiện hỗ trợ mã định dạng %f mở rộng đến số micro giây trong đối tượng, được đệm 0 ở bên trái đến sáu vị trí. (Được đóng góp bởi Skip Montanaro; bpo-1158.)

  • Mô-đun decimal đã được cập nhật lên phiên bản 1.66 của the General Decimal Specification. Các tính năng mới bao gồm một số phương pháp cho một số hàm toán học cơ bản như exp()log10():

    >>> Số thập phân(1).exp()
    Thập phân ("2.718281828459045235360287471")
    >>> Thập phân("2.7182818").ln()
    Thập phân ("0,9999999895305022877376682436")
    >>> Số thập phân(1000).log10()
    Thập phân("3")
    

    Phương thức as_tuple() của các đối tượng Decimal hiện trả về một bộ dữ liệu có tên với các trường sign, digitsexponent.

    (Được thực hiện bởi Facundo Batista và Mark Dickinson. Hỗ trợ bộ dữ liệu được đặt tên được bổ sung bởi Raymond Hettinger.)

  • Lớp SequenceMatcher của mô-đun difflib hiện trả về các bộ dữ liệu được đặt tên đại diện cho các kết quả khớp, với các thuộc tính a, bsize. (Được đóng góp bởi Raymond Hettinger.)

  • Một tham số timeout tùy chọn, chỉ định thời gian chờ được tính bằng giây, đã được thêm vào hàm tạo của lớp ftplib.FTP cũng như phương thức connect(). (Được thêm bởi Facundo Batista.) Ngoài ra, storbinary()storlines() của lớp FTP hiện có một tham số callback tùy chọn sẽ được gọi với mỗi khối dữ liệu sau khi dữ liệu được gửi. (Được đóng góp bởi Phil Schwartz; bpo-1221598.)

  • Chức năng tích hợp reduce() cũng có sẵn trong mô-đun functools. Trong Python 3.0, nội dung dựng sẵn đã bị loại bỏ và reduce() chỉ khả dụng từ functools; hiện tại không có kế hoạch loại bỏ phần dựng sẵn trong loạt 2.x. (Được vá bởi Christian Heimes; bpo-1739906.)

  • Khi có thể, mô-đun getpass bây giờ sẽ sử dụng /dev/tty để in thông báo nhắc nhở và đọc mật khẩu, quay lại lỗi tiêu chuẩn và đầu vào tiêu chuẩn. Nếu mật khẩu có thể được lặp lại đến thiết bị đầu cuối, một cảnh báo sẽ được in trước khi lời nhắc hiển thị. (Được đóng góp bởi Gregory P. Smith.)

  • Hàm glob.glob() hiện có thể trả về tên tệp Unicode nếu đường dẫn Unicode được sử dụng và tên tệp Unicode khớp trong thư mục. (bpo-1001604)

  • Một hàm mới trong mô-đun heapq, merge(iter1, iter2, ...), nhận bất kỳ số lần lặp nào trả về dữ liệu theo thứ tự được sắp xếp và trả về một trình tạo mới trả về nội dung của tất cả các vòng lặp, cũng theo thứ tự được sắp xếp. Ví dụ:

    >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
    [1, 2, 3, 5, 8, 9, 16]
    

    Một chức năng mới khác, heappushpop(heap, item), đẩy item lên heap, sau đó bật ra và trả về mục nhỏ nhất. Điều này hiệu quả hơn việc thực hiện cuộc gọi tới heappush() và sau đó là heappop().

    heapq hiện được triển khai để chỉ sử dụng so sánh nhỏ hơn, thay vì so sánh nhỏ hơn hoặc bằng mà nó đã sử dụng trước đây. Điều này làm cho việc sử dụng loại của heapq khớp với phương thức list.sort(). (Được đóng góp bởi Raymond Hettinger.)

  • Một tham số timeout tùy chọn, chỉ định thời gian chờ được tính bằng giây, đã được thêm vào hàm tạo của lớp httplib.HTTPConnectionHTTPSConnection. (Được thêm bởi Facundo Batista.)

  • Hầu hết các chức năng của mô-đun inspect, chẳng hạn như getmoduleinfo()getargs(), hiện trả về các bộ dữ liệu được đặt tên. Ngoài việc hoạt động giống như các bộ dữ liệu, các phần tử của giá trị trả về cũng có thể được truy cập dưới dạng thuộc tính. (Được đóng góp bởi Raymond Hettinger.)

    Một số chức năng mới trong mô-đun bao gồm isgenerator(), isgeneratorfunction()isabstract().

  • Mô-đun itertools có thêm một số chức năng mới.

    izip_longest(iter1, iter2, ...[, fillvalue]) tạo các bộ dữ liệu từ mỗi phần tử; nếu một số lần lặp ngắn hơn các lần lặp khác thì các giá trị còn thiếu được đặt thành fillvalue. Ví dụ:

    >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
    ((1, 1), (2, 2), (3, 3), (Không, 4), (Không, 5))
    

    product(iter1, iter2, ..., [repeat=N]) trả về tích Descartes của các lần lặp được cung cấp, một tập hợp các bộ dữ liệu chứa mọi tổ hợp phần tử có thể có được trả về từ mỗi lần lặp.

    >>> list(itertools.product([1,2,3], [4,5,6]))
    [(1, 4), (1, 5), (1, 6),
     (2, 4), (2, 5), (2, 6),
     (3, 4), (3, 5), (3, 6)]
    

    Đối số từ khóa repeat tùy chọn được sử dụng để lấy tích của một lần lặp hoặc một tập hợp các lần lặp với chính chúng, lặp lại N lần. Với một đối số có thể lặp lại duy nhất, các bộ dữ liệu N được trả về

    >>> list(itertools.product([1,2], Repeat=3))
    [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
     (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
    

    Với hai lần lặp, các bộ dữ liệu 2N được trả về.

    >>> list(itertools.product([1,2], [3,4], Repeat=2))
    [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
     (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
     (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
     (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
    

    combinations(iterable, r) trả về các chuỗi con có độ dài r từ các phần tử của iterable.

    >>> danh sách(itertools.combinations('123', 2))
    [('1', '2'), ('1', '3'), ('2', '3')]
    >>> list(itertools.combinations('123', 3))
    [('1', '2', '3')]
    >>> danh sách(itertools.combinations('1234', 3))
    [('1', '2', '3'), ('1', '2', '4'),
     ('1', '3', '4'), ('2', '3', '4')]
    

    permutations(iter[, r]) trả về tất cả các hoán vị có độ dài r của các phần tử của iterable. Nếu r không được chỉ định, nó sẽ mặc định số lượng phần tử được tạo bởi iterable.

    >>> list(itertools.permutations([1,2,3,4], 2))
    [(1, 2), (1, 3), (1, 4),
     (2, 1), (2, 3), (2, 4),
     (3, 1), (3, 2), (3, 4),
     (4, 1), (4, 2), (4, 3)]
    

    itertools.chain(*iterables) là một hàm hiện có trong itertools đã có được hàm tạo mới trong Python 2.6. itertools.chain.from_iterable(iterable) nhận một lần lặp duy nhất sẽ trả về các lần lặp khác. chain() sau đó sẽ trả về tất cả các phần tử của lần lặp đầu tiên, sau đó là tất cả các phần tử của lần lặp thứ hai, v.v.

    >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
    [1, 2, 3, 4, 5, 6]
    

    (Tất cả đều do Raymond Hettinger đóng góp.)

  • Lớp FileHandler của mô-đun logging và các lớp con WatchedFileHandler, RotatingFileHandlerTimedRotatingFileHandler hiện có tham số delay tùy chọn cho hàm tạo của chúng. Nếu delay là đúng, việc mở tệp nhật ký sẽ bị trì hoãn cho đến khi lệnh gọi emit() đầu tiên được thực hiện. (Đóng góp bởi Vinay Sajip.)

    TimedRotatingFileHandler cũng có tham số hàm tạo utc. Nếu đối số là đúng, thời gian UTC sẽ được sử dụng để xác định thời điểm nửa đêm xảy ra và tạo tên tệp; nếu không thì giờ địa phương sẽ được sử dụng.

  • Một số chức năng mới đã được thêm vào mô-đun math:

    • isinf()isnan() xác định xem một float nhất định lần lượt là vô cực (dương hay âm) hay NaN (Không phải số).

    • copysign() sao chép bit dấu của số IEEE 754, trả về giá trị tuyệt đối của x kết hợp với bit dấu của y. Ví dụ: math.copysign(1, -0.0) trả về -1.0. (Được đóng góp bởi Christian Heimes.)

    • factorial() tính giai thừa của một số. (Được đóng góp bởi Raymond Hettinger; bpo-2138.)

    • fsum() cộng dòng số từ một lần lặp và cẩn thận để tránh mất độ chính xác thông qua việc sử dụng tổng một phần. (Được đóng góp bởi Jean Brouwers, Raymond Hettinger và Mark Dickinson; bpo-2819.)

    • acosh(), asinh()atanh() tính toán các hàm hyperbol nghịch đảo.

    • log1p() trả về logarit tự nhiên của 1+x (cơ số e).

    • trunc() làm tròn một số về 0, trả về Integral gần nhất nằm giữa đối số của hàm và 0. Đã thêm như một phần của backport của PEP 3141's type hierarchy for numbers.

  • Mô-đun math đã được cải tiến để mang lại hành vi nhất quán hơn trên các nền tảng, đặc biệt là liên quan đến việc xử lý các ngoại lệ dấu phẩy động và các giá trị đặc biệt của IEEE 754.

    Bất cứ khi nào có thể, mô-đun tuân theo các khuyến nghị của tiêu chuẩn C99 về các giá trị đặc biệt của 754. Ví dụ: sqrt(-1.) hiện sẽ cung cấp ValueError trên hầu hết tất cả các nền tảng, trong khi sqrt(float('NaN')) sẽ trả về NaN trên tất cả các nền tảng IEEE 754. Trong đó Phụ lục 'F' của tiêu chuẩn C99 khuyến nghị gửi tín hiệu 'chia cho 0' hoặc 'không hợp lệ', Python sẽ tăng ValueError. Trong đó Phụ lục 'F' của tiêu chuẩn C99 khuyến nghị báo hiệu 'tràn', Python sẽ tăng OverflowError. (Xem bpo-711019bpo-1640.)

    (Được đóng góp bởi Christian Heimes và Mark Dickinson.)

  • Các đối tượng mmap hiện có phương thức rfind() tìm kiếm chuỗi con bắt đầu ở cuối chuỗi và tìm kiếm ngược lại. Phương thức find() cũng thu được tham số end đưa ra chỉ mục để dừng tìm kiếm. (Được đóng góp bởi John Lenton.)

  • Mô-đun operator có được hàm methodcaller() nhận tên và một bộ đối số tùy chọn, trả về một lệnh gọi có thể gọi hàm được đặt tên trên bất kỳ đối số nào được truyền cho nó. Ví dụ:

    >>> # Equivalent tới lambda s: s.replace('cũ', 'mới')
    >>> thay thế = operator.methodcaller('thay thế', 'cũ', 'mới')
    >>> người thay thế('bình cũ rượu cũ')
    'rượu mới bình mới'
    

    (Được đóng góp bởi Georg Brandl, sau gợi ý của Gregory Petrosyan.)

    Hàm attrgetter() hiện chấp nhận tên có dấu chấm và thực hiện tra cứu thuộc tính tương ứng:

    >>> inst_name = operator.attrgetter(
    ... '__lớp__.__tên__')
    >>> inst_name('')
    'str'
    >>> inst_name(trợ giúp)
    '_Người trợ giúp'
    

    (Được đóng góp bởi Georg Brandl, sau gợi ý của Barry Warsaw.)

  • Mô-đun os hiện bao gồm một số lệnh gọi hệ thống mới. fchmod(fd, mode)fchown(fd, uid, gid) thay đổi chế độ và quyền sở hữu của một tệp đã mở và lchmod(path, mode) thay đổi chế độ của liên kết tượng trưng. (Được đóng góp bởi Georg Brandl và Christian Heimes.)

    chflags()lchflags() là các hàm bao cho các lệnh gọi hệ thống tương ứng (nếu có), thay đổi các cờ được đặt trên một tệp. Các hằng số cho các giá trị cờ được xác định trong mô-đun stat; một số giá trị có thể bao gồm UF_IMMUTABLE để báo hiệu tệp không thể thay đổi và UF_APPEND để cho biết rằng dữ liệu chỉ có thể được thêm vào tệp. (Đóng góp bởi M. Levinson.)

    os.closerange(low, high) đóng tất cả các bộ mô tả tệp từ low đến high một cách hiệu quả, bỏ qua mọi lỗi và không bao gồm chính high. Chức năng này hiện được mô-đun subprocess sử dụng để giúp quá trình khởi động nhanh hơn. (Được đóng góp bởi Georg Brandl; bpo-1663329.)

  • Phương thức clear() của đối tượng os.environ giờ đây sẽ hủy đặt các biến môi trường bằng cách sử dụng os.unsetenv() ngoài việc xóa các khóa của đối tượng. (Được đóng góp bởi Martin Horcicka; bpo-1181.)

  • Hàm os.walk() hiện có tham số followlinks. Nếu được đặt thành True, nó sẽ đi theo các liên kết tượng trưng trỏ đến các thư mục và truy cập nội dung của thư mục. Để tương thích ngược, giá trị mặc định của tham số là sai. Lưu ý rằng hàm có thể rơi vào trạng thái đệ quy vô hạn nếu có một liên kết tượng trưng trỏ đến thư mục mẹ. (bpo-1273829)

  • Trong mô-đun os.path, chức năng splitext() đã được thay đổi để không phân chia các ký tự dấu chấm ở đầu. Điều này tạo ra kết quả tốt hơn khi hoạt động trên các tệp chấm của Unix. Ví dụ: os.path.splitext('.ipython') hiện trả về ('.ipython', '') thay vì ('', '.ipython'). (bpo-1115886)

    Một hàm mới, os.path.relpath(path, start='.'), trả về một đường dẫn tương đối từ đường dẫn start, nếu nó được cung cấp, hoặc từ thư mục làm việc hiện tại tới đích path. (Được đóng góp bởi Richard Barran; bpo-1339796.)

    Trên Windows, os.path.expandvars() hiện sẽ mở rộng các biến môi trường được cung cấp dưới dạng "%var%" và "~user" sẽ được mở rộng sang đường dẫn thư mục chính của người dùng. (Được đóng góp bởi Josiah Carlson; bpo-957650.)

  • Trình gỡ lỗi Python do mô-đun pdb cung cấp đã nhận được lệnh mới: "chạy" khởi động lại chương trình Python đang được gỡ lỗi và có thể tùy ý lấy các đối số dòng lệnh mới cho chương trình. (Được đóng góp bởi Rocky Bernstein; bpo-1393667.)

  • Hàm pdb.post_mortem(), được sử dụng để bắt đầu gỡ lỗi truy nguyên, giờ đây sẽ sử dụng truy nguyên được trả về bởi sys.exc_info() nếu không cung cấp truy nguyên. (Được đóng góp bởi Facundo Batista; bpo-1106316.)

  • Mô-đun pickletools hiện có hàm optimize() nhận vào một chuỗi chứa một phần tử và loại bỏ một số mã opcode không được sử dụng, trả về một phần tử chọn ngắn hơn có chứa cùng cấu trúc dữ liệu. (Được đóng góp bởi Raymond Hettinger.)

  • Hàm get_data() đã được thêm vào mô-đun pkgutil để trả về nội dung của các tệp tài nguyên đi kèm với gói Python đã cài đặt. Ví dụ:

    >>> nhập pkgutil
    >>> in pkgutil.get_data('test', 'Exception_hierarchy.txt')
    Ngoại lệ cơ sở
     +-- Thoát khỏi hệ thống
     +-- Bàn phím bị ngắt
     +-- Máy phát điệnThoát
     +-- Ngoại lệ
          +-- Dừng lại
          +-- Lỗi tiêu chuẩn
     ...
    

    (Được đóng góp bởi Paul Moore; bpo-2439.)

  • Các đối tượng Parser của mô-đun pyexpat hiện cho phép thiết lập thuộc tính buffer_size của chúng để thay đổi kích thước của bộ đệm được sử dụng để chứa dữ liệu ký tự. (Được đóng góp bởi Achim Gaedke; bpo-1137.)

  • Mô-đun Queue hiện cung cấp các biến thể hàng đợi truy xuất các mục theo thứ tự khác nhau. Lớp PriorityQueue lưu trữ các mục được xếp hàng đợi thành một đống và truy xuất chúng theo thứ tự ưu tiên, đồng thời LifoQueue truy xuất các mục được thêm gần đây nhất trước tiên, nghĩa là nó hoạt động giống như một ngăn xếp. (Được đóng góp bởi Raymond Hettinger.)

  • Các đối tượng Random của mô-đun random hiện có thể được chọn trên hệ thống 32 bit và được giải nén trên hệ thống 64 bit và ngược lại. Thật không may, thay đổi này cũng có nghĩa là không thể giải nén chính xác các đối tượng Random của Python 2.6 trên các phiên bản Python trước đó. (Được đóng góp bởi Shawn Ligocki; bpo-1727780.)

    Hàm triangular(low, high, mode) mới trả về các số ngẫu nhiên theo phân bố tam giác. Các giá trị được trả về nằm trong khoảng từ low đến high, không bao gồm chính high và với mode là giá trị xuất hiện thường xuyên nhất trong phân bố. (Được đóng góp bởi Wladmir van der Laan và Raymond Hettinger; bpo-1681432.)

  • Các tìm kiếm biểu thức chính quy dài do mô-đun re thực hiện sẽ kiểm tra các tín hiệu được gửi đi, do đó giờ đây các tìm kiếm tốn thời gian có thể bị gián đoạn. (Được đóng góp bởi Josh Hoyt và Ralf Schmitt; bpo-846388.)

    Mô-đun biểu thức chính quy được triển khai bằng cách biên dịch mã byte cho một máy ảo nhỏ dành riêng cho biểu thức chính quy. Mã không đáng tin cậy có thể trực tiếp tạo ra các chuỗi mã byte độc ​​hại và gây ra sự cố, vì vậy Python 2.6 bao gồm một trình xác minh cho mã byte biểu thức chính quy. (Được đóng góp bởi Guido van Rossum từ công việc cho Google App Engine; bpo-3487.)

  • Phương thức Completer.complete() của mô-đun rlcompleter giờ đây sẽ bỏ qua các ngoại lệ được kích hoạt trong khi đánh giá tên. (Đã sửa bởi Lorenz Quack; bpo-2250.)

  • Các phiên bản scheduler của mô-đun sched hiện có thuộc tính queue chỉ đọc trả về nội dung của hàng đợi của bộ lập lịch, được biểu thị dưới dạng danh sách các bộ dữ liệu có tên với các trường (time, priority, action, argument). (Được đóng góp bởi Raymond Hettinger; bpo-1861.)

  • Mô-đun select hiện có các chức năng bao bọc cho các lệnh gọi hệ thống epoll() và BSD kqueue() của Linux. phương thức modify() đã được thêm vào các đối tượng poll hiện có; pollobj.modify(fd, eventmask) lấy một bộ mô tả tệp hoặc đối tượng tệp và mặt nạ sự kiện, sửa đổi mặt nạ sự kiện đã ghi cho tệp đó. (Được đóng góp bởi Christian Heimes; bpo-1657.)

  • Hàm shutil.copytree() hiện có đối số ignore tùy chọn nhận đối tượng có thể gọi được. Lệnh gọi này sẽ nhận từng đường dẫn thư mục và danh sách nội dung của thư mục, đồng thời trả về danh sách các tên sẽ bị bỏ qua, không được sao chép.

    Mô-đun shutil cũng cung cấp chức năng ignore_patterns() để sử dụng với tham số mới này. ignore_patterns() lấy một số lượng mẫu kiểu toàn cầu tùy ý và trả về một lệnh có thể gọi được sẽ bỏ qua mọi tệp và thư mục khớp với bất kỳ mẫu nào trong số này. Ví dụ sau sao chép cây thư mục nhưng bỏ qua cả thư mục .svn và tệp sao lưu Emacs có tên kết thúc bằng '~':

    Shutil.copytree('Doc/library', '/tmp/library',
                    bỏ qua=shutil.ignore_patterns('*~', '.svn'))
    

    (Được đóng góp bởi Tarek Ziadé; bpo-2663.)

  • Việc tích hợp xử lý tín hiệu với các vòng sự kiện xử lý GUI giống như các vòng lặp được Tkinter hoặc GTk+ sử dụng từ lâu đã là một vấn đề; hầu hết phần mềm đều kết thúc việc bỏ phiếu, đánh thức từng phần của giây để kiểm tra xem có sự kiện GUI nào xảy ra hay không. Mô-đun signal hiện có thể thực hiện việc này hiệu quả hơn. Việc gọi signal.set_wakeup_fd(fd) sẽ đặt một bộ mô tả tệp sẽ được sử dụng; khi nhận được tín hiệu, một byte sẽ được ghi vào bộ mô tả tệp đó. Ngoài ra còn có chức năng cấp C, PySignal_SetWakeupFd(), để thiết lập bộ mô tả.

    Các vòng lặp sự kiện sẽ sử dụng điều này bằng cách mở một ống để tạo hai bộ mô tả, một để đọc và một để viết. Bộ mô tả có thể ghi sẽ được chuyển đến set_wakeup_fd() và bộ mô tả có thể đọc được sẽ được thêm vào danh sách các bộ mô tả được giám sát bởi vòng lặp sự kiện thông qua select() hoặc poll(). Khi nhận được tín hiệu, một byte sẽ được ghi và vòng lặp sự kiện chính sẽ được đánh thức, tránh phải thăm dò ý kiến.

    (Được đóng góp bởi Adam Olsen; bpo-1583.)

    Hàm siginterrupt() hiện có sẵn từ mã Python và cho phép thay đổi xem tín hiệu có thể làm gián đoạn cuộc gọi hệ thống hay không. (Được đóng góp bởi Ralf Schmitt.)

    Các chức năng setitimer()getitimer() cũng đã được thêm vào (nếu có). setitimer() cho phép cài đặt bộ định thời khoảng thời gian sẽ khiến tín hiệu được gửi đến quy trình sau một thời gian xác định, được đo bằng thời gian trên đồng hồ treo tường, thời gian xử lý đã tiêu thụ hoặc thời gian kết hợp của quy trình+hệ thống. (Được đóng góp bởi Guilherme Polo; bpo-2240.)

  • Mô-đun smtplib hiện hỗ trợ SMTP thay vì SSL nhờ bổ sung lớp SMTP_SSL. Lớp này hỗ trợ giao diện giống hệt với lớp SMTP hiện có. (Được đóng góp bởi Monty Taylor.) Cả hai hàm tạo của lớp cũng có tham số timeout tùy chọn chỉ định thời gian chờ cho lần thử kết nối ban đầu, được tính bằng giây. (Được đóng góp bởi Facundo Batista.)

    Việc triển khai giao thức LMTP (RFC 2033) cũng đã được thêm vào mô-đun. LMTP được sử dụng thay cho SMTP khi chuyển e-mail giữa các tổng đài viên không quản lý hàng đợi thư. (LMTP do Leif Hedstrom thực hiện; bpo-957003.)

    SMTP.starttls() hiện tuân thủ RFC 3207 và quên mọi kiến thức thu được từ máy chủ không thu được từ chính quá trình đàm phán TLS. (Bản vá do Bill Fenner đóng góp; bpo-829951.)

  • Mô-đun socket hiện hỗ trợ TIPC (https://tipc.sourceforge.net/), một giao thức không dựa trên IP hiệu suất cao được thiết kế để sử dụng trong môi trường phân cụm. Địa chỉ TIPC là 4 hoặc 5 bộ dữ liệu. (Được đóng góp bởi Alberto Bertogli; bpo-1646.)

    Một hàm mới, create_connection(), nhận một địa chỉ và kết nối với nó bằng giá trị thời gian chờ tùy chọn, trả về đối tượng ổ cắm được kết nối. Chức năng này cũng tra cứu loại địa chỉ và kết nối với địa chỉ đó bằng IPv4 hoặc IPv6 nếu thích hợp. Việc thay đổi mã của bạn để sử dụng create_connection() thay vì socket(socket.AF_INET, ...) có thể là tất cả những gì cần thiết để mã của bạn hoạt động với IPv6.

  • Các lớp cơ sở trong mô-đun SocketServer hiện hỗ trợ gọi phương thức handle_timeout() sau một khoảng thời gian không hoạt động được chỉ định bởi thuộc tính timeout của máy chủ. (Được đóng góp bởi Michael Pomraning.) Phương pháp serve_forever() hiện có khoảng thời gian thăm dò tùy chọn được tính bằng giây, kiểm soát tần suất máy chủ sẽ kiểm tra yêu cầu tắt máy. (Được đóng góp bởi Pedro Werneck và Jeffrey Yasskin; bpo-742598, bpo-1193577.)

  • Mô-đun sqlite3 do Gerhard Häring duy trì đã được cập nhật từ phiên bản 2.3.2 trong Python 2.5 lên phiên bản 2.4.1.

  • Mô-đun struct hiện hỗ trợ loại C99 _Bool, sử dụng ký tự định dạng '?'. (Được đóng góp bởi David Remahl.)

  • Các đối tượng Popen do mô-đun subprocess cung cấp hiện có các phương thức terminate(), kill()send_signal(). Trên Windows, send_signal() chỉ hỗ trợ tín hiệu SIGTERM và tất cả các phương thức này đều là bí danh cho hàm Win32 API TerminateProcess(). (Được đóng góp bởi Christian Heimes.)

  • Một biến mới trong mô-đun sys, float_info, là một đối tượng chứa thông tin lấy từ tệp float.h về hỗ trợ dấu phẩy động của nền tảng. Các thuộc tính của đối tượng này bao gồm mant_dig (số chữ số trong phần định trị), epsilon (sự khác biệt nhỏ nhất giữa 1.0 và giá trị lớn nhất tiếp theo có thể biểu thị) và một số khác. (Được đóng góp bởi Christian Heimes; bpo-1534.)

    Một biến mới khác, dont_write_bytecode, kiểm soát xem Python có ghi bất kỳ tệp .pyc hoặc .pyo nào khi nhập mô-đun hay không. Nếu biến này đúng thì các tệp đã biên dịch sẽ không được ghi. Biến ban đầu được đặt khi khởi động bằng cách cung cấp khóa chuyển -B cho trình thông dịch Python hoặc bằng cách đặt biến môi trường PYTHONDONTWRITEBYTECODE trước khi chạy trình thông dịch. Mã Python sau đó có thể thay đổi giá trị của biến này để kiểm soát xem các tệp mã byte có được ghi hay không. (Được đóng góp bởi Neal Norwitz và Georg Brandl.)

    Thông tin về các đối số dòng lệnh được cung cấp cho trình thông dịch Python có sẵn bằng cách đọc các thuộc tính của một bộ dữ liệu có tên có sẵn dưới dạng sys.flags. Ví dụ: thuộc tính verbose là đúng nếu Python được thực thi ở chế độ dài dòng, debug là đúng ở chế độ gỡ lỗi, v.v. Các thuộc tính này đều ở chế độ chỉ đọc. (Được đóng góp bởi Christian Heimes.)

    Một hàm mới, getsizeof(), lấy một đối tượng Python và trả về lượng bộ nhớ mà đối tượng đó sử dụng, được đo bằng byte. Các đối tượng tích hợp trả về kết quả chính xác; tiện ích mở rộng của bên thứ ba có thể không, nhưng có thể xác định phương thức __sizeof__() để trả về kích thước của đối tượng. (Được đóng góp bởi Robert Schuppenies; bpo-2898.)

    Giờ đây, bạn có thể xác định các chức năng theo dõi và phân tích hồ sơ hiện tại bằng cách gọi sys.getprofile()sys.gettrace(). (Được đóng góp bởi Georg Brandl; bpo-1648.)

  • Mô-đun tarfile hiện hỗ trợ các tệp tar POSIX.1-2001 (pax) ngoài các định dạng tar POSIX.1-1988 (ustar) và GNU đã được hỗ trợ. Định dạng mặc định là GNU tar; chỉ định tham số format để mở tệp bằng định dạng khác

    tar = tarfile.open("output.tar", "w",
                       định dạng=tarfile.PAX_FORMAT)
    

    Các tham số encodingerrors mới chỉ định một sơ đồ mã hóa và xử lý lỗi để chuyển đổi ký tự. 'strict', 'ignore''replace' là ba cách tiêu chuẩn mà Python có thể xử lý lỗi; 'utf-8' là một giá trị đặc biệt thay thế các ký tự xấu bằng đại diện UTF-8 của chúng. (Chuyển đổi ký tự xảy ra do định dạng PAX hỗ trợ tên tệp Unicode, mặc định là mã hóa UTF-8.)

    Phương thức TarFile.add() hiện chấp nhận đối số exclude, đây là một hàm có thể được sử dụng để loại trừ một số tên tệp nhất định khỏi kho lưu trữ. Hàm phải lấy tên tệp và trả về true nếu tệp cần bị loại trừ hoặc sai nếu tệp cần được lưu trữ. Hàm này được áp dụng cho cả tên ban đầu được chuyển tới add() và tên của các tệp trong các thư mục được thêm đệ quy.

    (Tất cả những thay đổi được đóng góp bởi Lars Gustäbel).

  • Một tham số timeout tùy chọn đã được thêm vào hàm tạo của lớp telnetlib.Telnet, chỉ định thời gian chờ được tính bằng giây. (Được thêm bởi Facundo Batista.)

  • Lớp tempfile.NamedTemporaryFile thường xóa tệp tạm thời mà nó tạo khi đóng tệp. Hiện tại, hành vi này có thể được thay đổi bằng cách chuyển delete=False cho hàm tạo. (Được đóng góp bởi Damien Miller; bpo-1537850.)

    Một lớp mới, SpooledTemporaryFile, hoạt động giống như một tệp tạm thời nhưng lưu trữ dữ liệu của nó trong bộ nhớ cho đến khi vượt quá kích thước tối đa. Khi đạt đến giới hạn đó, nội dung sẽ được ghi vào tệp tạm thời trên đĩa. (Được đóng góp bởi Dustin J. Mitchell.)

    Các lớp NamedTemporaryFileSpooledTemporaryFile đều hoạt động như trình quản lý bối cảnh, vì vậy bạn có thể viết with tempfile.NamedTemporaryFile() as tmp: .... (Được đóng góp bởi Alexander Belopolsky; bpo-2021.)

  • Mô-đun test.test_support có một số trình quản lý bối cảnh hữu ích cho việc viết bài kiểm tra. EnvironmentVarGuard() là trình quản lý bối cảnh giúp thay đổi tạm thời các biến môi trường và tự động khôi phục chúng về giá trị cũ.

    Một trình quản lý bối cảnh khác, TransientResource, có thể bao quanh các cuộc gọi đến các tài nguyên có thể có hoặc không có sẵn; nó sẽ bắt và bỏ qua danh sách ngoại lệ được chỉ định. Ví dụ: kiểm tra mạng có thể bỏ qua một số lỗi nhất định khi kết nối với trang web bên ngoài:

    với test_support.TransientResource(IOError,
                                    errno=errno.ETIMEDOUT):
        f = urllib.urlopen('https://sf.net')
        ...
    

    Cuối cùng, check_warnings() đặt lại bộ lọc cảnh báo của mô-đun warning và trả về một đối tượng sẽ ghi lại tất cả các thông báo cảnh báo được kích hoạt (bpo-3781):

    với test_support.check_warnings()  wrec:
        cảnh báo.simplefilter("luôn luôn")
        # ... mã kích hoạt cảnh báo ...
        khẳng định str(wrec.message) == "chức năng đã lỗi thời"
        khẳng định len(wrec.warnings) == 1, "Đã đưa ra nhiều cảnh báo"
    

    (Được đóng góp bởi Brett Cannon.)

  • Mô-đun textwrap hiện có thể duy trì khoảng trắng hiện có ở đầu và cuối của các dòng mới được tạo bằng cách chỉ định drop_whitespace=False làm đối số:

    >>> S = """Câu này có nhiều
    ... thêm khoảng trắng."""
    >>> print textwrap.fill(S, width=15)
    Câu này
    có một bó
    thêm
    khoảng trắng.
    >>> print textwrap.fill(S, drop_whitespace=False, width=15)
    Câu này
      có một bó
       thêm
       khoảng trắng.
    >>>
    

    (Được đóng góp bởi Dwayne Bailey; bpo-1581073.)

  • Mô-đun threading API đang được thay đổi để sử dụng các thuộc tính như daemon thay vì các phương thức setDaemon()isDaemon(), đồng thời một số phương thức đã được đổi tên để sử dụng dấu gạch dưới thay vì kiểu chữ lạc đà; ví dụ: phương thức activeCount() được đổi tên thành active_count(). Cả hai phiên bản 2.6 và 3.0 của mô-đun đều hỗ trợ các thuộc tính giống nhau và các phương thức được đổi tên nhưng không loại bỏ các phương thức cũ. Chưa có ngày nào được ấn định cho việc ngừng sử dụng các API cũ trong Python 3.x; các API cũ sẽ không bị xóa trong bất kỳ phiên bản 2.x nào. (Được thực hiện bởi một số người, nổi bật nhất là Benjamin Peterson.)

    Các đối tượng Thread của mô-đun threading có thuộc tính ident trả về mã định danh của luồng, một số nguyên khác 0. (Được đóng góp bởi Gregory P. Smith; bpo-2871.)

  • Mô-đun timeit hiện chấp nhận các lệnh gọi cũng như chuỗi cho câu lệnh được tính thời gian và cho mã thiết lập. Hai hàm tiện lợi đã được thêm vào để tạo phiên bản Timer: repeat(stmt, setup, time, repeat, number)timeit(stmt, setup, time, number) tạo một phiên bản và gọi phương thức tương ứng. (Được đóng góp bởi Erik Demaine; bpo-1533909.)

  • Mô-đun Tkinter hiện chấp nhận danh sách và bộ dữ liệu cho các tùy chọn, phân tách các phần tử bằng dấu cách trước khi chuyển giá trị kết quả cho Tcl/Tk. (Được đóng góp bởi Guilherme Polo; bpo-2906.)

  • Mô-đun turtle dành cho đồ họa rùa đã được Gregor Lingl cải tiến đáng kể. Các tính năng mới trong mô-đun bao gồm:

    • Hoạt hình tốt hơn về chuyển động và xoay của rùa.

    • Kiểm soát chuyển động của rùa bằng các phương pháp delay(), tracer()speed() mới.

    • Khả năng thiết lập hình dạng mới cho rùa và xác định hệ tọa độ mới.

    • Rùa hiện có phương thức undo() có thể khôi phục các hành động.

    • Hỗ trợ đơn giản để phản ứng với các sự kiện đầu vào như hoạt động của chuột và bàn phím, giúp bạn có thể viết các trò chơi đơn giản.

    • Tệp turtle.cfg có thể được sử dụng để tùy chỉnh giao diện ban đầu của màn hình rùa.

    • Chuỗi tài liệu của mô-đun có thể được thay thế bằng chuỗi tài liệu mới đã được dịch sang ngôn ngữ khác.

    (bpo-1513695)

  • Một tham số timeout tùy chọn đã được thêm vào hàm urllib.urlopen và hàm tạo của lớp urllib.ftpwrapper, cũng như hàm urllib2.urlopen. Tham số chỉ định thời gian chờ được tính bằng giây. Ví dụ:

    >>> u = urllib2.urlopen("http://slow.example.com",
                            hết thời gian=3)
    Traceback (cuộc gọi gần đây nhất):
      ...
    urllib2.URLError: <hết thời gian lỗi urlopen>
    >>>
    

    (Được thêm bởi Facundo Batista.)

  • Cơ sở dữ liệu Unicode do mô-đun unicodedata cung cấp đã được cập nhật lên phiên bản 5.1.0. (Được cập nhật bởi Martin von Löwis; bpo-3811.)

  • formatwarning()showwarning() của mô-đun warnings đã nhận được một đối số line tùy chọn có thể được sử dụng để cung cấp dòng mã nguồn. (Đã thêm như một phần của bpo-1631171, được triển khai lại một phần của mô-đun warnings trong mã C.)

    Một chức năng mới, catch_warnings(), là một trình quản lý bối cảnh dành cho mục đích thử nghiệm, cho phép bạn tạm thời sửa đổi các bộ lọc cảnh báo và sau đó khôi phục các giá trị ban đầu của chúng (bpo-3781).

  • Giờ đây, các lớp XML-RPC SimpleXMLRPCServerDocXMLRPCServer có thể bị ngăn chặn việc mở và liên kết ngay lập tức với ổ cắm của chúng bằng cách chuyển False làm tham số hàm tạo bind_and_activate. Điều này có thể được sử dụng để sửa đổi thuộc tính allow_reuse_address của cá thể trước khi gọi các phương thức server_bind()server_activate() để mở ổ cắm và bắt đầu lắng nghe các kết nối. (Được đóng góp bởi Peter Parente; bpo-1599845.)

    SimpleXMLRPCServer cũng có thuộc tính _send_traceback_header; nếu đúng, ngoại lệ và truy nguyên được định dạng sẽ được trả về dưới dạng tiêu đề HTTP "X-Exception" và "X-Traceback". Tính năng này chỉ nhằm mục đích gỡ lỗi và không nên sử dụng trên các máy chủ sản xuất vì việc truy nguyên có thể tiết lộ mật khẩu hoặc thông tin nhạy cảm khác. (Được đóng góp bởi Alan McIntyre như một phần dự án của ông cho Summer of Code 2007 của Google.)

  • Mô-đun xmlrpclib không còn tự động chuyển đổi datetime.datedatetime.time thành loại xmlrpclib.DateTime nữa; ngữ nghĩa chuyển đổi không nhất thiết phải đúng cho tất cả các ứng dụng. Mã sử ​​dụng xmlrpclib sẽ chuyển đổi các phiên bản datetime. (bpo-1330538) Mã cũng có thể xử lý các ngày trước năm 1900 (do Ralf Schmitt; bpo-2014 đóng góp) và các số nguyên 64-bit được biểu thị bằng cách sử dụng <i8> trong các phản hồi XML-RPC (do Riku Lindblad; bpo-2985 đóng góp).

  • Lớp ZipFile của mô-đun zipfile hiện có các phương thức extract()extractall() sẽ giải nén một tệp hoặc tất cả các tệp trong kho lưu trữ vào thư mục hiện tại hoặc vào một thư mục được chỉ định:

    z = zipfile.ZipFile('python-251.zip')
    
    # Unpack một tập tin duy nhất, viết nó tương đối
    # to thư mục /tmp.
    z.extract('Python/sysmodule.c', '/tmp')
    
    # Unpack tất cả các tập tin trong kho lưu trữ.
    z.extractall()
    

    (Được đóng góp bởi Alan McIntyre; bpo-467924.)

    Các phương thức open(), read()extract() hiện có thể lấy tên tệp hoặc đối tượng ZipInfo. Điều này rất hữu ích khi kho lưu trữ vô tình chứa tên tệp trùng lặp. (Được đóng góp bởi Graham Horler; bpo-1775025.)

    Cuối cùng, zipfile hiện hỗ trợ sử dụng tên tệp Unicode cho các tệp lưu trữ. (Được đóng góp bởi Alexey Borzenkov; bpo-1734346.)

Mô-đun ast

Mô-đun ast cung cấp biểu diễn Cây cú pháp trừu tượng của mã Python và Armin Ronacher đã đóng góp một tập hợp các hàm trợ giúp thực hiện nhiều tác vụ phổ biến khác nhau. Những thứ này sẽ hữu ích cho các gói tạo khuôn mẫu HTML, bộ phân tích mã và các công cụ tương tự xử lý mã Python.

Hàm parse() nhận một biểu thức và trả về AST. Hàm dump() đưa ra biểu diễn của một cây, phù hợp để gỡ lỗi

nhập khẩu ast

t = ast.parse("""
d = {}
cho tôi trong 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
in d
""")
in ast.dump(t)

Điều này tạo ra một cây được lồng sâu:

-đun (thân = [
  Chỉ định(mục tiêu=[
    Tên(id='d', ctx=Store())
   ], value=Dict(keys=[], value=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Chỉ định(mục tiêu=[
      Chỉ số dưới(giá trị=
        Tên(id='d', ctx=Load()),
          lát=
          Chỉ số(giá trị=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], giá trị=
     BinOp(trái=
      BinOp(trái=
       Gọi(func=
        Tên(id='ord', ctx=Load()), args=[
          Tên(id='i', ctx=Load())
         ], keywords=[], starargs=Không , kwargs=Không ),
       op=Sub(), right=Gọi(func=
        Tên(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=Không , kwargs=Không )),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   In(đích=Không , giá trị=[
     Tên(id='d', ctx=Load())
   ], nl=Đúng)
 ])

Phương thức literal_eval() lấy một chuỗi hoặc một AST biểu thị một biểu thức bằng chữ, phân tích cú pháp và đánh giá nó rồi trả về giá trị kết quả. Biểu thức bằng chữ là biểu thức Python chỉ chứa chuỗi, số, từ điển, v.v. nhưng không có câu lệnh hoặc lệnh gọi hàm. Nếu bạn cần đánh giá một biểu thức nhưng không thể chấp nhận rủi ro bảo mật khi sử dụng lệnh gọi eval(), literal_eval() sẽ xử lý nó một cách an toàn:

>>> chữ = '("a", "b", {2:4, 3:8, 1:2})'
>>> in ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> in ast.literal_eval('"a" + "b"')
Traceback (cuộc gọi gần đây nhất):
  ...
ValueError: chuỗi không đúng định dạng

Mô-đun này cũng bao gồm các lớp NodeVisitorNodeTransformer để duyệt và sửa đổi AST cũng như các chức năng cho các phép biến đổi phổ biến như thay đổi số dòng.

Mô-đun future_builtins

Python 3.0 thực hiện nhiều thay đổi đối với danh mục các hàm dựng sẵn và hầu hết các thay đổi không thể được đưa vào loạt Python 2.x vì chúng sẽ phá vỡ tính tương thích. Mô-đun future_builtins cung cấp các phiên bản của các hàm tích hợp này có thể được nhập khi viết mã tương thích 3.0.

Các chức năng trong mô-đun này hiện bao gồm:

  • ascii(obj): tương đương với repr(). Trong Python 3.0, repr() sẽ trả về một chuỗi Unicode, trong khi ascii() sẽ trả về một chuỗi byte ASCII thuần túy.

  • filter(predicate, iterable), map(func, iterable1, ...): phiên bản 3.0 trả về các trình vòng lặp, không giống như các nội dung 2.x trả về danh sách.

  • hex(value), oct(value): thay vì gọi phương thức __hex__() hoặc __oct__(), các phiên bản này sẽ gọi phương thức __index__() và chuyển đổi kết quả thành hệ thập lục phân hoặc bát phân. oct() sẽ sử dụng ký hiệu 0o mới cho kết quả của nó.

Mô-đun json: Ký hiệu đối tượng JavaScript

Mô-đun json mới hỗ trợ mã hóa và giải mã các loại Python trong JSON (Ký hiệu đối tượng Javascript). JSON là định dạng trao đổi nhẹ thường được sử dụng trong các ứng dụng web. Để biết thêm thông tin về JSON, xem http://www.json.org.

json hỗ trợ giải mã và mã hóa hầu hết các loại Python tích hợp sẵn. Ví dụ sau mã hóa và giải mã một từ điển:

>>> nhập json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # Encode dữ liệu
>>> in_json
'{"vẹt": 42, "thư rác": "foo"}'
>>> json.loads(in_json) # Decode vào đối tượng Python
{"spam": "foo", "parrot": 42}

Bạn cũng có thể viết bộ giải mã và bộ mã hóa của riêng mình để hỗ trợ nhiều loại hơn. Tính năng in đẹp của dây JSON cũng được hỗ trợ.

json (ban đầu được gọi là simplejson) được viết bởi Bob Ippolito.

Mô-đun plistlib: Trình phân tích cú pháp danh sách thuộc tính

Định dạng .plist thường được sử dụng trên Mac OS X để lưu trữ các loại dữ liệu cơ bản (số, chuỗi, danh sách và từ điển) bằng cách tuần tự hóa chúng thành định dạng dựa trên XML. Nó giống với việc tuần tự hóa các kiểu dữ liệu XML-RPC.

Mặc dù được sử dụng chủ yếu trên Mac OS X, định dạng này không dành riêng cho Mac và việc triển khai Python hoạt động trên mọi nền tảng mà Python hỗ trợ, vì vậy mô-đun plistlib đã được nâng cấp lên thư viện chuẩn.

Sử dụng mô-đun rất đơn giản:

hệ thống nhập khẩu
nhập plistlib
nhập ngày giờ dưới dạng dt

cấu trúc dữ liệu # Create
data_struct = dict(lastAccessed=dt.datetime.now(),
                   phiên bản=1,
                   chuyên mục=('Cá nhân','Chia sẻ','Riêng tư'))

chuỗi # Create chứa XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
in data_struct
in new_struct

cấu trúc dữ liệu # Write vào một tệp và đọc lại.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist chấp nhận các đối tượng cũng như đường dẫn giống như tệp.
plistlib.writePlist(data_struct, sys.stdout)

Cải tiến ctypes

Thomas Heller tiếp tục duy trì và nâng cao mô-đun ctypes.

ctypes hiện hỗ trợ kiểu dữ liệu c_bool đại diện cho loại C99 bool. (Được đóng góp bởi David Remahl; bpo-1649190.)

Các loại chuỗi, bộ đệm và mảng ctypes đã hỗ trợ cải tiến cho cú pháp cắt mở rộng, trong đó cung cấp nhiều kết hợp (start, stop, step) khác nhau. (Được thực hiện bởi Thomas Wouters.)

Tất cả các kiểu dữ liệu ctypes hiện đều hỗ trợ các phương thức from_buffer()from_buffer_copy() tạo một phiên bản ctypes dựa trên đối tượng bộ đệm được cung cấp. from_buffer_copy() sao chép nội dung của đối tượng, trong khi from_buffer() sẽ chia sẻ cùng một vùng bộ nhớ.

Một quy ước gọi mới yêu cầu ctypes xóa các biến errno hoặc Win32 LastError ngay từ đầu mỗi cuộc gọi được gói. (Được thực hiện bởi Thomas Heller; bpo-1798.)

Bây giờ bạn có thể truy xuất biến Unix errno sau khi gọi hàm. Khi tạo hàm được gói, bạn có thể cung cấp use_errno=True làm tham số từ khóa cho hàm DLL(), sau đó gọi các phương thức cấp mô-đun set_errno()get_errno() để đặt và truy xuất giá trị lỗi.

Biến Win32 LastError được hỗ trợ tương tự bởi các hàm DLL(), OleDLL()WinDLL(). Bạn cung cấp use_last_error=True làm tham số từ khóa, sau đó gọi các phương thức cấp mô-đun là set_last_error()get_last_error().

Hàm byref(), được sử dụng để truy xuất con trỏ tới phiên bản ctypes, hiện có tham số offset tùy chọn là số byte sẽ được thêm vào con trỏ được trả về.

Hỗ trợ SSL được cải thiện

Bill Janssen đã thực hiện những cải tiến sâu rộng đối với sự hỗ trợ của Python 2.6 dành cho Lớp cổng bảo mật bằng cách thêm một mô-đun mới, ssl, được xây dựng trên thư viện OpenSSL. Mô-đun mới này cung cấp nhiều quyền kiểm soát hơn đối với giao thức được đàm phán, chứng chỉ X.509 được sử dụng và hỗ trợ tốt hơn để ghi máy chủ SSL (trái ngược với máy khách) bằng Python. Hỗ trợ SSL hiện có trong mô-đun socket chưa bị xóa và tiếp tục hoạt động, mặc dù nó sẽ bị xóa trong Python 3.0.

Để sử dụng mô-đun mới, trước tiên bạn phải tạo kết nối TCP theo cách thông thường, sau đó chuyển nó sang hàm ssl.wrap_socket(). Có thể chỉ định xem chứng chỉ có cần thiết hay không và lấy thông tin chứng chỉ bằng cách gọi phương thức getpeercert().

Xem thêm

Tài liệu dành cho mô-đun ssl.

Ngừng sử dụng và xóa

  • Các ngoại lệ về chuỗi đã bị loại bỏ. Cố gắng sử dụng chúng sẽ tăng TypeError.

  • Những thay đổi đối với giao diện Exception do PEP 352 quy định vẫn tiếp tục được thực hiện. Đối với phiên bản 2.6, thuộc tính message không còn được dùng nữa để thay thế bằng thuộc tính args.

  • (Chế độ cảnh báo 3.0) Python 3.0 sẽ có thư viện tiêu chuẩn được tổ chức lại, loại bỏ nhiều mô-đun lỗi thời và đổi tên các mô-đun khác. Python 2.6 chạy ở chế độ cảnh báo 3.0 sẽ cảnh báo về các mô-đun này khi chúng được nhập.

    Danh sách các mô-đun không được dùng nữa là: audiodev, bgenlocations, buildtools, bundlebuilder, Canvas, compiler, dircache, dl, fpformat, gensuitemodule, ihooks, imageop, imgfile, linuxaudiodev, mhlib, mimetools, multifile, new, pure, statvfs, sunaudiodev, test.testall, và toaiff.

  • Mô-đun gopherlib đã bị xóa.

  • Mô-đun MimeWriter và mô-đun mimify không còn được dùng nữa; thay vào đó hãy sử dụng gói email.

  • Mô-đun md5 không còn được dùng nữa; thay vào đó hãy sử dụng mô-đun hashlib.

  • Mô-đun posixfile không còn được dùng nữa; fcntl.lockf() cung cấp khóa tốt hơn.

  • Mô-đun popen2 không còn được dùng nữa; sử dụng mô-đun subprocess.

  • Mô-đun rgbimg đã bị xóa.

  • Mô-đun sets không còn được dùng nữa; tốt hơn nên sử dụng loại setfrozenset tích hợp sẵn.

  • Mô-đun sha không còn được dùng nữa; thay vào đó hãy sử dụng mô-đun hashlib.

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

Những thay đổi trong quá trình xây dựng của Python và C API bao gồm:

  • Python bây giờ phải được biên dịch bằng trình biên dịch C89 (sau 19 năm!). Điều này có nghĩa là cây nguồn Python đã loại bỏ các triển khai memmove()strerror() của riêng nó, nằm trong thư viện chuẩn C89.

  • Python 2.6 có thể được xây dựng bằng Microsoft Visual Studio 2008 (phiên bản 9.0) và đây là trình biên dịch mặc định mới. Xem thư mục PCbuild để biết các tập tin xây dựng. (Được thực hiện bởi Christian Heimes.)

  • Trên Mac OS X, Python 2.6 có thể được biên dịch dưới dạng bản dựng phổ quát 4 chiều. Tập lệnh configure có thể sử dụng công tắc --with-universal-archs=[32-bit|64-bit|all], kiểm soát xem các tệp nhị phân được xây dựng cho kiến ​​trúc 32-bit (x86, PowerPC), 64-bit (x86-64 và PPC-64) hay cả hai. (Được đóng góp bởi Ronald Oussoren.)

  • Một hàm mới được thêm vào trong Python 2.6.6, PySys_SetArgvEx(), đặt giá trị của sys.argv và có thể tùy ý cập nhật sys.path để bao gồm thư mục chứa tập lệnh được đặt tên bởi sys.argv[0] tùy thuộc vào giá trị của tham số updatepath.

    Chức năng này đã được thêm vào để đóng lỗ hổng bảo mật cho các ứng dụng nhúng Python. Hàm cũ, PySys_SetArgv(), sẽ luôn cập nhật sys.path và đôi khi nó sẽ thêm thư mục hiện tại. Điều này có nghĩa là, nếu bạn chạy một ứng dụng nhúng Python trong thư mục do người khác kiểm soát, kẻ tấn công có thể đặt mô-đun Trojan-horse vào thư mục đó (ví dụ: tệp có tên os.py) mà ứng dụng của bạn sau đó sẽ nhập và chạy.

    Nếu bạn duy trì một ứng dụng C/C++ nhúng Python, hãy kiểm tra xem bạn có đang gọi PySys_SetArgv() hay không và cân nhắc cẩn thận xem ứng dụng có nên sử dụng PySys_SetArgvEx() với updatepath được đặt thành false hay không. Lưu ý rằng việc sử dụng chức năng này sẽ phá vỡ khả năng tương thích với các phiên bản Python 2.6.5 trở về trước; nếu bạn phải tiếp tục làm việc với các phiên bản cũ hơn, bạn có thể để lại lệnh gọi tới PySys_SetArgv() và gọi PyRun_SimpleString("sys.path.pop(0)\n") sau đó để loại bỏ thành phần sys.path đầu tiên.

    Vấn đề bảo mật được báo cáo là CVE 2008-5983; được thảo luận trong gh-50003 và được Antoine Pitrou sửa.

  • Mô-đun BerkeleyDB hiện có đối tượng C API, có sẵn dưới dạng bsddb.db.api. Đối tượng này có thể được sử dụng bởi các phần mở rộng C khác muốn sử dụng mô-đun bsddb cho mục đích riêng của họ. (Được đóng góp bởi Duncan Grisby.)

  • Giao diện bộ đệm mới, được mô tả trước đây trong the PEP 3118 section, bổ sung thêm PyObject_GetBuffer()PyBuffer_Release(), cũng như một số chức năng khác.

  • Việc sử dụng thư viện C stdio của Python hiện an toàn theo luồng hoặc ít nhất là an toàn theo luồng như thư viện cơ bản. Đã xảy ra lỗi tiềm ẩn lâu dài nếu một luồng đóng đối tượng tệp trong khi một luồng khác đang đọc hoặc ghi vào đối tượng. Trong các đối tượng tệp 2.6 có số lượng tham chiếu, được xử lý bởi các hàm PyFile_IncUseCount()PyFile_DecUseCount(). Không thể đóng các đối tượng tệp trừ khi số lượng tham chiếu bằng 0. PyFile_IncUseCount() nên được gọi trong khi GIL vẫn được giữ, trước khi thực hiện thao tác I/O bằng con trỏ FILE *PyFile_DecUseCount() phải được gọi ngay sau khi GIL được lấy lại. (Được đóng góp bởi Antoine Pitrou và Gregory P. Smith.)

  • Nhập mô-đun đồng thời vào hai luồng khác nhau không còn bế tắc nữa; bây giờ nó sẽ tăng ImportError. Hàm API mới, PyImport_ImportModuleNoBlock(), trước tiên sẽ tìm kiếm mô-đun trong sys.modules, sau đó thử nhập mô-đun đó sau khi có khóa nhập. Nếu khóa nhập được giữ bởi một luồng khác, ImportError sẽ được nâng lên. (Được đóng góp bởi Christian Heimes.)

  • Một số hàm trả về thông tin về hỗ trợ dấu phẩy động của nền tảng. PyFloat_GetMax() trả về giá trị dấu phẩy động có thể biểu thị tối đa và PyFloat_GetMin() trả về giá trị dương tối thiểu. PyFloat_GetInfo() trả về một đối tượng chứa nhiều thông tin hơn từ tệp float.h, chẳng hạn như "mant_dig" (số chữ số trong phần định trị), "epsilon" (sự khác biệt nhỏ nhất giữa 1.0 và giá trị lớn nhất tiếp theo có thể biểu thị) và một số giá trị khác. (Được đóng góp bởi Christian Heimes; bpo-1534.)

  • Các hàm và phương thức C sử dụng PyComplex_AsCComplex() giờ đây sẽ chấp nhận các đối số có phương thức __complex__(). Đặc biệt, các hàm trong mô-đun cmath giờ đây sẽ chấp nhận các đối tượng bằng phương thức này. Đây là bản cập nhật của sự thay đổi Python 3.0. (Được đóng góp bởi Mark Dickinson; bpo-1675423.)

  • C API của Python hiện bao gồm hai hàm để so sánh chuỗi không phân biệt chữ hoa chữ thường, PyOS_stricmp(char*, char*)PyOS_strnicmp(char*, char*, Py_ssize_t). (Được đóng góp bởi Christian Heimes; bpo-1635.)

  • Nhiều tiện ích mở rộng C xác định macro nhỏ của riêng chúng để thêm số nguyên và chuỗi vào từ điển của mô-đun trong hàm init*. Python 2.6 cuối cùng đã xác định các macro tiêu chuẩn để thêm giá trị vào mô-đun, PyModule_AddStringMacroPyModule_AddIntMacro(). (Được đóng góp bởi Christian Heimes.)

  • Một số macro đã được đổi tên trong cả 3.0 và 2.6 để làm rõ hơn rằng chúng là macro chứ không phải chức năng. Py_Size() trở thành Py_SIZE(), Py_Type() trở thành Py_TYPE()Py_Refcnt() trở thành Py_REFCNT(). Các macro dạng hỗn hợp vẫn có sẵn trong Python 2.6 để có khả năng tương thích ngược. (bpo-1629)

  • Distutils hiện đặt các phần mở rộng C mà nó xây dựng trong một thư mục khác khi chạy trên phiên bản gỡ lỗi của Python. (Được đóng góp bởi Collin Winter; bpo-1530959.)

  • Một số kiểu dữ liệu cơ bản, chẳng hạn như số nguyên và chuỗi, duy trì danh sách đối tượng nội bộ miễn phí có thể được sử dụng lại. Cấu trúc dữ liệu cho các danh sách miễn phí này hiện tuân theo quy ước đặt tên: biến luôn được đặt tên là free_list, bộ đếm luôn được đặt tên là numfree và macro Py<typename>_MAXFREELIST luôn được xác định.

  • Mục tiêu Makefile mới, "make patchcheck", chuẩn bị cây nguồn Python để tạo bản vá: nó sửa khoảng trắng ở cuối trong tất cả các tệp .py đã sửa đổi, kiểm tra xem tài liệu đã bị thay đổi chưa và báo cáo xem các tệp Misc/ACKSMisc/NEWS đã được cập nhật hay chưa. (Được đóng góp bởi Brett Cannon.)

    Một mục tiêu mới khác, "tạo hồ sơ-opt", biên dịch tệp nhị phân Python bằng cách sử dụng tối ưu hóa hướng dẫn hồ sơ của GCC. Nó biên dịch Python với tính năng lập hồ sơ được kích hoạt, chạy bộ thử nghiệm để thu được một tập hợp các kết quả lập hồ sơ, sau đó biên dịch bằng cách sử dụng các kết quả này để tối ưu hóa. (Được đóng góp bởi Gregory P. Smith.)

Thay đổi theo cổng cụ thể: Windows

  • Hỗ trợ cho Windows 95, 98, ME và NT4 đã bị loại bỏ. Python 2.6 yêu cầu ít nhất Windows 2000 SP4.

  • Trình biên dịch mặc định mới trên Windows là Visual Studio 2008 (phiên bản 9.0). Các thư mục xây dựng cho Visual Studio 2003 (phiên bản 7.1) và 2005 (phiên bản 8.0) đã được chuyển vào thư mục PC/. Thư mục PCbuild mới hỗ trợ biên dịch chéo cho X64, xây dựng gỡ lỗi và Tối ưu hóa hướng dẫn hồ sơ (PGO). Bản dựng PGO nhanh hơn khoảng 10% so với bản dựng thông thường. (Được đóng góp bởi Christian Heimes với sự giúp đỡ của Amaury Forgeot d'Arc và Martin von Löwis.)

  • Mô-đun msvcrt hiện hỗ trợ cả biến thể char thông thường và char rộng của I/O API của bảng điều khiển. Hàm getwch() đọc một lần nhấn phím và trả về giá trị Unicode, hàm getwche() cũng vậy. Hàm putwch() lấy một ký tự Unicode và ghi nó vào bảng điều khiển. (Được đóng góp bởi Christian Heimes.)

  • os.path.expandvars() hiện sẽ mở rộng các biến môi trường ở dạng "%var%" và "~user" sẽ được mở rộng sang đường dẫn thư mục chính của người dùng. (Được đóng góp bởi Josiah Carlson; bpo-957650.)

  • Các đối tượng ổ cắm của mô-đun socket hiện có phương thức ioctl() cung cấp giao diện giới hạn cho giao diện hệ thống WSAIoctl().

  • Mô-đun _winreg hiện có chức năng, ExpandEnvironmentStrings(), mở rộng các tham chiếu biến môi trường chẳng hạn như %NAME% trong chuỗi đầu vào. Các đối tượng xử lý do mô-đun này cung cấp hiện hỗ trợ giao thức ngữ cảnh, vì vậy chúng có thể được sử dụng trong các câu lệnh with. (Được đóng góp bởi Christian Heimes.)

    _winreg cũng hỗ trợ tốt hơn cho các hệ thống x64, hiển thị các chức năng DisableReflectionKey(), EnableReflectionKey()QueryReflectionKey(), cho phép và vô hiệu hóa phản ánh đăng ký cho các quy trình 32 bit chạy trên hệ thống 64 bit. (bpo-1753245)

  • Đối tượng Record của mô-đun msilib đã nhận được các phương thức GetInteger()GetString() trả về các giá trị trường dưới dạng số nguyên hoặc chuỗi. (Được đóng góp bởi Floris Bruynooghe; bpo-2125.)

Thay đổi theo cổng cụ thể: Mac OS X

  • Khi biên dịch bản dựng khung của Python, giờ đây bạn có thể chỉ định tên khung sẽ được sử dụng bằng cách cung cấp tùy chọn --with-framework-name= cho tập lệnh configure.

  • Mô-đun macfs đã bị xóa. Điều này đến lượt nó yêu cầu phải loại bỏ chức năng macostools.touched() vì nó phụ thuộc vào mô-đun macfs. (bpo-1490190)

  • Nhiều mô-đun Mac OS khác không được dùng nữa và sẽ bị xóa trong Python 3.0: _builtinSuites, aepack, aetools, aetypes, applesingle, appletrawmain, appletrunner, argvemulator, Audio_mac, autoGIL, Carbon, cfmfile, CodeWarrior, ColorPicker, EasyDialogs, Explorer, Finder, FrameWork, findertools, ic, icglue, icopen, macerrors, MacOS, macfs, macostools, macresource, MiniAEFrame, Nav, Netscape, OSATerminology, pimp, PixMapWrapper, StdSuites, SystemEvents, Terminal, và terminalcommand.

Thay đổi dành riêng cho cổng: IRIX

Một số mô-đun cũ dành riêng cho IRIX không được dùng nữa và sẽ bị xóa trong Python 3.0: alAL, cd, cddb, cdplayer, CLcl, DEVICE, ERRNO, FILE, FLfl, flp, fm, GET, GLWS, GLgl, IN, IOCTL, jpeg, panelparser, readcd, SVsv, torgb, videoreader, và WAIT.

Chuyển sang Python 2.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:

  • Các lớp không được cho là có thể băm được nên đặt __hash__ = None trong định nghĩa của chúng để chỉ ra thực tế.

  • Các ngoại lệ về chuỗi đã bị loại bỏ. Cố gắng sử dụng chúng sẽ tăng TypeError.

  • Phương thức __init__() của collections.deque hiện xóa mọi nội dung hiện có của deque trước khi thêm các phần tử từ iterable. Thay đổi này làm cho hành vi khớp với list.__init__().

  • object.__init__() trước đây đã chấp nhận các đối số và đối số từ khóa tùy ý, bỏ qua chúng. Trong Python 2.6, điều này không còn được phép nữa và sẽ dẫn đến TypeError. Điều này sẽ ảnh hưởng đến các phương thức __init__() mà cuối cùng sẽ gọi phương thức tương ứng trên object (có thể thông qua việc sử dụng super()). Xem bpo-1683368 để thảo luận.

  • Hàm tạo Decimal hiện chấp nhận khoảng trắng ở đầu và cuối khi truyền một chuỗi. Trước đây nó sẽ đưa ra một ngoại lệ InvalidOperation. Mặt khác, phương thức create_decimal() của các đối tượng Context hiện không cho phép thêm khoảng trắng, gây ra ngoại lệ ConversionSyntax.

  • Do sự cố triển khai, nếu bạn chuyển đường dẫn tệp tới hàm __import__() tích hợp sẵn, nó sẽ thực sự nhập tệp được chỉ định. Tuy nhiên, điều này chưa bao giờ có ý định hoạt động và việc triển khai hiện đang kiểm tra rõ ràng trường hợp này và đưa ra ImportError.

  • C API: các hàm PyImport_Import()PyImport_ImportModule() hiện được mặc định là nhập tuyệt đối, không phải nhập tương đối. Điều này sẽ ảnh hưởng đến các tiện ích mở rộng C nhập các mô-đun khác.

  • C API: các loại dữ liệu mở rộng không thể băm được nên xác định vị trí tp_hash của chúng thành PyObject_HashNotImplemented().

  • Ngoại lệ mô-đun socket socket.error hiện kế thừa từ IOError. Trước đây nó không phải là một lớp con của StandardError nhưng bây giờ nó là một lớp con thông qua IOError. (Được thực hiện bởi Gregory P. Smith; bpo-1706815.)

  • Mô-đun xmlrpclib không còn tự động chuyển đổi datetime.datedatetime.time thành loại xmlrpclib.DateTime nữa; ngữ nghĩa chuyển đổi không nhất thiết phải đúng cho tất cả các ứng dụng. Mã sử ​​dụng xmlrpclib sẽ chuyển đổi các phiên bản datetime. (bpo-1330538)

  • (Chế độ cảnh báo 3.0) Lớp Exception hiện cảnh báo khi được truy cập bằng cách sử dụng tính năng cắt hoặc truy cập chỉ mục; việc Exception hoạt động giống như một bộ dữ liệu đang bị loại bỏ dần.

  • (Chế độ cảnh báo 3.0) so sánh bất bình đẳng giữa hai từ điển hoặc hai đối tượng không triển khai phương pháp so sánh được báo cáo dưới dạng cảnh báo. dict1 == dict2 vẫn hoạt động nhưng dict1 < dict2 đang bị loại bỏ dần.

    So sánh giữa các ô, là một chi tiết triển khai các quy tắc phạm vi của Python, cũng gây ra cảnh báo vì những so sánh như vậy bị cấm hoàn toàn trong 3.0.

Đối với các ứng dụng nhúng Python:

  • Hàm PySys_SetArgvEx() đã được thêm vào Python 2.6.6, cho phép các ứng dụng đóng lỗ hổng bảo mật khi sử dụng hàm PySys_SetArgv() hiện có. Kiểm tra xem bạn có đang gọi PySys_SetArgv() hay không và cân nhắc cẩn thận xem ứng dụng có nên sử dụng PySys_SetArgvEx() với updatepath được đặt thành false hay không.

Lời cảm ơn

Tác giả xin cảm ơn những người sau đây đã đưa ra gợi ý, chỉnh sửa và hỗ trợ các bản thảo khác nhau của bài viết này: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.