Có gì mới trong Python 3.1

tác giả:

Raymond Hettinger

Bài viết này giải thích các tính năng mới trong Python 3.1, so với 3.0. Python 3.1 được phát hành vào ngày 27 tháng 6 năm 2009.

PEP 372: Từ điển theo thứ tự

Từ điển Python thông thường lặp lại các cặp khóa/giá trị theo thứ tự tùy ý. Qua nhiều năm, một số tác giả đã viết các triển khai thay thế ghi nhớ thứ tự các khóa được chèn ban đầu. Dựa trên kinh nghiệm từ những lần triển khai đó, một lớp collections.OrderedDict mới đã được giới thiệu.

OrderedDict API về cơ bản giống như các từ điển thông thường nhưng sẽ lặp lại các khóa và giá trị theo một thứ tự được đảm bảo tùy thuộc vào thời điểm khóa được chèn lần đầu tiên. Nếu một mục nhập mới ghi đè lên một mục nhập hiện có thì vị trí chèn ban đầu sẽ không thay đổi. Xóa một mục và chèn lại nó sẽ chuyển nó đến cuối.

Thư viện chuẩn hiện nay hỗ trợ việc sử dụng các từ điển có thứ tự trong một số mô-đun. Mô-đun configparser sử dụng chúng theo mặc định. Điều này cho phép các tệp cấu hình được đọc, sửa đổi và sau đó được ghi lại theo thứ tự ban đầu. Phương thức _asdict() cho collections.namedtuple() hiện trả về một từ điển có thứ tự với các giá trị xuất hiện theo cùng thứ tự với các chỉ mục bộ dữ liệu cơ bản. Mô-đun json đang được tích hợp sẵn với object_pairs_hook để cho phép bộ giải mã tạo OrderedDicts. Hỗ trợ cũng được thêm vào cho các công cụ của bên thứ ba như PyYAML.

Xem thêm

PEP 372 - Từ điển đặt hàng

PEP được viết bởi Armin Ronacher và Raymond Hettinger. Việc triển khai được viết bởi Raymond Hettinger.

Vì một từ điển có thứ tự ghi nhớ thứ tự chèn của nó nên nó có thể được sử dụng cùng với việc sắp xếp để tạo một từ điển được sắp xếp:

>>> # regular từ điển chưa phân loại
>>> d = {'chuối': 3, 'táo':4, 'lê': 1, 'cam': 2}

>>> # dictionary sắp xếp theo phím
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('chuối', 3), ('orange', 2), ('lê', 1)])

>>> # dictionary sắp xếp theo giá trị
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('quả lê', 1), ('cam', 2), ('chuối', 3), ('táo', 4)])

>>> # dictionary sắp xếp theo độ dài của chuỗi khóa
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('lê', 1), ('táo', 4), ('cam', 2), ('chuối', 3)])

Các từ điển được sắp xếp mới sẽ duy trì thứ tự sắp xếp của chúng khi các mục từ bị xóa. Nhưng khi khóa mới được thêm vào, các khóa đó sẽ được thêm vào cuối và việc sắp xếp không được duy trì.

PEP 378: Công cụ xác định định dạng cho dấu phân cách hàng nghìn

Hàm format() tích hợp sẵn và phương thức str.format() sử dụng một ngôn ngữ nhỏ hiện bao gồm một cách đơn giản, không nhận biết ngôn ngữ để định dạng một số bằng dấu phân cách hàng nghìn. Điều đó cung cấp một cách để nhân bản hóa đầu ra của chương trình, cải thiện hình thức chuyên nghiệp và khả năng đọc của chương trình:

>>> định dạng(1234567, ',d')
'1.234.567'
>>> định dạng(1234567.89, ',.2f')
'1.234.567,89'
>>> định dạng(12345.6 + 8901234.12j, ',f')
'12.345.600000+8.901.234.120000j'
>>> định dạng(Thập phân('1234567.89'), ',f')
'1.234.567,89'

Các loại được hỗ trợ là int, float, complexdecimal.Decimal.

Các cuộc thảo luận đang được tiến hành về cách chỉ định các dấu phân cách thay thế như dấu chấm, dấu cách, dấu nháy đơn hoặc dấu gạch dưới. Các ứng dụng nhận biết ngôn ngữ nên sử dụng công cụ xác định định dạng n hiện có đã hỗ trợ một số cho dấu phân cách hàng nghìn.

Xem thêm

PEP 378 - Công cụ xác định định dạng cho dấu phân cách hàng nghìn

PEP được viết bởi Raymond Hettinger và được thực hiện bởi Eric Smith và Mark Dickinson.

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/tệp zip được tự động chèn vào làm mục nhập đầu tiên trong sys.path. (Gợi ý và bản vá ban đầu của Andy Chu; bản vá sửa đổi của Phillip J. Eby và Nick Coghlan; bpo-1739468.)

  • Loại int() có được phương thức bit_length trả về số bit cần thiết để biểu diễn đối số của nó ở dạng nhị phân:

    >>> n = 37
    >>> thùng(37)
    '0b100101'
    >>> n.bit_length()
    6
    >>> n = 2**123-1
    >>> n.bit_length()
    123
    >>> (n+1).bit_length()
    124
    

    (Được đóng góp bởi Fredrik Johansson, Victor Stinner, Raymond Hettinger và Mark Dickinson; bpo-3439.)

  • Các trường trong chuỗi format() hiện có thể được đánh số tự động:

    >>> 'Ngài {} của {}'.format('Gallahad', 'Camelot')
    'Ngài Gallahad xứ Camelot'
    

    Trước đây, chuỗi bắt buộc phải có các trường được đánh số, chẳng hạn như: 'Sir {0} of {1}'.

    (Được đóng góp bởi Eric Smith; bpo-5237.)

  • Hàm string.maketrans() không được dùng nữa và được thay thế bằng các phương thức tĩnh mới, bytes.maketrans()bytearray.maketrans(). Thay đổi này giải quyết sự nhầm lẫn xung quanh loại nào được mô-đun string hỗ trợ. Hiện tại, mỗi phương thức str, bytesbytearray đều có các phương thức maketranstranslate riêng với các bảng dịch trung gian thuộc loại thích hợp.

    (Được đóng góp bởi Georg Brandl; bpo-5675.)

  • Cú pháp của câu lệnh with hiện cho phép nhiều trình quản lý bối cảnh trong một câu lệnh duy nhất

    >>> với open('mylog.txt')  infile, open('a.out', 'w')  outfile:
    ... cho dòng trong infile:
    ... nếu '<quan trọng>' xếp hàng:
    ... outfile.write(line)
    

    Với cú pháp mới, hàm contextlib.nested() không còn cần thiết nữa và hiện không được dùng nữa.

    (Được đóng góp bởi Georg Brandl và Mattias Brändström; appspot issue 53094.)

  • round(x, n) bây giờ trả về một số nguyên nếu x là số nguyên. Trước đây nó trả về float:

    >>> vòng(1123, -2)
    1100
    

    (Được đóng góp bởi Mark Dickinson; bpo-4707.)

  • Python hiện sử dụng thuật toán của David Gay để tìm biểu diễn dấu phẩy động ngắn nhất mà không thay đổi giá trị của nó. Điều này sẽ giúp giảm thiểu một số nhầm lẫn xung quanh số dấu phẩy động nhị phân.

    Có thể dễ dàng nhận thấy tầm quan trọng với một số như 1.1 không có giá trị tương đương chính xác trong dấu phẩy động nhị phân. Vì không có giá trị tương đương chính xác nên một biểu thức như float('1.1') sẽ đánh giá giá trị có thể biểu thị gần nhất là 0x1.199999999999ap+0 ở dạng hex hoặc 1.100000000000000088817841970012523233890533447265625 ở dạng thập phân. Giá trị gần nhất đó đã và vẫn được sử dụng trong các phép tính dấu phẩy động tiếp theo.

    Điều mới là cách số được hiển thị. Trước đây, Python sử dụng một cách tiếp cận đơn giản. Giá trị của repr(1.1) được tính là format(1.1, '.17g') được đánh giá là '1.1000000000000001'. Ưu điểm của việc sử dụng 17 chữ số là nó dựa vào sự đảm bảo của IEEE-754 để đảm bảo rằng eval(repr(1.1)) sẽ quay vòng chính xác về giá trị ban đầu của nó. Điểm bất lợi là nhiều người nhận thấy kết quả đầu ra khó hiểu (nhầm lẫn các hạn chế nội tại của biểu diễn dấu phẩy động nhị phân là một vấn đề với chính Python).

    Thuật toán mới cho repr(1.1) thông minh hơn và trả về '1.1'. Một cách hiệu quả, nó tìm kiếm tất cả các biểu diễn chuỗi tương đương (những chuỗi được lưu trữ với cùng một giá trị float cơ bản) và trả về biểu diễn ngắn nhất.

    Thuật toán mới có xu hướng đưa ra các biểu diễn rõ ràng hơn khi có thể nhưng không thay đổi các giá trị cơ bản. Vì vậy, 1.1 + 2.2 != 3.3 vẫn xảy ra trường hợp đó mặc dù các cách trình bày có thể gợi ý khác.

    Thuật toán mới phụ thuộc vào một số tính năng nhất định trong việc triển khai dấu phẩy động cơ bản. Nếu không tìm thấy các tính năng cần thiết, thuật toán cũ sẽ tiếp tục được sử dụng. Ngoài ra, các giao thức chọn văn bản đảm bảo tính di động đa nền tảng bằng cách sử dụng thuật toán cũ.

    (Được đóng góp bởi Eric Smith và Mark Dickinson; bpo-1580)

Các mô-đun mới, cải tiến và không được dùng nữa

  • Đã thêm lớp collections.Counter để hỗ trợ đếm các mục duy nhất một cách thuận tiện theo trình tự hoặc có thể lặp lại

    >>> Bộ đếm(['đỏ', 'xanh', 'đỏ', 'xanh', 'xanh', 'xanh'])
    Bộ đếm({'xanh': 3, 'đỏ': 2, 'xanh': 1})
    

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

  • Đã thêm mô-đun mới, tkinter.ttk để truy cập vào bộ tiện ích theo chủ đề Tk. Ý tưởng cơ bản của ttk là tách biệt, trong phạm vi có thể, mã triển khai hành vi của tiện ích khỏi mã triển khai giao diện của nó.

    (Được đóng góp bởi Guilherme Polo; bpo-2983.)

  • Các lớp gzip.GzipFilebz2.BZ2File hiện hỗ trợ giao thức quản lý ngữ cảnh

    >>> # Automatically đóng file sau khi ghi
    >>> với gzip.GzipFile(filename, "wb")  f:
    ... f.write(b"xxx")
    

    (Được đóng góp bởi Antoine Pitrou.)

  • Mô-đun decimal hiện hỗ trợ các phương thức tạo đối tượng thập phân từ float nhị phân. Việc chuyển đổi là chính xác nhưng đôi khi có thể gây ngạc nhiên:

    >>> Thập phân.from_float(1.1)
    Thập phân('1.1000000000000000088817841970012523233890533447265625')
    

    Kết quả thập phân dài hiển thị phân số nhị phân thực tế đang được lưu trữ cho 1.1. Phân số có nhiều chữ số vì 1.1 không thể được biểu diễn chính xác dưới dạng nhị phân.

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

  • Mô-đun itertools đã phát triển hai chức năng mới. Hàm itertools.combinations_with_replacement() là một trong bốn hàm dùng để tạo ra tổ hợp bao gồm các hoán vị và tích Descartes. Hàm itertools.compress() bắt chước tên của nó từ APL. Ngoài ra, hàm itertools.count() hiện có hiện có đối số step tùy chọn và có thể chấp nhận bất kỳ loại chuỗi đếm nào bao gồm fractions.Fractiondecimal.Decimal:

    >>> [p+q cho p,q trong tổ hợp_with_replacement('LOVE', 2)]
    ['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE']
    
    >>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0]))
    [2, 3, 5, 7]
    
    >>> c = count(start=Fraction(1,2), step=Fraction(1,6))
    >>> [tiếp theo(c), tiếp theo(c), tiếp theo(c), tiếp theo(c)]
    [Phân số(1, 2), Phân số(2, 3), Phân số(5, 6), Phân số(1, 1)]
    

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

  • collections.namedtuple() hiện hỗ trợ đối số từ khóa rename cho phép tự động chuyển đổi tên trường không hợp lệ thành tên vị trí ở dạng _0, _1, v.v. Điều này rất hữu ích khi tên trường được tạo bởi nguồn bên ngoài, chẳng hạn như tiêu đề CSV, danh sách trường SQL hoặc đầu vào của người dùng:

    >>> truy vấn = đầu vào()
    khu vực SELECT, phòng, số(*) FROM khu vực GROUPBY chính, phòng
    
    >>> con trỏ.execute(truy vấn)
    >>> query_fields = [desc[0] cho desc trong con trỏ.description]
    >>> UserQuery = têntuple('UserQuery', query_fields, đổi tên=True)
    >>> pprint.pprint([UserQuery(*row) cho hàng trong con trỏ])
    [UserQuery(khu vực='Miền Nam', dept='Vận chuyển', _2=185),
     UserQuery(khu vực='Miền Bắc', dept='Kế toán', _2=37),
     UserQuery(khu vực='Miền Tây', dept='Bán hàng', _2=419)]
    

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

  • Các hàm re.sub(), re.subn()re.split() hiện chấp nhận tham số cờ.

    (Được đóng góp bởi Gregory Smith.)

  • Mô-đun logging hiện triển khai một lớp logging.NullHandler đơn giản cho các ứng dụng không sử dụng tính năng ghi nhật ký nhưng đang gọi mã thư viện. Việc thiết lập trình xử lý null sẽ ngăn chặn các cảnh báo giả mạo như "Không thể tìm thấy trình xử lý nào cho logger foo":

    >>> h = log.NullHandler()
    >>> log.getLogger("foo").addHandler(h)
    

    (Đóng góp bởi Vinay Sajip; bpo-4384).

  • Mô-đun runpy hỗ trợ chuyển đổi dòng lệnh -m hiện hỗ trợ thực thi các gói bằng cách tìm kiếm và thực thi mô-đun con __main__ khi tên gói được cung cấp.

    (Được đóng góp bởi Andi Vajda; bpo-4195.)

  • Mô-đun pdb hiện có thể truy cập và hiển thị mã nguồn được tải qua zipimport (hoặc bất kỳ trình tải PEP 302 phù hợp nào khác).

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

  • Các đối tượng functools.partial bây giờ có thể được ngâm.

(Được đề xuất bởi Antoine Pitrou và Jesse Noller. Được thực hiện bởi Jack Diederich; bpo-5228.)

  • Thêm chủ đề trợ giúp pydoc cho các biểu tượng để help('@') hoạt động như mong đợi trong môi trường tương tác.

    (Được đóng góp bởi David Laban; bpo-4739.)

  • Mô-đun unittest hiện hỗ trợ bỏ qua các bài kiểm tra riêng lẻ hoặc lớp kiểm tra. Và nó hỗ trợ đánh dấu một bài kiểm tra là một thất bại dự kiến, một bài kiểm tra được biết là bị hỏng nhưng không được tính là một thất bại trên TestResult:

    lớp TestGizmo(unittest.TestCase):
    
        @unittest.skipUnless(sys.platform.startswith("win"), "yêu cầu Windows")
        def test_gizmo_on_windows(tự):
            ...
    
        @unittest.expectedFailure
        def test_gimzo_without_required_library(self):
            ...
    

    Ngoài ra, các bài kiểm tra ngoại lệ đã được xây dựng để hoạt động với trình quản lý bối cảnh bằng cách sử dụng câu lệnh with:

    def test_division_by_zero (tự):
        với self.assertRaises(ZeroDivisionError):
            x / 0
    

    Ngoài ra, một số phương pháp xác nhận mới đã được thêm vào bao gồm assertSetEqual(), assertDictEqual(), assertDictContainsSubset(), assertListEqual(), assertTupleEqual(), assertSequenceEqual(), assertRaisesRegexp(), assertIsNone()assertIsNotNone().

    (Được đóng góp bởi Benjamin Peterson và Antoine Pitrou.)

  • Mô-đun io có ba hằng số mới cho phương thức seek(): SEEK_SET, SEEK_CURSEEK_END.

  • Bộ dữ liệu sys.version_info hiện là bộ dữ liệu có tên:

    >>> sys.version_info
    sys.version_info(major=3, Minor=1, micro=0, Releaselevel='alpha', serial=2)
    

    (Được đóng góp bởi Ross Light; bpo-4285.)

  • Các mô-đun nntplibimaplib hiện hỗ trợ IPv6.

    (Được đóng góp bởi Derek Morr; bpo-1655bpo-1664.)

  • Mô-đun pickle đã được điều chỉnh để có khả năng tương tác tốt hơn với Python 2.x khi được sử dụng với giao thức 2 trở xuống. Việc tổ chức lại thư viện chuẩn đã thay đổi tham chiếu chính thức cho nhiều đối tượng. Ví dụ: __builtin__.set trong Python 2 được gọi là builtins.set trong Python 3. Thay đổi này đã cản trở nỗ lực chia sẻ dữ liệu giữa các phiên bản Python khác nhau. Nhưng bây giờ khi giao thức 2 hoặc thấp hơn được chọn, bộ chọn sẽ tự động sử dụng tên Python 2 cũ cho cả tải và đổ. Tính năng ánh xạ lại này được bật theo mặc định nhưng có thể bị tắt bằng tùy chọn fix_imports

    >>> s = {1, 2, 3}
    >>> Pickle.dumps(s, giao thức=0)
    b'c__buildin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
    >>>pick.dumps(s, giao thức=0, fix_imports=False)
    b'cbuildins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
    

    Một tác dụng phụ đáng tiếc nhưng không thể tránh khỏi của thay đổi này là giao thức 2 do Python 3.1 tạo ra sẽ không thể đọc được bằng Python 3.0. Nên sử dụng giao thức dưa mới nhất, giao thức 3, khi di chuyển dữ liệu giữa các lần triển khai Python 3.x, vì nó không cố gắng duy trì khả năng tương thích với Python 2.x.

    (Được đóng góp bởi Alexandre Vassalotti và Antoine Pitrou, bpo-6137.)

  • Một mô-đun mới, importlib đã được thêm vào. Nó cung cấp triển khai tham chiếu Python thuần túy, di động, hoàn chỉnh của câu lệnh import và đối tác của nó, hàm __import__(). Nó thể hiện một bước tiến đáng kể trong việc ghi chép và xác định các hành động diễn ra trong quá trình nhập khẩu.

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

Tối ưu hóa

Những cải tiến hiệu suất chính đã được thêm vào:

  • Thư viện I/O mới (như được định nghĩa trong PEP 3116) hầu hết được viết bằng Python và nhanh chóng được chứng minh là một nút cổ chai có vấn đề trong Python 3.0. Trong Python 3.1, thư viện I/O đã được viết lại hoàn toàn bằng C và nhanh hơn từ 2 đến 20 lần tùy thuộc vào tác vụ trước mắt. Phiên bản Python thuần túy vẫn có sẵn cho mục đích thử nghiệm thông qua mô-đun _pyio.

    (Được đóng góp bởi Amaury Forgeot d'Arc và Antoine Pitrou.)

  • Đã thêm một phương pháp phỏng đoán để các bộ dữ liệu và ký tự chỉ chứa các đối tượng không thể theo dõi sẽ không bị trình thu gom rác theo dõi. Điều này có thể giảm kích thước của các bộ sưu tập và do đó giảm chi phí thu gom rác trên các chương trình chạy dài, tùy thuộc vào cách sử dụng kiểu dữ liệu cụ thể của chúng.

    (Được đóng góp bởi Antoine Pitrou, bpo-4688.)

  • Khi bật tùy chọn cấu hình có tên --with-computed-gotos trên các trình biên dịch hỗ trợ nó (đặc biệt là: gcc, SunPro, icc), vòng đánh giá mã byte được biên dịch bằng cơ chế điều phối mới giúp tăng tốc lên tới 20%, tùy thuộc vào hệ thống, trình biên dịch và điểm chuẩn.

    (Được đóng góp bởi Antoine Pitrou cùng với một số người tham gia khác, bpo-4753).

  • Việc giải mã UTF-8, UTF-16 và LATIN-1 hiện nhanh hơn từ hai đến bốn lần.

    (Được đóng góp bởi Antoine Pitrou và Amaury Forgeot d'Arc, bpo-4868.)

  • Mô-đun json hiện có phần mở rộng C để cải thiện đáng kể hiệu suất của nó. Ngoài ra, API đã được sửa đổi để json chỉ hoạt động với str chứ không phải với bytes. Sự thay đổi đó làm cho mô-đun khớp chặt chẽ với JSON specification được xác định theo thuật ngữ Unicode.

    (Được đóng góp bởi Bob Ippolito và được Antoine Pitrou và Benjamin Peterson chuyển đổi sang Py3.1; bpo-4136.)

  • Bây giờ, việc giải nén sẽ thực hiện tên thuộc tính của các đối tượng được ngâm. Điều này giúp tiết kiệm bộ nhớ và cho phép dưa chua nhỏ hơn.

    (Được đóng góp bởi Jake McGuire và Antoine Pitrou; bpo-5084.)

IDLE

  • Menu định dạng của IDLE hiện cung cấp tùy chọn loại bỏ khoảng trắng ở cuối tệp nguồn.

    (Được đóng góp bởi Roger D. Serwy; bpo-5150.)

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:

  • Các số nguyên hiện được lưu trữ nội bộ trong cơ sở 2**15 hoặc trong cơ sở 2**30, cơ sở được xác định tại thời điểm xây dựng. Trước đây, chúng luôn được lưu trữ trong cơ sở 2**15. Việc sử dụng 2**30 cơ bản mang lại những cải thiện hiệu suất đáng kể trên máy 64 bit, nhưng kết quả điểm chuẩn trên máy 32 bit lại bị xáo trộn. Do đó, mặc định là sử dụng base 2**30 trên máy 64-bit và base 2**15 trên máy 32-bit; trên Unix, có một tùy chọn cấu hình mới --enable-big-digits có thể được sử dụng để ghi đè mặc định này.

    Ngoài những cải tiến về hiệu suất, thay đổi này sẽ không hiển thị với người dùng cuối, với một ngoại lệ: dành cho mục đích thử nghiệm và gỡ lỗi, còn có sys.int_info mới cung cấp thông tin về định dạng bên trong, cung cấp số bit trên mỗi chữ số và kích thước tính bằng byte của loại C được sử dụng để lưu trữ từng chữ số:

    >>> nhập hệ thống
    >>> sys.int_info
    sys.int_info(bits_per_digit=30, sizeof_digit=4)
    

    (Được đóng góp bởi Mark Dickinson; bpo-4258.)

  • Hàm PyLong_AsUnsignedLongLong() hiện xử lý pylong âm bằng cách tăng OverflowError thay vì TypeError.

    (Được đóng góp bởi Mark Dickinson và Lisandro Dalcrin; bpo-5175.)

  • PyNumber_Int() không được dùng nữa. Thay vào đó hãy sử dụng PyNumber_Long().

    (Được đóng góp bởi Mark Dickinson; bpo-4910.)

  • Đã thêm hàm PyOS_string_to_double() mới để thay thế các hàm PyOS_ascii_strtod()PyOS_ascii_atof() không còn được dùng nữa.

    (Được đóng góp bởi Mark Dickinson; bpo-5914.)

  • Đã thêm PyCapsule để thay thế cho PyCObject API. Sự khác biệt chính là loại mới có giao diện được xác định rõ ràng để truyền thông tin an toàn khi nhập và chữ ký ít phức tạp hơn để gọi hàm hủy. Loại cũ có API có vấn đề và hiện không được dùng nữa.

    (Được đóng góp bởi Larry Hastings; bpo-5630.)

Chuyển sang Python 3.1

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 biểu diễn chuỗi dấu phẩy động mới có thể phá vỡ các tài liệu hiện có. Ví dụ:

    chắc chắn e():
        '''Tính cơ số logarit tự nhiên.
    
        >>> e()
        2.7182818284590451
    
        '''
        trả về sum(1/math.factorial(x) cho x đảo ngược(range(30)))
    
    doctest.testmod()
    
    *************************************************************************
     dụ không thành công:
        e()
    Dự kiến:
        2.7182818284590451
    :
        2.718281828459045
    *************************************************************************
    
  • Việc ánh xạ lại tên tự động trong mô-đun dưa chua cho giao thức 2 trở xuống có thể khiến dưa chua Python 3.1 không thể đọc được trong Python 3.0. Một giải pháp là sử dụng giao thức 3. Một giải pháp khác là đặt tùy chọn fix_imports thành False. Xem cuộc thảo luận ở trên để biết thêm chi tiết.