Có gì mới trong Python 2.7¶
- 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.7. Python 2.7 được phát hành vào ngày 3 tháng 7 năm 2010.
Việc xử lý số đã được cải thiện theo nhiều cách, cho cả số dấu phẩy động và lớp Decimal. Có một số bổ sung hữu ích cho thư viện tiêu chuẩn, chẳng hạn như mô-đun unittest được cải tiến đáng kể, mô-đun argparse để phân tích các tùy chọn dòng lệnh, các lớp OrderedDict và Counter tiện lợi trong mô-đun collections và nhiều cải tiến khác.
Python 2.7 được lên kế hoạch là bản phát hành cuối cùng trong số 2.x, vì vậy chúng tôi đã nỗ lực làm cho nó trở thành một bản phát hành tốt về lâu dài. Để trợ giúp chuyển sang Python 3, một số tính năng mới từ dòng Python 3.x đã được đưa vào phiên bản 2.7.
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 đầy đủ chi tiết, bạn nên tham khảo tài liệu dành cho Python 2.7 tại https://python.go-mizu.dev.. Nếu bạn muốn hiểu lý do căn bản cho việc 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ể hoặc sự cố trên https://bugs.python.org trong đó một thay đổi đã được thảo luận. 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.
Tương lai cho Python 2.x¶
Python 2.7 là bản phát hành chính cuối cùng trong dòng 2.x, vì những người bảo trì Python đã chuyển trọng tâm nỗ lực phát triển tính năng mới của họ sang dòng Python 3.x. Điều này có nghĩa là mặc dù Python 2 tiếp tục được sửa lỗi và được cập nhật để xây dựng chính xác trên phần cứng mới cũng như các phiên bản của hệ điều hành được hỗ trợ, nhưng sẽ không có bản phát hành đầy đủ tính năng mới cho ngôn ngữ hoặc thư viện chuẩn.
Tuy nhiên, mặc dù có một tập hợp con chung lớn giữa Python 2.7 và Python 3 và nhiều thay đổi liên quan đến việc di chuyển sang tập hợp con chung đó hoặc trực tiếp sang Python 3 có thể được tự động hóa một cách an toàn, một số thay đổi khác (đặc biệt là những thay đổi liên quan đến xử lý Unicode) có thể yêu cầu xem xét cẩn thận và tốt nhất là các bộ kiểm tra hồi quy tự động mạnh mẽ để di chuyển hiệu quả.
Điều này có nghĩa là Python 2.7 sẽ tồn tại trong thời gian dài, cung cấp nền tảng cơ sở ổn định và được hỗ trợ cho các hệ thống sản xuất chưa được chuyển sang Python 3. Vòng đời dự kiến đầy đủ của dòng Python 2.7 được trình bày chi tiết trong PEP 373.
Một số hậu quả chính của ý nghĩa lâu dài của 2.7 là:
Như đã lưu ý ở trên, bản phát hành 2.7 có thời gian bảo trì lâu hơn nhiều so với các phiên bản 2.x trước đó. Python 2.7 hiện được dự kiến sẽ vẫn được nhóm phát triển cốt lõi hỗ trợ (nhận các bản cập nhật bảo mật và sửa lỗi khác) cho đến ít nhất là năm 2020 (10 năm sau khi phát hành lần đầu, so với thời gian hỗ trợ thông thường là 18--24 tháng).
Khi thư viện chuẩn Python 2.7 cũ đi, việc sử dụng hiệu quả Python Package Index (trực tiếp hoặc thông qua nhà phân phối lại) trở nên quan trọng hơn đối với người dùng Python 2. Ngoài nhiều gói của bên thứ ba cho nhiều tác vụ khác nhau, các gói có sẵn còn bao gồm bản sao lưu của các mô-đun và tính năng mới từ thư viện chuẩn Python 3 tương thích với Python 2, cũng như nhiều công cụ và thư viện khác nhau có thể giúp việc di chuyển sang Python 3 dễ dàng hơn. Python Packaging User Guide cung cấp hướng dẫn về cách tải xuống và cài đặt phần mềm từ Python Package Index.
Mặc dù cách tiếp cận ưa thích để nâng cao Python 2 hiện là xuất bản các gói mới trên Python Package Index, nhưng cách tiếp cận này không nhất thiết phải hiệu quả trong mọi trường hợp, đặc biệt là các gói liên quan đến bảo mật mạng. Trong các trường hợp đặc biệt không thể xử lý thỏa đáng bằng cách xuất bản các gói mới hoặc cập nhật trên PyPI, quy trình Đề xuất nâng cao Python có thể được sử dụng để bổ sung các tính năng mới trực tiếp vào thư viện chuẩn Python 2. Bất kỳ bổ sung nào như vậy và các bản phát hành bảo trì mà chúng được thêm vào sẽ được ghi chú trong phần Các tính năng mới được thêm vào bản phát hành bảo trì Python 2.7 bên dưới.
Đối với các dự án muốn chuyển từ Python 2 sang Python 3 hoặc dành cho các nhà phát triển thư viện và khung muốn hỗ trợ người dùng trên cả Python 2 và Python 3, có sẵn nhiều công cụ và hướng dẫn để giúp quyết định cách tiếp cận phù hợp và quản lý một số chi tiết kỹ thuật liên quan. Điểm bắt đầu được đề xuất là hướng dẫn Cách chuyển mã Python 2 sang Python 3 HOWTO.
Những thay đổi về cách xử lý cảnh báo khấu hao¶
Đối với Python 2.7, theo mặc định, một quyết định chính sách đã được đưa ra để tắt các cảnh báo mà chỉ các nhà phát triển quan tâm. DeprecationWarning và các hậu duệ của nó hiện bị bỏ qua trừ khi có yêu cầu khác, ngăn người dùng nhìn thấy các cảnh báo do ứng dụng kích hoạt. Thay đổi này cũng được thực hiện trong nhánh Python 3.2. (Đã thảo luận về stdlib-sig và được thực hiện trong bpo-7319.)
Trong các bản phát hành trước, thông báo DeprecationWarning được bật theo mặc định, cung cấp cho các nhà phát triển Python dấu hiệu rõ ràng về vị trí mã của họ có thể bị hỏng trong phiên bản Python chính trong tương lai.
Tuy nhiên, ngày càng có nhiều người dùng các ứng dụng dựa trên Python không trực tiếp tham gia vào việc phát triển các ứng dụng đó. Thông báo DeprecationWarning không liên quan đến những người dùng như vậy, khiến họ lo lắng về một ứng dụng thực sự hoạt động bình thường và tạo gánh nặng cho các nhà phát triển ứng dụng trong việc giải quyết những lo ngại này.
Bạn có thể bật lại hiển thị thông báo DeprecationWarning bằng cách chạy Python bằng khóa chuyển -Wdefault (dạng ngắn: -Wd) hoặc bằng cách đặt biến môi trường PYTHONWARNINGS thành "default" (hoặc "d") trước khi chạy Python. Mã Python cũng có thể kích hoạt lại chúng bằng cách gọi warnings.simplefilter('default').
Mô-đun unittest cũng tự động kích hoạt lại cảnh báo ngừng sử dụng khi chạy thử nghiệm.
Tính năng của Python 3.1¶
Giống như Python 2.6 tích hợp các tính năng từ Python 3.0, phiên bản 2.7 kết hợp một số tính năng mới trong Python 3.1. Dòng 2.x tiếp tục cung cấp các công cụ để chuyển sang dòng 3.x.
Danh sách một phần các tính năng 3.1 đã được chuyển sang 2.7:
Cú pháp cho các ký tự cố định (
{1,2,3}là một tập hợp có thể thay đổi).Từ điển và tập hợp hiểu biết (
{i: i*2 for i in range(3)}).Nhiều trình quản lý bối cảnh trong một câu lệnh
with.Phiên bản mới của thư viện
io, được viết lại bằng C để tăng hiệu suất.Loại từ điển có thứ tự được mô tả trong PEP 372: Thêm từ điển có thứ tự vào bộ sưu tập.
Công cụ xác định định dạng
","mới được mô tả trong PEP 378: Công cụ xác định định dạng cho dấu phân cách hàng nghìn.Đối tượng
memoryview.Một tập hợp con nhỏ của mô-đun
importlib, described below.repr()của floatxngắn hơn trong nhiều trường hợp: giờ đây nó dựa trên chuỗi thập phân ngắn nhất được đảm bảo làm tròn trở lạix. Giống như các phiên bản trước của Python, đảm bảo rằngfloat(repr(x))sẽ phục hồix.Chuyển đổi float-to-string và string-to-float được làm tròn chính xác. Hàm
round()hiện cũng đã được làm tròn chính xác.Loại
PyCapsule, được sử dụng để cung cấp C API cho các mô-đun mở rộng.Hàm
PyLong_AsLongAndOverflow()C API.
Các cảnh báo chế độ Python3 mới khác bao gồm:
operator.isCallable()vàoperator.sequenceIncludes(), không được hỗ trợ trong 3.x, hiện kích hoạt cảnh báo.Công tắc
-3hiện tự động kích hoạt công tắc-Qwarngây ra cảnh báo về việc sử dụng phép chia cổ điển với số nguyên và số nguyên dài.
PEP 372: Thêm từ điển có thứ tự vào bộ sưu tập¶
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 đó, phiên bản 2.7 giới thiệu lớp OrderedDict mới trong mô-đun collections.
OrderedDict API cung cấp giao diện giống như từ điển thông thường nhưng lặp lại các khóa và giá trị theo 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
>>> từ bộ sưu tập nhập OrderedDict
>>> d = OrderedDict([('first', 1),
... ('thứ hai', 2),
... ('thứ ba', 3)])
>>> d.items()
[('thứ nhất', 1), ('thứ hai', 2), ('thứ ba', 3)]
Nếu một mục nhập mới ghi đè lên mục nhập hiện có thì vị trí chèn ban đầu sẽ không thay đổi:
>>> d['giây'] = 4
>>> d.items()
[('thứ nhất', 1), ('thứ hai', 4), ('thứ ba', 3)]
Xóa một mục và chèn lại nó sẽ chuyển nó đến cuối
>>> del d['giây']
>>> d['giây'] = 5
>>> d.items()
[('thứ nhất', 1), ('thứ ba', 3), ('thứ hai', 5)]
Phương thức popitem() có một đối số last tùy chọn mặc định là True. Nếu last đúng, khóa được thêm gần đây nhất sẽ được trả về và xóa; nếu sai, khóa cũ nhất sẽ được chọn:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
So sánh hai từ điển được sắp xếp sẽ kiểm tra cả khóa và giá trị, đồng thời yêu cầu thứ tự chèn phải giống nhau:
>>> od1 = OrderedDict([('first', 1),
... ('thứ hai', 2),
... ('thứ ba', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('đầu tiên', 1),
... ('thứ hai', 2)])
>>> od1 == od2
sai
>>> # Move phím 'thứ ba' đến cuối
>>> del od2['thứ ba']; od2['thứ ba'] = 3
>>> od1 == od2
đúng
So sánh OrderedDict với từ điển thông thường sẽ bỏ qua thứ tự chèn và chỉ so sánh các khóa và giá trị.
OrderedDict hoạt động như thế nào? Nó duy trì một danh sách các khóa được liên kết đôi, thêm các khóa mới vào danh sách khi chúng được chèn vào. Từ điển phụ ánh xạ các khóa tới nút danh sách tương ứng của chúng, do đó việc xóa không cần phải duyệt qua toàn bộ danh sách được liên kết và do đó vẫn giữ nguyên O(1).
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
ConfigParsersử dụng chúng theo mặc định, nghĩa là giờ đây các tệp cấu hình có thể được đọc, sửa đổi và sau đó ghi lại theo thứ tự ban đầu.Phương thức
_asdict()chocollections.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.Hàm tạo lớp
JSONDecodercủa mô-đunjsonđã được mở rộng với tham số object_pairs_hook để cho phép bộ giải mã xây dựng các phiên bảnOrderedDict. 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 - Thêm từ điển được sắp xếp vào bộ sưu tập
PEP được viết bởi Armin Ronacher và Raymond Hettinger; được thực hiện bởi Raymond Hettinger.
PEP 378: Công cụ xác định định dạng cho dấu phân cách hàng nghìn¶
Để làm cho đầu ra của chương trình dễ đọc hơn, có thể hữu ích nếu thêm dấu phân cách vào số lớn, hiển thị chúng dưới dạng 18,446,744,073,709,551,616 thay vì 18446744073709551616.
Giải pháp tổng quát để thực hiện việc này là mô-đun locale, mô-đun này có thể sử dụng các dấu tách khác nhau ("," ở Bắc Mỹ, "." ở Châu Âu) và các kích cỡ nhóm khác nhau, nhưng locale phức tạp để sử dụng và không phù hợp với các ứng dụng đa luồng trong đó các luồng khác nhau đang tạo ra đầu ra cho các ngôn ngữ khác nhau.
Do đó, một cơ chế nhóm dấu phẩy đơn giản đã được thêm vào ngôn ngữ nhỏ được phương pháp str.format() sử dụng. Khi định dạng số dấu phẩy động, chỉ cần bao gồm dấu phẩy giữa chiều rộng và độ chính xác:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
Khi định dạng một số nguyên, hãy bao gồm dấu phẩy sau chiều rộng:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Cơ chế này hoàn toàn không thích ứng được; Dấu phẩy luôn được sử dụng làm dấu phân cách và việc nhóm luôn thành các nhóm có ba chữ số. Cơ chế định dạng dấu phẩy không chung chung như mô-đun locale nhưng dễ sử dụng hơ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; được thực hiện bởi Eric Smith.
PEP 389: Mô-đun argparse để phân tích dòng lệnh¶
Mô-đun argparse để phân tích các đối số dòng lệnh đã được thêm vào như một sự thay thế mạnh mẽ hơn cho mô-đun optparse.
Điều này có nghĩa là Python hiện hỗ trợ ba mô-đun khác nhau để phân tích các đối số dòng lệnh: getopt, optparse và argparse. Mô-đun getopt gần giống với hàm getopt() của thư viện C, vì vậy nó vẫn hữu ích nếu bạn đang viết một nguyên mẫu Python mà cuối cùng sẽ được viết lại bằng C. optparse trở nên dư thừa nhưng không có kế hoạch loại bỏ nó vì có nhiều tập lệnh vẫn sử dụng nó và không có cách tự động nào để cập nhật các tập lệnh này. (Việc tạo argparse API nhất quán với giao diện của optparse đã được thảo luận nhưng bị từ chối vì quá lộn xộn và khó khăn.)
Tóm lại, nếu bạn đang viết một tập lệnh mới và không cần lo lắng về khả năng tương thích với các phiên bản Python trước đó, hãy sử dụng argparse thay vì optparse.
Đây là một ví dụ:
nhập khẩu argparse
trình phân tích cú pháp = argparse.ArgumentParser(description='Ví dụ dòng lệnh.')
công tắc tùy chọn # Add
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='tạo ra kết quả dài dòng')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='chuyển hướng đầu ra sang FILE thay vì stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', mặc định=0,
help='hiển thị các dòng NUM của ngữ cảnh được thêm vào')
# Allow bất kỳ số lượng đối số bổ sung nào.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='nhập tên file (mặc định là stdin)')
args = trình phân tích cú pháp.parse_args()
in args.__dict__
Trừ khi bạn ghi đè lên nó, các công tắc -h và --help sẽ tự động được thêm vào và tạo ra đầu ra được định dạng gọn gàng:
-> ./python.exe argparse-example.py --help
cách sử dụng: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [đầu vào [đầu vào ...]]
Ví dụ dòng lệnh.
lập luận vị trí:
đầu vào tên tập tin đầu vào (mặc định là stdin)
đối số tùy chọn:
-h, --help hiển thị thông báo trợ giúp này và thoát
-v tạo đầu ra dài dòng
-o FILE xuất trực tiếp tới FILE thay vì thiết bị xuất chuẩn
-C NUM hiển thị các dòng NUM của ngữ cảnh được thêm vào
Giống như optparse, các đối số và chuyển đổi dòng lệnh được trả về dưới dạng đối tượng với các thuộc tính được đặt tên theo tham số dest:
-> ./python.exe argparse-example.py -v
{'đầu ra': Không,
'is_verbose': Đúng,
'bối cảnh': 0,
'đầu vào': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'đầu ra': '/tmp/đầu ra',
'is_verbose': Đúng,
'bối cảnh': 4,
'đầu vào': ['file1', 'file2']}
argparse có xác nhận phức tạp hơn nhiều so với optparse; bạn có thể chỉ định số lượng đối số chính xác dưới dạng số nguyên, 0 đối số trở lên bằng cách truyền '*', 1 hoặc nhiều đối số bằng cách truyền '+' hoặc một đối số tùy chọn với '?'. Trình phân tích cú pháp cấp cao nhất có thể chứa các trình phân tích cú pháp phụ để xác định các lệnh phụ có các nhóm công tắc khác nhau, như trong svn commit, svn checkout, v.v. Bạn có thể chỉ định loại đối số là FileType, thao tác này sẽ tự động mở tệp cho bạn và hiểu rằng '-' có nghĩa là đầu vào hoặc đầu ra tiêu chuẩn.
Xem thêm
- tài liệu
argparse Trang tài liệu của mô-đun argparse.
- Di chuyển mã optparse sang argparse
Một phần của tài liệu Python, mô tả cách chuyển đổi mã sử dụng
optparse.- PEP 389 - argparse - Mô-đun phân tích dòng lệnh mới
PEP được viết và triển khai bởi Steven Bethard.
PEP 391: Cấu hình dựa trên từ điển để ghi nhật ký¶
Mô-đun logging rất linh hoạt; các ứng dụng có thể xác định một cây gồm các hệ thống con ghi nhật ký và mỗi trình ghi nhật ký trong cây này có thể lọc ra một số thông báo nhất định, định dạng chúng theo cách khác nhau và gửi thông báo trực tiếp đến một số trình xử lý khác nhau.
Tất cả tính linh hoạt này có thể yêu cầu rất nhiều cấu hình. Bạn có thể viết các câu lệnh Python để tạo các đối tượng và thiết lập các thuộc tính của chúng, nhưng việc thiết lập phức tạp đòi hỏi mã dài dòng nhưng nhàm chán. logging cũng hỗ trợ chức năng fileConfig() phân tích tệp, nhưng định dạng tệp không hỗ trợ định cấu hình bộ lọc và việc tạo theo chương trình sẽ rắc rối hơn.
Python 2.7 bổ sung chức năng dictConfig() sử dụng từ điển để định cấu hình ghi nhật ký. Có nhiều cách để tạo một từ điển từ nhiều nguồn khác nhau: xây dựng một từ điển bằng mã; phân tích tệp chứa JSON; hoặc sử dụng thư viện phân tích cú pháp YAML nếu đã cài đặt. Để biết thêm thông tin, xem Chức năng cấu hình.
Ví dụ sau đây định cấu hình hai trình ghi nhật ký, trình ghi nhật ký gốc và trình ghi nhật ký có tên "mạng". Các tin nhắn được gửi tới trình ghi nhật ký gốc sẽ được gửi đến nhật ký hệ thống bằng giao thức nhật ký hệ thống và các tin nhắn tới trình ghi nhật ký "mạng" sẽ được ghi vào tệp network.log. Tệp này sẽ được xoay khi nhật ký đạt 1 MB.
nhập nhật ký
nhập log.config
cấu hình = {
'phiên bản': lược đồ 1, # Configuration đang được sử dụng; bây giờ phải là 1
'trình định dạng': {
'tiêu chuẩn': {
'định dạng': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'trình xử lý': {'netlog': {'backupCount': 10,
'lớp': 'logging.handlers.RotatingFileHandler',
'tên tệp': '/logs/network.log',
'trình định dạng': 'tiêu chuẩn',
'cấp độ': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'trình định dạng': 'tiêu chuẩn',
'cấp độ': 'ERROR'}},
# Specify tất cả các logger cấp dưới
'người ghi nhật ký': {
'mạng': {
'trình xử lý': ['netlog']
}
},
Thuộc tính # Specify của trình ghi nhật ký gốc
'gốc': {
'trình xử lý': ['syslog']
},
}
# Set up cấu hình
ghi nhật ký.config.dictConfig(configdict)
# As một ví dụ, ghi lại hai thông báo lỗi
logger = log.getLogger('/')
logger.error('Không tìm thấy cơ sở dữ liệu')
netlogger = log.getLogger('mạng')
netlogger.error('Kết nối thất bại')
Ba cải tiến nhỏ hơn cho mô-đun logging, tất cả đều do Vinay Sajip triển khai, là:
Lớp
SysLogHandlerhiện hỗ trợ ghi nhật ký hệ thống trên TCP. Hàm tạo có tham số socktype cung cấp loại ổ cắm sẽ sử dụng,socket.SOCK_DGRAMcho UDP hoặcsocket.SOCK_STREAMcho TCP. Giao thức mặc định vẫn là UDP.Các phiên bản
Loggerđã có được phương thứcgetChild()để truy xuất trình ghi nhật ký hậu duệ bằng đường dẫn tương đối. Ví dụ: khi bạn truy xuất trình ghi nhật ký bằng cách thực hiệnlog = getLogger('app'), việc gọilog.getChild('network.listen')tương đương vớigetLogger('app.network.listen').Lớp
LoggerAdapterđã nhận được một phương thứcisEnabledFor()sử dụng level và trả về xem trình ghi nhật ký cơ bản có xử lý thông báo ở mức độ quan trọng đó hay không.
Xem thêm
- PEP 391 - Cấu hình dựa trên từ điển để ghi nhật ký
PEP được viết và triển khai bởi Vinay Sajip.
PEP 3106: Lượt xem từ điển¶
Các phương thức từ điển keys(), values() và items() khác nhau trong Python 3.x. Chúng trả về một đối tượng có tên là view thay vì một danh sách được cụ thể hóa đầy đủ.
Không thể thay đổi giá trị trả về của keys(), values() và items() trong Python 2.7 vì quá nhiều mã sẽ bị hỏng. Thay vào đó, các phiên bản 3.x đã được thêm vào dưới tên mới viewkeys(), viewvalues() và viewitems().
>>> d = dict((i*10, chr(65+i)) cho i trong phạm vi (26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
Các chế độ xem có thể được lặp lại, nhưng các chế độ xem khóa và mục cũng hoạt động giống như các tập hợp. Toán tử & thực hiện giao lộ và | thực hiện liên kết:
>>> d1 = dict((i*10, chr(65+i)) cho i trong phạm vi(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | phạm vi (0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
Chế độ xem theo dõi từ điển và nội dung của nó thay đổi khi từ điển được sửa đổi
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
Tuy nhiên, lưu ý rằng bạn không thể thêm hoặc xóa khóa trong khi lặp lại chế độ xem:
>>> cho k trong vk:
... d[k*2] = k
...
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
RuntimeError: kích thước từ điển đã thay đổi trong quá trình lặp
Bạn có thể sử dụng các phương thức xem trong mã Python 2.x và trình chuyển đổi 2to3 sẽ thay đổi chúng thành các phương thức keys(), values() và items() tiêu chuẩn.
PEP 3137: Đối tượng MemoryView¶
Đối tượng memoryview cung cấp chế độ xem nội dung bộ nhớ của đối tượng khác phù hợp với giao diện của loại bytes.
>>> nhập chuỗi
>>> m = Memoryview(string.letters)
>>> tôi
<bộ nhớ tại 0x37f850>
>>> len(m) # Returns chiều dài của đối tượng cơ bản
52
>>> m[0], m[25], m[26] # Indexing trả về một byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing trả về một chế độ xem bộ nhớ khác
>>> m2
<bộ nhớ tại 0x37f080>
Nội dung của dạng xem có thể được chuyển đổi thành một chuỗi byte hoặc danh sách các số nguyên:
>>> m2.tobyte()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
Các đối tượng memoryview cho phép sửa đổi đối tượng cơ bản nếu đó là đối tượng có thể thay đổi.
>>> m2[0] = 75
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
TypeError: không thể sửa đổi bộ nhớ chỉ đọc
>>> b = bytearray(string.letters) # Creating một đối tượng có thể thay đổi
>>>b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = viewview(b)
>>> mb[0] = '*' # Assign để xem, thay đổi bytearray.
>>> b[0:5] bytearray # The đã được thay đổi.
bytearray(b'*bcde')
>>>
Những thay đổi ngôn ngữ khác¶
Một số thay đổi nhỏ hơn được thực hiện đối với ngôn ngữ Python cốt lõi là:
Cú pháp cho các ký tự cố định đã được nhập lại từ Python 3.x. Dấu ngoặc nhọn được sử dụng để bao quanh nội dung của tập hợp có thể thay đổi kết quả; các ký tự cố định được phân biệt với từ điển bằng cách không chứa dấu hai chấm và giá trị.
{}tiếp tục đại diện cho một từ điển trống; sử dụngset()cho một bộ trống.>>> {1, 2, 3, 4, 5} bộ([1, 2, 3, 4, 5]) >>> set() # empty bộ đặt([]) >>> {} lệnh # empty {}
Được hỗ trợ bởi Alexandre Vassalotti; bpo-2335.
Khả năng hiểu từ điển và tập hợp là một tính năng khác được chuyển từ phiên bản 3.x, khái quát hóa khả năng hiểu danh sách/trình tạo để sử dụng cú pháp theo nghĩa đen cho các tập hợp và từ điển.
>>> {x: x*x cho x trong phạm vi(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) cho x trong phạm vi (6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
Được hỗ trợ bởi Alexandre Vassalotti; bpo-2333.
Câu lệnh
withhiện có thể sử dụng nhiều trình quản lý bối cảnh trong một câu lệnh. Trình quản lý bối cảnh được xử lý từ trái sang phải và mỗi trình quản lý được coi là bắt đầu một câu lệnhwithmới. Điều này có nghĩa là:với A() là a, B() là b: ... bộ tuyên bố ...
tương đương với:
với A() là: với B() là b: ... bộ tuyên bố ...
Hàm
contextlib.nested()cung cấp một chức năng rất giống nhau nên không còn cần thiết nữa và không còn được dùng nữa.(Được đề xuất trong https://codereview.appspot.com/53094; do Georg Brandl thực hiện.)
Chuyển đổi giữa số dấu phẩy động và chuỗi hiện được làm tròn chính xác trên hầu hết các nền tảng. Những chuyển đổi này xảy ra ở nhiều nơi khác nhau:
str()trên số float và số phức; các hàm tạofloatvàcomplex; định dạng số; tuần tự hóa và giải tuần tự hóa các số float và số phức bằng cách sử dụng các mô-đunmarshal,picklevàjson; phân tích cú pháp các ký tự float và ảo trong mã Python; và chuyển đổiDecimalsang float.Liên quan đến vấn đề này,
repr()của số dấu phẩy động x hiện trả về kết quả dựa trên chuỗi thập phân ngắn nhất được đảm bảo làm tròn trở lại x khi làm tròn chính xác (với chế độ làm tròn từ nửa đến chẵn). Trước đây nó đưa ra một chuỗi dựa trên việc làm tròn x đến 17 chữ số thập phân.Thư viện làm tròn chịu trách nhiệm cho cải tiến này hoạt động trên Windows và trên nền tảng Unix bằng cách sử dụng trình biên dịch gcc, icc hoặc suncc. Có thể có một số ít nền tảng không thể đảm bảo hoạt động chính xác của mã này nên mã không được sử dụng trên các hệ thống như vậy. Bạn có thể biết mã nào đang được sử dụng bằng cách kiểm tra
sys.float_repr_style, đó sẽ làshortnếu mã mới được sử dụng vàlegacynếu không.Được thực hiện bởi Eric Smith và Mark Dickinson, sử dụng thư viện
dtoa.ccủa David Gay; bpo-7117.Chuyển đổi từ số nguyên dài và số nguyên thông thường sang dấu phẩy động giờ đây được làm tròn khác nhau, trả về số dấu phẩy động gần nhất với số đó. Điều này không thành vấn đề đối với các số nguyên nhỏ có thể được chuyển đổi chính xác, nhưng đối với các số lớn chắc chắn sẽ mất độ chính xác, Python 2.7 hiện gần đúng hơn. Ví dụ: Python 2.6 đã tính toán như sau
>>> n = 295147905179352891391 >>> thả nổi(n) 2.9514790517935283e+20 >>> n - dài(float(n)) 65535L
Kết quả dấu phẩy động của Python 2.7 lớn hơn nhưng gần với giá trị thực hơn nhiều:
>>> n = 295147905179352891391 >>> thả nổi(n) 2.9514790517935289e+20 >>> n - dài(float(n)) -1L
(Được thực hiện bởi Mark Dickinson; bpo-3166.)
Phép chia số nguyên cũng chính xác hơn trong hành vi làm tròn của nó. (Cũng được thực hiện bởi Mark Dickinson; bpo-1811.)
Sự ép buộc ngầm đối với số phức đã bị loại bỏ; trình thông dịch sẽ không còn cố gắng gọi phương thức
__coerce__()trên các đối tượng phức tạp nữa. (Đã bị xóa bởi Meador Inge và Mark Dickinson; bpo-5211.)Phương pháp
str.format()hiện hỗ trợ đánh số tự động các trường thay thế. Điều này làm cho việc sử dụngstr.format()gần giống hơn với việc sử dụng định dạng%s:>>> '{}:{}:{}'.format(2009, 04, 'Chủ nhật') '2009:4:Chủ Nhật' >>> '{}:{}:{day}'.format(2009, 4, day='Chủ nhật') '2009:4:Chủ nhật'
Việc đánh số tự động sẽ lấy các trường từ trái sang phải, do đó, trình xác định
{...}đầu tiên sẽ sử dụng đối số đầu tiên chostr.format(), trình xác định tiếp theo sẽ sử dụng đối số tiếp theo, v.v. Bạn không thể kết hợp đánh số tự động và đánh số rõ ràng -- đánh số tất cả các trường chỉ định của bạn hoặc không đánh số nào trong số đó -- nhưng bạn có thể kết hợp đánh số tự động và trường được đặt tên, như trong ví dụ thứ hai ở trên. (Được đóng góp bởi Eric Smith; bpo-5237.)Số phức hiện hỗ trợ chính xác việc sử dụng với
format()và được căn chỉnh theo mặc định. Việc chỉ định độ chính xác hoặc phân tách bằng dấu phẩy áp dụng cho cả phần thực và phần ảo của số, nhưng độ rộng trường và căn chỉnh được chỉ định sẽ được áp dụng cho toàn bộ đầu ra1.5+3jthu được. (Được đóng góp bởi Eric Smith; bpo-1588 và bpo-7988.)Mã định dạng 'F' hiện luôn định dạng đầu ra bằng cách sử dụng các ký tự viết hoa, vì vậy giờ đây nó sẽ tạo ra 'INF' và 'NAN'. (Được đóng góp bởi Eric Smith; bpo-3382.)
Thay đổi ở mức độ thấp: phương thức
object.__format__()hiện kích hoạtPendingDeprecationWarningnếu nó được truyền một chuỗi định dạng, vì phương thức__format__()choobjectchuyển đổi đối tượng thành một biểu diễn chuỗi và định dạng chuỗi đó. Trước đây, phương thức này âm thầm áp dụng chuỗi định dạng vào biểu diễn chuỗi, nhưng điều đó có thể che giấu các lỗi trong mã Python. Nếu bạn đang cung cấp thông tin định dạng như căn chỉnh hoặc độ chính xác, có lẽ bạn đang mong đợi định dạng được áp dụng theo một số cách dành riêng cho đối tượng. (Đã sửa bởi Eric Smith; bpo-7994.)Các loại
int()vàlong()có phương thứcbit_lengthtrả về số bit cần thiết để biểu thị đối số của nó ở dạng nhị phân:>>> n = 37 >>> thùng(n) '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 và Victor Stinner; bpo-3439.)
Câu lệnh
importsẽ không còn thử nhập tuyệt đối nếu quá trình nhập tương đối (ví dụ:from .os import sep) không thành công. Điều này sửa một lỗi nhưng có thể phá vỡ một số câu lệnhimportchỉ vô tình hoạt động. (Đã sửa bởi Meador Inge; bpo-7902.)Giờ đây, một lớp con của loại
unicodetích hợp có thể ghi đè phương thức__unicode__(). (Được thực hiện bởi Victor Stinner; bpo-1583863.)Phương thức
translate()của loạibytearrayhiện chấp nhậnNonelàm đối số đầu tiên. (Đã sửa bởi Georg Brandl; bpo-4759.)Khi sử dụng
@classmethodvà@staticmethodđể bọc các phương thức dưới dạng lớp hoặc phương thức tĩnh, đối tượng trình bao bọc hiện hiển thị hàm được bao bọc dưới dạng thuộc tính__func__của chúng. (Được đóng góp bởi Amaury Forgeot d'Arc, sau gợi ý của George Sakkis; bpo-5982.)Khi một tập hợp thuộc tính bị hạn chế được đặt bằng
__slots__, việc xóa một thuộc tính chưa được đặt sẽ không làm tăngAttributeErrornhư bạn mong đợi. Đã sửa bởi Benjamin Peterson; bpo-7604.)Hai bảng mã mới hiện được hỗ trợ: "cp720", được sử dụng chủ yếu cho văn bản tiếng Ả Rập; và "cp858", một biến thể của CP 850 có thêm ký hiệu đồng euro. (CP720 do Alexander Belchenko và Amaury Forgeot d'Arc đóng góp trong bpo-1616979; CP858 do Tim Hatch đóng góp trong bpo-8016.)
Đối tượng
filebây giờ sẽ đặt thuộc tínhfilenametrên ngoại lệIOErrorkhi cố gắng mở một thư mục trên nền tảng POSIX (được lưu ý bởi Jan Kaliszewski; bpo-4764), đồng thời hiện kiểm tra rõ ràng và cấm ghi vào các đối tượng tệp chỉ đọc thay vì tin tưởng vào thư viện C để bắt và báo cáo lỗi (đã được sửa bởi Stefan Krah; bpo-5677).Trình mã thông báo Python hiện tự dịch các kết thúc dòng, do đó, hàm tích hợp
compile()hiện chấp nhận mã bằng cách sử dụng bất kỳ quy ước kết thúc dòng nào. Ngoài ra, nó không còn yêu cầu mã kết thúc bằng dòng mới.Dấu ngoặc đơn bổ sung trong định nghĩa hàm là bất hợp pháp trong Python 3.x, nghĩa là bạn gặp lỗi cú pháp từ
def f((x)): pass. Trong chế độ cảnh báo Python3, Python 2.7 giờ đây sẽ cảnh báo về cách sử dụng kỳ quặc này. (Được ghi nhận bởi James Lingard; bpo-7362.)Bây giờ có thể tạo các tham chiếu yếu tới các đối tượng lớp kiểu cũ. Các lớp kiểu mới luôn có khả năng tham chiếu yếu. (Đã sửa bởi Antoine Pitrou; bpo-8268.)
Khi một đối tượng mô-đun được thu thập rác, từ điển của mô-đun hiện chỉ bị xóa nếu không có ai khác đang giữ tham chiếu đến từ điển (bpo-7140).
Thay đổi thông dịch viên¶
Một biến môi trường mới, PYTHONWARNINGS, cho phép kiểm soát các cảnh báo. Nó phải được đặt thành một chuỗi chứa các cài đặt cảnh báo, tương đương với các cài đặt được sử dụng với công tắc -W, được phân tách bằng dấu phẩy. (Được đóng góp bởi Brian Curtin; bpo-7301.)
Ví dụ: cài đặt sau sẽ in cảnh báo mỗi khi chúng xảy ra nhưng lại biến cảnh báo từ mô-đun Cookie thành lỗi. (Cú pháp chính xác để đặt biến môi trường khác nhau tùy theo hệ điều hành và shell.)
xuất PYTHONWARNINGS=all,error:::Cookie:0
Tối ưu hóa¶
Một số cải tiến hiệu suất đã được thêm vào:
Một opcode mới đã được thêm vào để thực hiện thiết lập ban đầu cho các câu lệnh
with, tra cứu các phương thức__enter__()và__exit__(). (Được đóng góp bởi Benjamin Peterson.)Trình thu gom rác hiện hoạt động tốt hơn đối với một kiểu sử dụng phổ biến: khi nhiều đối tượng được phân bổ mà không giải phóng bất kỳ đối tượng nào trong số đó. Việc này trước đây sẽ mất thời gian bậc hai để thu gom rác, nhưng giờ đây số lượng thu gom rác đầy đủ đã giảm khi số lượng đối tượng trên heap tăng lên. Logic mới chỉ thực hiện quá trình thu gom rác đầy đủ khi thế hệ giữa đã được thu thập 10 lần và khi số lượng đối tượng sống sót từ thế hệ giữa vượt quá 10% số lượng đối tượng ở thế hệ cũ nhất. (Được đề xuất bởi Martin von Löwis và được thực hiện bởi Antoine Pitrou; bpo-4074.)
Trình thu gom rác cố gắng tránh theo dõi các thùng chứa đơn giản không thể là một phần của chu trình. Trong Python 2.7, điều này hiện đúng đối với các bộ dữ liệu và ký tự chứa các kiểu nguyên tử (chẳng hạn như int, chuỗi, v.v.). Về mặt bắc cầu, một lệnh chứa các bộ dữ liệu thuộc loại nguyên tử cũng sẽ không được theo dõi. Điều này giúp giảm chi phí cho mỗi lần thu gom rác bằng cách giảm số lượng đối tượng được người thu gom xem xét và duyệt qua. (Được đóng góp bởi Antoine Pitrou; bpo-4688.)
Các số nguyên dài hiện được lưu trữ nội bộ trong cơ sở
2**15hoặ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ụng2**30cơ 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 không đồng đều. Do đó, mặc định là sử dụng base2**30trên máy 64-bit và base2**15trên máy 32-bit; trên Unix, có một tùy chọn cấu hình mới--enable-big-digitscó 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ệ: nhằm mục đích thử nghiệm và gỡ lỗi, còn có structseq
sys.long_infomớ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.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Được đóng góp bởi Mark Dickinson; bpo-4258.)
Một loạt thay đổi khác làm cho các đối tượng dài nhỏ hơn vài byte: nhỏ hơn 2 byte trên hệ thống 32 bit và 6 byte trên hệ thống 64 bit. (Được đóng góp bởi Mark Dickinson; bpo-5260.)
Thuật toán chia cho các số nguyên dài đã được thực hiện nhanh hơn bằng cách thắt chặt vòng lặp bên trong, thực hiện các phép dịch thay vì phép nhân và sửa một lần lặp bổ sung không cần thiết. Các điểm chuẩn khác nhau cho thấy tốc độ tăng từ 50% đến 150% đối với phép chia số nguyên dài và phép tính modulo. (Được đóng góp bởi Mark Dickinson; bpo-5512.) Các hoạt động theo bit cũng nhanh hơn đáng kể (bản vá ban đầu của Gregory Smith; bpo-1087418).
Việc triển khai
%kiểm tra toán hạng bên trái có phải là chuỗi Python và các trường hợp đặc biệt của nó hay không; điều này dẫn đến tăng hiệu suất 1--3% cho các ứng dụng thường xuyên sử dụng%với chuỗi, chẳng hạn như thư viện tạo khuôn mẫu. (Được thực hiện bởi Collin Winter; bpo-5176.)Việc hiểu danh sách với điều kiện
ifđược biên dịch thành mã byte nhanh hơn. (Bản vá của Antoine Pitrou, được Jeffrey Yasskin chuyển sang phiên bản 2.7; bpo-4715.)Việc chuyển đổi một số nguyên hoặc số nguyên dài thành chuỗi thập phân được thực hiện nhanh hơn nhờ cơ số 10 có vỏ đặc biệt thay vì sử dụng hàm chuyển đổi tổng quát hỗ trợ các cơ số tùy ý. (Bản vá của Gawain Bolton; bpo-6713.)
Các phương thức
split(),replace(),rindex(),rpartition()vàrsplit()thuộc loại giống chuỗi (chuỗi, chuỗi Unicode và đối tượngbytearray) hiện sử dụng thuật toán tìm kiếm ngược nhanh thay vì quét từng ký tự. Điều này đôi khi nhanh hơn gấp 10 lần. (Được thêm bởi Florent Xicluna; bpo-7462 và bpo-7622.)Các mô-đun
picklevàcPicklehiện tự động thực hiện các chuỗi được sử dụng cho tên thuộc tính, giảm mức sử dụng bộ nhớ của các đối tượng do việc giải nén. (Được đóng góp bởi Jake McGuire; bpo-5084.)Mô-đun
cPicklehiện là từ điển dành cho các trường hợp đặc biệt, giảm gần một nửa thời gian cần thiết để chọn chúng. (Được đóng góp bởi Collin Winter; bpo-5670.)
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.
Lớp gỡ lỗi cơ sở
Bdbcủa mô-đunbdbđã có được tính năng bỏ qua các mô-đun. Giờ đây, hàm tạo có thể lặp lại chứa các mẫu kiểu toàn cầu nhưdjango.*; trình gỡ lỗi sẽ không bước vào các khung ngăn xếp từ mô-đun khớp với một trong các mẫu này. (Được đóng góp bởi Maru Newby sau gợi ý của Senthil Kumaran; bpo-5142.)Mô-đun
binasciihiện hỗ trợ bộ đệm API, vì vậy nó có thể được sử dụng với các phiên bảnmemoryviewvà các đối tượng bộ đệm tương tự khác. (Được chuyển lại từ phiên bản 3.x bởi Florent Xicluna; bpo-7703.)Mô-đun đã cập nhật: mô-đun
bsddbđã được cập nhật từ 4.7.2devel9 lên phiên bản 4.8.4 của the pybsddb package. Phiên bản mới có tính năng tương thích Python 3.x tốt hơn, sửa nhiều lỗi khác nhau và bổ sung một số cờ và phương thức BerkeleyDB mới. (Được cập nhật bởi Jesús Cea Avión; bpo-8156. Có thể đọc nhật ký thay đổi pybsddb tại https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)BZ2Filecủa mô-đunbz2hiện hỗ trợ giao thức quản lý ngữ cảnh, vì vậy bạn có thể viếtwith bz2.BZ2File(...) as f:. (Được đóng góp bởi Hagen Fürstenau; bpo-3860.)Lớp mới: lớp
Countertrong mô-đuncollectionsrất hữu ích cho việc kiểm đếm dữ liệu. Các phiên bảnCounterhoạt động chủ yếu giống như từ điển nhưng trả về 0 cho các khóa bị thiếu thay vì đưa raKeyError:>>> từ bộ đếm nhập bộ sưu tập >>> c = Bộ đếm() >>> cho chữ cái trong 'đây là mẫu văn bản tiếng Anh': ... c[chữ cái] += 1 ... >>> c Bộ đếm({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
Có ba phương pháp
Counterbổ sung.most_common()trả về N phần tử phổ biến nhất và số lượng của chúng.elements()trả về một trình vòng lặp trên các phần tử được chứa, lặp lại từng phần tử nhiều lần bằng số lượng của nó.subtract()lấy một lần lặp và trừ đi một phần tử cho mỗi phần tử thay vì thêm; nếu đối số là từ điển hoặcCounterkhác thì số lượng sẽ bị trừ.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', '', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'tôi', 'tôi', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('rất đậm chữ e') >>> c['e'] # Count giờ thấp hơn -1
Đóng góp của Raymond Hettinger; bpo-1696199.
Lớp mới:
OrderedDictđược mô tả trong phần PEP 372: Thêm từ điển có thứ tự vào bộ sưu tập trước đó.Phương thức mới: Kiểu dữ liệu
dequehiện có phương thứccount()trả về số phần tử được chứa bằng đối số được cung cấp x và phương thứcreverse()đảo ngược các phần tử của deque tại chỗ.dequecũng hiển thị độ dài tối đa của nó dưới dạng thuộc tínhmaxlenchỉ đọc. (Cả hai tính năng đều được Raymond Hettinger thêm vào.)Lớp
namedtuplehiện có tham số rename tùy chọn. Nếu rename là đúng, các tên trường không hợp lệ vì chúng đã được lặp lại hoặc không phải là mã định danh Python hợp pháp sẽ được đổi tên thành tên hợp pháp bắt nguồn từ vị trí của trường trong danh sách các trường:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(Được thêm bởi Raymond Hettinger; bpo-1818.)
Cuối cùng, lớp cơ sở trừu tượng
Mappinghiện trả vềNotImplementednếu ánh xạ được so sánh với loại khác không phải làMapping. (Đã sửa bởi Daniel Stutzbach; bpo-8729.)Các hàm tạo cho các lớp phân tích cú pháp trong mô-đun
ConfigParserhiện lấy tham số allow_no_value, mặc định là sai; nếu đúng, các tùy chọn không có giá trị sẽ được cho phép. Ví dụ:>>> nhập ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... người dùng = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... bỏ qua-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'người dùng') 'mysql' >>> print config.get('mysqld', 'skip-bdb') không có >>> print config.get('mysqld', 'unknown') Traceback (cuộc gọi gần đây nhất): ... NoOptionError: Không có tùy chọn 'không xác định' trong phần: 'mysqld'
(Được đóng góp bởi Mats Kindahl; bpo-7005.)
Hàm không được dùng nữa:
contextlib.nested(), cho phép xử lý nhiều trình quản lý bối cảnh bằng một câu lệnhwith, đã không được dùng nữa vì câu lệnhwithhiện hỗ trợ nhiều trình quản lý ngữ cảnh.Mô-đun
cookielibhiện bỏ qua các cookie có trường phiên bản không hợp lệ, trường phiên bản không chứa giá trị số nguyên. (Đã sửa bởi John J. Lee; bpo-3924.)Bây giờ, hàm
deepcopy()của mô-đuncopysẽ sao chép chính xác các phương thức phiên bản bị ràng buộc. (Được thực hiện bởi Robert Collins; bpo-1515.)Mô-đun
ctypeshiện luôn chuyển đổiNonethành con trỏ CNULLcho các đối số được khai báo là con trỏ. (Được thay đổi bởi Thomas Heller; bpo-4606.) libffi library cơ bản đã được cập nhật lên phiên bản 3.0.9, chứa nhiều bản sửa lỗi khác nhau cho các nền tảng khác nhau. (Cập nhật bởi Matthias Klose; bpo-8142.)Phương thức mới: lớp
timedeltacủa mô-đundatetimeđã có được phương thứctotal_seconds()trả về số giây trong khoảng thời gian. (Được đóng góp bởi Brian Quinlan; bpo-5788.)Phương thức mới: lớp
Decimalcó được phương thức lớpfrom_float()thực hiện chuyển đổi chính xác số dấu phẩy động thànhDecimal. Việc chuyển đổi chính xác này cố gắng đạt được giá trị gần đúng thập phân gần nhất với giá trị của biểu diễn dấu phẩy động; do đó, giá trị thập phân thu được sẽ vẫn bao gồm cả giá trị không chính xác, nếu có. Ví dụ:Decimal.from_float(0.1)trả vềDecimal('0.1000000000000000055511151231257827021181583404541015625'). (Được thực hiện bởi Raymond Hettinger; bpo-4796.)Việc so sánh các phiên bản của
Decimalvới các số có dấu phẩy động hiện tạo ra kết quả hợp lý dựa trên các giá trị số của toán hạng. Trước đây, những so sánh như vậy sẽ quay trở lại các quy tắc mặc định của Python để so sánh các đối tượng, tạo ra các kết quả tùy ý dựa trên loại của chúng. Lưu ý rằng bạn vẫn không thể kết hợpDecimalvà dấu phẩy động trong các phép toán khác chẳng hạn như phép cộng, vì bạn phải chọn rõ ràng cách chuyển đổi giữa float vàDecimal. (Đã sửa bởi Mark Dickinson; bpo-2531.)Hàm tạo cho
Decimalhiện chấp nhận các số có dấu phẩy động (được thêm bởi Raymond Hettinger; bpo-8257) và các ký tự Unicode không phải của châu Âu như chữ số Ả Rập-Ấn Độ (do Mark Dickinson đóng góp; bpo-6595).Hầu hết các phương thức của lớp
Contexthiện chấp nhận số nguyên cũng như các thể hiệnDecimal; ngoại lệ duy nhất là phương phápcanonical()vàis_canonical(). (Bản vá của Juan José Conti; bpo-7633.)Khi sử dụng các phiên bản
Decimalvới phương thứcformat()của chuỗi, căn chỉnh mặc định trước đây là căn trái. Điều này đã được thay đổi thành căn lề phải, điều này hợp lý hơn đối với các loại số. (Được thay đổi bởi Mark Dickinson; bpo-6857.)Các so sánh liên quan đến giá trị NaN báo hiệu (hoặc
sNAN) hiện báo hiệuInvalidOperationthay vì âm thầm trả về giá trị đúng hoặc sai tùy thuộc vào toán tử so sánh. Các giá trị NaN yên tĩnh (hoặcNaN) hiện có thể băm được. (Đã sửa bởi Mark Dickinson; bpo-7279.)Mô-đun
difflibhiện tạo ra đầu ra tương thích hơn với các công cụ diff/patch hiện đại thông qua một thay đổi nhỏ, sử dụng ký tự tab thay vì dấu cách làm dấu phân cách trong tiêu đề cung cấp tên tệp. (Đã sửa bởi Anatoly Techtonik; bpo-7585.)Lệnh Distutils
sdisthiện luôn tạo lại tệpMANIFEST, vì ngay cả khi tệpMANIFEST.inhoặcsetup.pychưa được sửa đổi, người dùng có thể đã tạo một số tệp mới cần được đưa vào. (Đã sửa bởi Tarek Ziadé; bpo-8688.)Cờ
IGNORE_EXCEPTION_DETAILcủa mô-đundoctestbây giờ sẽ bỏ qua tên của mô-đun chứa ngoại lệ đang được kiểm tra. (Bản vá của Lennart Regebro; bpo-7490.)Lớp
Messagecủa mô-đunemailgiờ đây sẽ chấp nhận tải trọng có giá trị Unicode, tự động chuyển đổi tải trọng sang mã hóa dooutput_charsetchỉ định. (Được thêm bởi R. David Murray; bpo-1368247.)Lớp
Fractionhiện chấp nhận một cá thể float hoặcDecimalhoặc hai số hữu tỷ làm đối số cho hàm tạo của nó. (Được thực hiện bởi Mark Dickinson; số hữu tỉ được thêm vào trong bpo-5812 và float/thập phân trong bpo-8294.)Thứ tự so sánh (
<,<=,>,>=) giữa các phân số và số phức hiện tạo raTypeError. Điều này khắc phục sự giám sát, làm choFractionkhớp với các loại số khác.Lớp mới:
FTP_TLStrong mô-đunftplibcung cấp các kết nối FTP an toàn bằng cách sử dụng tính năng đóng gói xác thực TLS cũng như kiểm soát và truyền dữ liệu tiếp theo. (Được đóng góp bởi Giampaolo Rodola; bpo-2054.)Phương pháp
storbinary()để tải lên nhị phân hiện có thể khởi động lại quá trình tải lên nhờ tham số rest được thêm vào (bản vá của Pablo Mouzo; bpo-6845.)Trình trang trí lớp mới:
total_ordering()trong mô-đunfunctoolsnhận một lớp xác định phương thức__eq__()và một trong các phương thức__lt__(),__le__(),__gt__()hoặc__ge__(), đồng thời tạo ra các phương thức so sánh bị thiếu. Vì phương thức__cmp__()không được dùng nữa trong Python 3.x nên trình trang trí này giúp việc xác định các lớp có thứ tự dễ dàng hơn. (Được thêm bởi Raymond Hettinger; bpo-5479.)Hàm mới:
cmp_to_key()sẽ sử dụng hàm so sánh kiểu cũ có hai đối số và trả về một hàm gọi mới có thể được sử dụng làm tham số key cho các hàm nhưsorted(),min()vàmax(), v.v. Mục đích sử dụng chính là giúp tạo mã tương thích với Python 3.x. (Được thêm bởi Raymond Hettinger.)Chức năng mới:
is_tracked()của mô-đungctrả về true nếu một phiên bản nhất định được trình thu gom rác theo dõi, nếu không thì trả về false. (Được đóng góp bởi Antoine Pitrou; bpo-4688.)Zz001zz của mô-đun
gziphiện hỗ trợ giao thức quản lý ngữ cảnh, vì vậy bạn có thể viếtwith gzip.GzipFile(...) as f:(do Hagen Fürstenau; bpo-3860 đóng góp) và giờ đây nó triển khaiio.BufferedIOBaseABC, vì vậy bạn có thể gói nó bằngio.BufferedReaderđể xử lý nhanh hơn (do Nir Aides; bpo-7471 đóng góp). Giờ đây, bạn cũng có thể ghi đè thời gian sửa đổi được ghi trong tệp được nén bằng cách cung cấp dấu thời gian tùy chọn cho hàm tạo. (Được đóng góp bởi Jacques Frechet; bpo-4272.)Các tệp ở định dạng gzip có thể được đệm bằng các byte 0 ở cuối; mô-đun
gzipbây giờ sẽ sử dụng các byte ở cuối này. (Đã sửa bởi Tadek Pietraszek và Brian Curtin; bpo-2846.)Thuộc tính mới: mô-đun
hashlibhiện có thuộc tínhalgorithmschứa một bộ đặt tên cho các thuật toán được hỗ trợ. Trong Python 2.7,hashlib.algorithmschứa('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Được đóng góp bởi Carl Chenet; bpo-7418.)Lớp
HTTPResponsemặc định được mô-đunhttplibsử dụng hiện hỗ trợ tính năng đệm, giúp đọc phản hồi HTTP nhanh hơn nhiều. (Được đóng góp bởi Kristján Valur Jónsson; bpo-4879.)Các lớp
HTTPConnectionvàHTTPSConnectionhiện hỗ trợ tham số source_address,(host, port)2-tuple cung cấp địa chỉ nguồn sẽ được sử dụng cho kết nối. (Được đóng góp bởi Eldon Ziegler; bpo-3972.)Mô-đun
ihookshiện hỗ trợ nhập tương đối. Lưu ý rằngihookslà một mô-đun cũ hơn để tùy chỉnh quá trình nhập, được thay thế bởi mô-đunimputilđược thêm vào Python 2.0. (Hỗ trợ nhập tương đối được thêm bởi Neil Schenauer.)Mô-đun
imaplibhiện hỗ trợ địa chỉ IPv6. (Được đóng góp bởi Derek Morr; bpo-1655.)Hàm mới:
getcallargs()của mô-đuninspectnhận một đối số có thể gọi cũng như các đối số từ khóa và vị trí của nó, đồng thời tìm ra tham số nào của đối số có thể gọi sẽ nhận từng đối số, trả về tên đối số ánh xạ từ điển về giá trị của chúng. Ví dụ:>>> từ kiểm tra nhập getcallargs >>> def f(a, b=1, *pos, **named): ... vượt qua ... >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'có tên': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'có tên': {'x': 4}} >>> getcallargs(f) Traceback (cuộc gọi gần đây nhất): ... TypeError: f() nhận ít nhất 1 đối số (đã cho 0)
Đóng góp của George Sakkis; bpo-3135.
Mô-đun đã cập nhật: Thư viện
iođã được nâng cấp lên phiên bản đi kèm với Python 3.1. Đối với 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ụ được thực hiện. Phiên bản Python ban đầu được đổi tên thành mô-đun_pyio.Một thay đổi nhỏ dẫn đến: lớp
io.TextIOBasehiện có thuộc tínherrorsđưa ra cài đặt lỗi được sử dụng cho các lỗi mã hóa và giải mã (một trong các lỗi'strict','replace','ignore').Lớp
io.FileIOhiện tăngOSErrorkhi chuyển một bộ mô tả tệp không hợp lệ. (Được thực hiện bởi Benjamin Peterson; bpo-4991.) Phương thứctruncate()hiện giữ nguyên vị trí tệp; trước đó nó sẽ thay đổi vị trí tệp ở cuối tệp mới. (Đã sửa bởi Pascal Chambon; bpo-6939.)Hàm mới:
itertools.compress(data, selectors)có hai vòng lặp. Các phần tử của data được trả về nếu giá trị tương ứng trong selectors là đúng:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
Hàm mới:
itertools.combinations_with_replacement(iter, r)trả về tất cả các kết hợp phần tử có độ dài r có thể có từ iter có thể lặp lại. Không giống nhưcombinations(), các phần tử riêng lẻ có thể được lặp lại trong các kết hợp được tạo:itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
Lưu ý rằng các phần tử được coi là duy nhất tùy thuộc vào vị trí của chúng trong đầu vào chứ không phải giá trị thực của chúng.
Hàm
itertools.count()hiện có đối số step cho phép tăng theo các giá trị khác 1.count()hiện cũng cho phép đối số từ khóa và sử dụng các giá trị không nguyên như số float hoặc phiên bảnDecimal. (Được thực hiện bởi Raymond Hettinger; bpo-5032.)itertools.combinations()vàitertools.product()trước đây đã tăngValueErrorcho các giá trị của r lớn hơn giá trị đầu vào có thể lặp lại. Đây được coi là một lỗi đặc tả, vì vậy giờ đây chúng trả về một trình vòng lặp trống. (Đã sửa bởi Raymond Hettinger; bpo-4816.)Mô-đun cập nhật: Mô-đun
jsonđã được nâng cấp lên phiên bản 2.0.9 của gói simplejson, bao gồm phần mở rộng C giúp mã hóa và giải mã nhanh hơn. (Được đóng góp bởi Bob Ippolito; bpo-4136.)Để hỗ trợ loại
collections.OrderedDictmới,json.load()hiện có một tham số object_pairs_hook tùy chọn sẽ được gọi với bất kỳ nghĩa đen đối tượng nào giải mã thành danh sách các cặp. (Được đóng góp bởi Raymond Hettinger; bpo-5381.)Lớp
Maildircủa mô-đunmailboxhiện ghi lại dấu thời gian trên các thư mục mà nó đọc và chỉ đọc lại chúng nếu thời gian sửa đổi sau đó đã thay đổi. Điều này cải thiện hiệu suất bằng cách tránh quét thư mục không cần thiết. (Đã sửa bởi A.M. Kuchling và Antoine Pitrou; bpo-1607951, bpo-6896.)Các chức năng mới: mô-đun
maththu đượcerf()vàerfc()cho hàm lỗi và hàm lỗi bổ sung,expm1()tính toáne**x - 1với độ chính xác cao hơn so với sử dụngexp()và trừ 1,gamma()cho hàm Gamma vàlgamma()cho nhật ký tự nhiên của hàm Gamma. (Được đóng góp bởi Mark Dickinson và nirinA raseliarison; bpo-3366.)Giờ đây, các lớp
Manager*của mô-đunmultiprocessingcó thể được truyền cho một lệnh gọi có thể gọi bất cứ khi nào một quy trình con được bắt đầu, cùng với một tập hợp các đối số sẽ được chuyển đến lệnh gọi được. (Được đóng góp bởi lekma; bpo-5585.)Lớp
Pool, điều khiển một nhóm quy trình công nhân, hiện có tham số maxtasksperchild tùy chọn. Các quy trình công nhân sẽ thực hiện số lượng nhiệm vụ được chỉ định rồi thoát ra, khiếnPoolkhởi động một công nhân mới. Điều này hữu ích nếu các tác vụ có thể rò rỉ bộ nhớ hoặc các tài nguyên khác hoặc nếu một số tác vụ sẽ khiến cho dung lượng nhân viên trở nên rất lớn. (Được đóng góp bởi Charles Cazabon; bpo-6963.)Mô-đun
nntplibhiện hỗ trợ địa chỉ IPv6. (Được đóng góp bởi Derek Morr; bpo-1664.)Các chức năng mới: mô-đun
osbao gồm các lệnh gọi hệ thống POSIX sau:getresgid()vàgetresuid(), trả về các GID và UID thực, hiệu quả và đã lưu;setresgid()vàsetresuid(), đặt GID và UID thực, hiệu quả và được lưu thành các giá trị mới;initgroups(), khởi tạo danh sách truy cập nhóm cho quy trình hiện tại. (Các hàm GID/UID do Travis H.; bpo-6508 đóng góp. Hỗ trợ cho initgroups được thêm bởi Jean-Paul Calderone; bpo-7333.)Hàm
os.fork()hiện khởi tạo lại khóa nhập trong tiến trình con; điều này khắc phục sự cố trên Solaris khifork()được gọi từ một chuỗi. (Đã sửa bởi Zsolt Cserna; bpo-7242.)Trong mô-đun
os.path, các hàmnormpath()vàabspath()hiện giữ nguyên Unicode; nếu đường dẫn đầu vào của chúng là chuỗi Unicode thì giá trị trả về cũng là chuỗi Unicode. (normpath()được sửa bởi Matt Giuca trong bpo-5827;abspath()được sửa bởi Ezio Melotti trong bpo-3426.)Mô-đun
pydochiện có trợ giúp cho các ký hiệu khác nhau mà Python sử dụng. Bây giờ bạn có thể thực hiệnhelp('<<')hoặchelp('@')chẳng hạn. (Được đóng góp bởi David Laban; bpo-4739.)Hiện tại,
split(),sub()vàsubn()của mô-đunrechấp nhận đối số flags tùy chọn để thống nhất với các hàm khác trong mô-đun. (Được thêm bởi Gregory P. Smith.)Hàm mới:
run_path()trong mô-đunrunpysẽ thực thi mã theo đối số path được cung cấp. path có thể là đường dẫn của tệp nguồn Python (example.py), tệp mã byte được biên dịch (example.pyc), thư mục (./package/) hoặc kho lưu trữ zip (example.zip). Nếu một thư mục hoặc đường dẫn zip được cung cấp, nó sẽ được thêm vào phía trướcsys.pathvà mô-đun__main__sẽ được nhập. Dự kiến thư mục hoặc zip chứa__main__.py; nếu không, một số__main__.pykhác có thể được nhập từ một vị trí sau trongsys.path. Điều này làm cho nhiều máy móc củarunpycó sẵn hơn cho các tập lệnh muốn bắt chước cách dòng lệnh của Python xử lý tên đường dẫn rõ ràng. (Được thêm bởi Nick Coghlan; bpo-6816.)Chức năng mới: trong mô-đun
shutil,make_archive()lấy tên tệp, loại lưu trữ (định dạng zip hoặc tar) và đường dẫn thư mục rồi tạo một kho lưu trữ chứa nội dung của thư mục. (Được thêm bởi Tarek Ziadé.)Các hàm
copyfile()vàcopytree()củashutilhiện đưa ra một ngoại lệSpecialFileErrorkhi được yêu cầu sao chép một ống dẫn có tên. Trước đây, mã sẽ coi các đường dẫn có tên giống như một tệp thông thường bằng cách mở chúng để đọc và điều này sẽ chặn vô thời hạn. (Đã sửa bởi Antoine Pitrou; bpo-3002.)Mô-đun
signalkhông còn cài đặt lại bộ xử lý tín hiệu trừ khi điều này thực sự cần thiết, sửa lỗi có thể khiến không thể bắt được tín hiệu EINTR một cách mạnh mẽ. (Đã sửa bởi Charles-Francois Natali; bpo-8354.)Các chức năng mới: trong mô-đun
site, ba chức năng mới trả về nhiều đường dẫn cụ thể cho trang web và người dùng.getsitepackages()trả về danh sách chứa tất cả các thư mục gói trang web toàn cầu,getusersitepackages()trả về đường dẫn của thư mục gói trang web của người dùng vàgetuserbase()trả về giá trị của biến môi trườngUSER_BASE, đưa đường dẫn đến thư mục có thể được sử dụng để lưu trữ dữ liệu. (Được đóng góp bởi Tarek Ziadé; bpo-6693.)Mô-đun
sitehiện báo cáo các trường hợp ngoại lệ xảy ra khi mô-đunsitecustomizeđược nhập và sẽ không còn bắt và nuốt ngoại lệKeyboardInterruptnữa. (Đã sửa bởi Victor Stinner; bpo-3137.)Hàm
create_connection()đã nhận được tham số source_address,(host, port)2 bộ cung cấp địa chỉ nguồn sẽ được sử dụng cho kết nối. (Được đóng góp bởi Eldon Ziegler; bpo-3972.)Các phương thức
recv_into()vàrecvfrom_into()bây giờ sẽ ghi vào các đối tượng hỗ trợ bộ đệm API, hữu ích nhất là các đối tượngbytearrayvàmemoryview. (Được thực hiện bởi Antoine Pitrou; bpo-8104.)Lớp
TCPServercủa mô-đunSocketServerhiện hỗ trợ thời gian chờ của ổ cắm và vô hiệu hóa thuật toán Nagle. Thuộc tính lớpdisable_nagle_algorithmmặc định làFalse; nếu bị ghi đè là đúng, các kết nối yêu cầu mới sẽ có tùy chọn TCP_NODELAY được đặt để ngăn chặn việc lưu vào bộ đệm nhiều lần gửi nhỏ vào một gói TCP duy nhất. Thuộc tính lớptimeoutcó thể giữ thời gian chờ tính bằng giây sẽ được áp dụng cho ổ cắm yêu cầu; nếu không nhận được yêu cầu nào trong thời gian đó,handle_timeout()sẽ được gọi vàhandle_request()sẽ quay trở lại. (Được đóng góp bởi Kristján Valur Jónsson; bpo-6192 và bpo-6267.)Mô-đun đã cập nhật: mô-đun
sqlite3đã được cập nhật lên phiên bản 2.6.0 của pysqlite package. Phiên bản 2.6.0 bao gồm một số bản sửa lỗi và thêm khả năng tải các phần mở rộng SQLite từ các thư viện dùng chung. Gọi phương thứcenable_load_extension(True)để bật tiện ích mở rộng, sau đó gọiload_extension()để tải một thư viện dùng chung cụ thể. (Cập nhật bởi Gerhard Häring.)Các đối tượng
SSLSocketcủa mô-đunsslhiện hỗ trợ bộ đệm API, sửa lỗi bộ thử nghiệm (do Antoine Pitrou; bpo-7133 sửa) và tự động đặtSSL_MODE_AUTO_RETRYcủa OpenSSL, điều này sẽ ngăn việc trả về mã lỗi từ các hoạt độngrecv()kích hoạt đàm phán lại SSL (sửa bởi Antoine Pitrou; bpo-8222).Hàm khởi tạo
wrap_socket()hiện nhận đối số ciphers là một chuỗi liệt kê các thuật toán mã hóa được phép; định dạng của chuỗi được mô tả in the OpenSSL documentation. (Được thêm bởi Antoine Pitrou; bpo-8322.)Một thay đổi khác làm cho tiện ích mở rộng tải tất cả các thuật toán mã hóa và tóm tắt của OpenSSL để tất cả chúng đều có sẵn. Không thể xác minh một số chứng chỉ SSL, báo cáo lỗi "thuật toán không xác định". (Beda Kosata báo cáo và Antoine Pitrou sửa; bpo-8484.)
Phiên bản OpenSSL đang được sử dụng hiện có sẵn dưới dạng các thuộc tính mô-đun
ssl.OPENSSL_VERSION(một chuỗi),ssl.OPENSSL_VERSION_INFO(một bộ 5) vàssl.OPENSSL_VERSION_NUMBER(một số nguyên). (Được thêm bởi Antoine Pitrou; bpo-8321.)Mô-đun
structsẽ không còn âm thầm bỏ qua lỗi tràn khi giá trị quá lớn đối với mã định dạng số nguyên cụ thể (một trongbBhHiIlLqQ); bây giờ nó luôn đưa ra một ngoại lệstruct.error. (Được thay đổi bởi Mark Dickinson; bpo-1523.) Hàmpack()cũng sẽ cố gắng sử dụng__index__()để chuyển đổi và đóng gói các số không nguyên trước khi thử phương pháp__int__()hoặc báo cáo lỗi. (Được thay đổi bởi Mark Dickinson; bpo-8300.)Hàm mới:
check_output()của mô-đunsubprocesschạy một lệnh với một bộ đối số được chỉ định và trả về đầu ra của lệnh dưới dạng một chuỗi khi lệnh chạy mà không có lỗi hoặc nếu không thì sẽ đưa ra một ngoại lệCalledProcessError.>>> subprocess.check_output(['df', '-h', '.']) 'Kích thước hệ thống tập tin đã sử dụng Dung lượng sẵn có được gắn trên\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Lệnh '['df', '-h', '/bogus']' trả về trạng thái thoát khác 0 1
(Được đóng góp bởi Gregory P. Smith.)
Mô-đun
subprocesshiện sẽ thử lại các lệnh gọi hệ thống nội bộ của nó khi nhận được tín hiệuEINTR. (Đã được một số người báo cáo; bản vá cuối cùng của Gregory P. Smith trong bpo-1068268.)Hàm mới:
is_declared_global()trong mô-đunsymtabletrả về true cho các biến được khai báo rõ ràng là toàn cục, sai cho các biến được ngầm định là toàn cục. (Được đóng góp bởi Jeremy Hylton.)Mô-đun
syslogbây giờ sẽ sử dụng giá trị củasys.argv[0]làm mã định danh thay vì giá trị mặc định trước đó là'python'. (Được thay đổi bởi Sean Reifschneider; bpo-8451.)Giá trị
sys.version_infohiện là một bộ dữ liệu được đặt tên, với các thuộc tính có tên làmajor,minor,micro,releaselevelvàserial. (Được đóng góp bởi Ross Light; bpo-4285.)sys.getwindowsversion()cũng trả về một bộ dữ liệu có tên, với các thuộc tính có tên làmajor,minor,build,platform,service_pack,service_pack_major,service_pack_minor,suite_maskvàproduct_type. (Được đóng góp bởi Brian Curtin; bpo-7766.)Việc xử lý lỗi mặc định của mô-đun
tarfileđã thay đổi để không còn ngăn chặn các lỗi nghiêm trọng nữa. Mức lỗi mặc định trước đây là 0, có nghĩa là lỗi sẽ chỉ dẫn đến một thông báo được ghi vào nhật ký gỡ lỗi, nhưng do nhật ký gỡ lỗi không được kích hoạt theo mặc định nên những lỗi này sẽ không được chú ý. Mức lỗi mặc định bây giờ là 1, sẽ có ngoại lệ nếu có lỗi. (Được thay đổi bởi Lars Gustäbel; bpo-7357.)tarfilehiện hỗ trợ lọc các đối tượngTarInfođược thêm vào tệp tar. Khi bạn gọiadd(), bạn có thể cung cấp một đối số filter tùy chọn có thể gọi được. filter có thể gọi được sẽ được chuyển quaTarInfocho mỗi tệp được thêm vào và có thể sửa đổi và trả lại nó. Nếu lệnh gọi trả vềNone, tệp sẽ bị loại khỏi kho lưu trữ kết quả. Điều này mạnh hơn đối số exclude hiện có, do đó không được dùng nữa. (Được thêm bởi Lars Gustäbel; bpo-6856.) LớpTarFilehiện cũng hỗ trợ giao thức quản lý ngữ cảnh. (Được thêm bởi Lars Gustäbel; bpo-7232.)Phương thức
wait()của lớpthreading.Eventhiện trả về cờ nội bộ khi thoát. Điều này có nghĩa là phương thức này thường sẽ trả về true vìwait()có nhiệm vụ chặn cho đến khi cờ nội bộ trở thành true. Giá trị trả về sẽ chỉ sai nếu thời gian chờ được cung cấp và thao tác đã hết thời gian chờ. (Được đóng góp bởi Tim Lesher; bpo-1674032.)Cơ sở dữ liệu Unicode do mô-đun
unicodedatacung cấp hiện được sử dụng nội bộ để xác định ký tự nào là số, khoảng trắng hoặc biểu thị ngắt dòng. Cơ sở dữ liệu cũng bao gồm thông tin từ tệp dữ liệuUnihan.txt(bản vá của Anders Chrigström và Amaury Forgeot d'Arc; bpo-1571184) và đã được cập nhật lên phiên bản 5.2.0 (được cập nhật bởi Florent Xicluna; bpo-8024).urlsplit()của mô-đunurlparsehiện xử lý các lược đồ URL không xác định theo kiểu tương thích với RFC 3986: nếu URL có dạng"<something>://...", thì văn bản trước://sẽ được coi là lược đồ, ngay cả khi đó là một lược đồ bịa đặt mà mô-đun không biết. Thay đổi này có thể phá vỡ mã hoạt động xung quanh hành vi cũ. Ví dụ: Python 2.6.4 hoặc 2.5 sẽ trả về như sau:>>> nhập urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('được phát minh', '', '//host/filename?query', '', '')
Python 2.7 (và Python 2.6.5) sẽ trả về:
>>> nhập urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('được phát minh', 'máy chủ', '/filename?query', '', '')
(Python 2.7 thực sự tạo ra kết quả hơi khác một chút, vì nó trả về một bộ dữ liệu có tên thay vì một bộ dữ liệu tiêu chuẩn.)
Mô-đun
urlparsecũng hỗ trợ các địa chỉ IPv6 theo nghĩa đen được xác định bởi RFC 2732 (do Senthil Kumaran; bpo-2987 đóng góp).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', Fragment='')
Lớp mới: lớp
WeakSettrong mô-đunweakreflà một tập hợp chỉ chứa các tham chiếu yếu đến các phần tử của nó; các phần tử sẽ bị xóa khi không có tham chiếu nào trỏ đến chúng. (Ban đầu được Raymond Hettinger triển khai bằng Python 3.x và được Michael Foord chuyển sang 2.7.)Thư viện
xml.etree.ElementTree, không còn thoát khỏi ký hiệu và dấu ngoặc nhọn khi xuất ra lệnh xử lý XML (trông giống<?xml-stylesheet href="#style1"?>) hoặc nhận xét (trông giống<!-- comment -->). (Bản vá của Neil Muller; bpo-2746.)Máy khách và máy chủ XML-RPC, do mô-đun
xmlrpclibvàSimpleXMLRPCServercung cấp, đã cải thiện hiệu suất bằng cách hỗ trợ duy trì HTTP/1.1 và bằng cách tùy chọn sử dụng mã hóa gzip để nén XML đang được trao đổi. Việc nén gzip được kiểm soát bởi thuộc tínhencode_thresholdcủaSimpleXMLRPCRequestHandler, chứa kích thước tính bằng byte; các phản hồi lớn hơn mức này sẽ bị nén. (Được đóng góp bởi Kristján Valur Jónsson; bpo-6267.)ZipFilecủa mô-đunzipfilehiện hỗ trợ giao thức quản lý ngữ cảnh, vì vậy bạn có thể viếtwith zipfile.ZipFile(...) as f:. (Được đóng góp bởi Brian Curtin; bpo-5511.)zipfilehiện cũng hỗ trợ lưu trữ các thư mục trống và trích xuất chúng một cách chính xác. (Đã được sửa bởi Kuba Wieczorek; bpo-4710.) Đọc tệp từ kho lưu trữ nhanh hơn và việc xen kẽread()vàreadline()hiện hoạt động chính xác. (Được đóng góp bởi Nir Aides; bpo-7610.)Hàm
is_zipfile()hiện chấp nhận một đối tượng tệp, ngoài tên đường dẫn được chấp nhận trong các phiên bản trước. (Được đóng góp bởi Gabriel Genellina; bpo-4756.)Phương thức
writestr()hiện có tham số compress_type tùy chọn cho phép bạn ghi đè phương thức nén mặc định được chỉ định trong hàm tạoZipFile. (Được đóng góp bởi Ronald Oussoren; bpo-6003.)
Mô-đun mới: importlib¶
Python 3.1 bao gồm gói importlib, một bản triển khai lại logic bên dưới câu lệnh import của Python. importlib rất hữu ích cho những người triển khai trình thông dịch Python và cho những người dùng muốn viết các trình nhập mới có thể tham gia vào quá trình nhập. Python 2.7 không chứa gói importlib hoàn chỉnh mà thay vào đó có một tập hợp con nhỏ chứa một hàm duy nhất, import_module().
import_module(name, package=None) nhập một mô-đun. name là một chuỗi chứa tên mô-đun hoặc gói. Có thể thực hiện nhập tương đối bằng cách cung cấp một chuỗi bắt đầu bằng ký tự ., chẳng hạn như ..utils.errors. Đối với các hoạt động nhập tương đối, đối số package phải được cung cấp và là tên của gói sẽ được sử dụng làm điểm neo cho quá trình nhập tương đối. import_module() vừa chèn mô-đun đã nhập vào sys.modules và trả về đối tượng mô-đun.
Dưới đây là một số ví dụ:
>>> từ importlib nhập import_module
>>> Anydbm = import_module('anydbm') # Standard nhập tuyệt đối
>>> bất kỳdbm nào
<mô-đun 'anydbm' từ '/p/python/Lib/anydbm.py'>
>>> nhập khẩu # Relative
>>> file_util = import_module('..file_util', 'distutils.command')
>>> tập tin_util
<mô-đun 'distutils.file_util' từ '/python/Lib/distutils/file_util.pyc'>
importlib được Brett Cannon triển khai và giới thiệu bằng Python 3.1.
Mô-đun mới: sysconfig¶
Mô-đun sysconfig đã được rút ra khỏi gói Distutils, trở thành mô-đun cấp cao nhất mới theo đúng nghĩa của nó. sysconfig cung cấp các chức năng để lấy thông tin về quá trình xây dựng của Python: chuyển đổi trình biên dịch, đường dẫn cài đặt, tên nền tảng và liệu Python có đang chạy từ thư mục nguồn của nó hay không.
Một số chức năng trong mô-đun là:
get_config_var()trả về các biến từ Makefile của Python và tệppyconfig.h.get_config_vars()trả về một từ điển chứa tất cả các biến cấu hình.get_path()trả về đường dẫn đã định cấu hình cho một loại mô-đun cụ thể: thư viện tiêu chuẩn, mô-đun dành riêng cho trang web, mô-đun dành riêng cho nền tảng, v.v.is_python_build()trả về true nếu bạn đang chạy tệp nhị phân từ cây nguồn Python và trả về false nếu ngược lại.
Tham khảo tài liệu sysconfig để biết thêm chi tiết và có danh sách đầy đủ các chức năng.
Gói Distutils và sysconfig hiện được duy trì bởi Tarek Ziadé, người cũng đã bắt đầu gói Distutils2 (kho lưu trữ nguồn tại https://hg.python.org/distutils2/) để phát triển phiên bản Distutils thế hệ tiếp theo.
ttk: Widget theo chủ đề cho Tk¶
Tcl/Tk 8.5 bao gồm một tập hợp các tiện ích theo chủ đề triển khai lại các tiện ích Tk cơ bản nhưng có giao diện có thể tùy chỉnh hơn và do đó có thể giống gần hơn với các tiện ích của nền tảng gốc. Bộ tiện ích này ban đầu được gọi là Ngói, nhưng được đổi tên thành Ttk (nghĩa là "Tk theo chủ đề") khi được thêm vào bản phát hành Tcl/Tck 8.5.
Để tìm hiểu thêm, hãy đọc tài liệu mô-đun ttk. Bạn cũng có thể muốn đọc trang hướng dẫn Tcl/Tk mô tả công cụ chủ đề Ttk, có tại https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Một số ảnh chụp màn hình của mã Python/Ttk đang sử dụng có tại https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.
Mô-đun tkinter.ttk được viết bởi Guilherme Polo và được thêm vào bpo-2983. Một phiên bản thay thế có tên Tile.py, được viết bởi Martin Franklin và được Kevin Walzer duy trì, đã được đề xuất đưa vào bpo-2618, nhưng các tác giả cho rằng tác phẩm của Guilherme Polo toàn diện hơn.
Mô-đun cập nhật: unittest¶
Mô-đun unittest đã được cải tiến đáng kể; nhiều tính năng mới đã được thêm vào. Hầu hết các tính năng này đều do Michael Foodd triển khai, trừ khi có ghi chú khác. Phiên bản nâng cao của mô-đun có thể tải xuống riêng để sử dụng với Python phiên bản 2.4 đến 2.6, được đóng gói dưới dạng gói unittest2, từ unittest2.
Khi được sử dụng từ dòng lệnh, mô-đun có thể tự động khám phá các bài kiểm tra. Nó không cầu kỳ như py.test hoặc nose, nhưng cung cấp một cách đơn giản để chạy thử nghiệm được lưu giữ trong một tập hợp các thư mục gói. Ví dụ: lệnh sau sẽ tìm kiếm thư mục con test/ để tìm bất kỳ tệp kiểm tra có thể nhập nào có tên test*.py:
python -m unittest khám phá -s test
Tham khảo tài liệu mô-đun unittest để biết thêm chi tiết. (Được phát triển trong bpo-6001.)
Chức năng main() hỗ trợ một số tùy chọn mới khác:
-bhoặc--buffersẽ đệm các luồng lỗi tiêu chuẩn và đầu ra tiêu chuẩn trong mỗi lần kiểm tra. Nếu thử nghiệm vượt qua, mọi kết quả đầu ra sẽ bị loại bỏ; khi thất bại, đầu ra được đệm sẽ được hiển thị.-choặc--catchsẽ khiến ngắt control-C được xử lý một cách duyên dáng hơn. Thay vì làm gián đoạn quá trình kiểm tra ngay lập tức, kiểm thử hiện đang chạy sẽ được hoàn thành và sau đó một phần kết quả cho đến khi bị gián đoạn sẽ được báo cáo. Nếu bạn thiếu kiên nhẫn, nhấn control-C lần thứ hai sẽ gây gián đoạn ngay lập tức.Trình xử lý control-C này cố gắng tránh gây ra sự cố khi mã đang được kiểm tra hoặc các thử nghiệm đang chạy đã xác định trình xử lý tín hiệu của riêng chúng, bằng cách nhận thấy rằng trình xử lý tín hiệu đã được đặt và gọi nó. Nếu cách này không hiệu quả với bạn, thì có một trình trang trí
removeHandler()có thể được sử dụng để đánh dấu các bài kiểm tra cần tắt xử lý control-C.-fhoặc--failfastkhiến việc thực thi kiểm thử dừng ngay lập tức khi kiểm thử thất bại thay vì tiếp tục thực hiện các kiểm thử tiếp theo. (Được đề xuất bởi Cliff Dyer và được thực hiện bởi Michael Foord; bpo-8074.)
Thông báo tiến trình hiện hiển thị 'x' cho các lỗi dự kiến và 'u' cho các thành công ngoài mong đợi khi chạy ở chế độ dài dòng. (Được đóng góp bởi Benjamin Peterson.)
Các trường hợp thử nghiệm có thể đưa ra ngoại lệ SkipTest để bỏ qua thử nghiệm (bpo-1034053).
Các thông báo lỗi về lỗi assertEqual(), assertTrue() và assertFalse() hiện cung cấp thêm thông tin. Nếu bạn đặt thuộc tính longMessage của các lớp TestCase thành true thì cả thông báo lỗi tiêu chuẩn và mọi thông báo bổ sung mà bạn cung cấp sẽ được in ra để báo lỗi. (Được thêm bởi Michael Foodd; bpo-5663.)
Phương thức assertRaises() hiện trả về một trình xử lý ngữ cảnh khi được gọi mà không cung cấp đối tượng có thể gọi để chạy. Ví dụ: bạn có thể viết điều này:
với self.assertRaises(KeyError):
{['foo']
(Được thực hiện bởi Antoine Pitrou; bpo-4444.)
Hiện đã hỗ trợ thiết lập và phân tích cấp mô-đun và lớp. Các mô-đun có thể chứa các hàm setUpModule() và tearDownModule(). Các lớp có thể có các phương thức setUpClass() và tearDownClass() phải được định nghĩa là các phương thức lớp (sử dụng @classmethod hoặc tương đương). Các hàm và phương thức này được gọi khi người chạy thử nghiệm chuyển sang trường hợp thử nghiệm trong một mô-đun hoặc lớp khác.
Các phương thức addCleanup() và doCleanups() đã được thêm vào. addCleanup() cho phép bạn thêm các chức năng dọn dẹp sẽ được gọi vô điều kiện (sau setUp() nếu setUp() không thành công, nếu không thì sau tearDown()). Điều này cho phép phân bổ và phân bổ tài nguyên đơn giản hơn nhiều trong quá trình thử nghiệm (bpo-5679).
Một số phương pháp mới đã được thêm vào để cung cấp các bài kiểm tra chuyên biệt hơn. Nhiều phương pháp trong số này được các kỹ sư của Google viết để sử dụng trong bộ thử nghiệm của họ; Gregory P. Smith, Michael Foord và GvR đã hợp nhất chúng vào phiên bản unittest của Python.
assertIsNone()vàassertIsNotNone()lấy một biểu thức và xác minh rằng kết quả có phải làNonehay không.assertIs()vàassertIsNot()lấy hai giá trị và kiểm tra xem hai giá trị đó có đánh giá cùng một đối tượng hay không. (Được thêm bởi Michael Foodd; bpo-2578.)assertIsInstance()vàassertNotIsInstance()kiểm tra xem đối tượng kết quả là một thể hiện của một lớp cụ thể hay của một trong các bộ lớp. (Được thêm bởi Georg Brandl; bpo-7031.)assertGreater(),assertGreaterEqual(),assertLess()vàassertLessEqual()so sánh hai đại lượng.assertMultiLineEqual()so sánh hai chuỗi và nếu chúng không bằng nhau, sẽ hiển thị so sánh hữu ích làm nổi bật sự khác biệt trong hai chuỗi. Sự so sánh này hiện được sử dụng theo mặc định khi các chuỗi Unicode được so sánh vớiassertEqual().assertRegexpMatches()vàassertNotRegexpMatches()kiểm tra xem đối số đầu tiên có khớp với chuỗi hay không khớp với biểu thức chính quy được cung cấp làm đối số thứ hai (bpo-8038).assertRaisesRegexp()kiểm tra xem một ngoại lệ cụ thể có được đưa ra hay không, sau đó cũng kiểm tra xem biểu diễn chuỗi của ngoại lệ đó có khớp với biểu thức chính quy được cung cấp hay không.assertIn()vàassertNotIn()kiểm tra xem first có nằm trong second hay không.assertItemsEqual()kiểm tra xem hai chuỗi được cung cấp có chứa các phần tử giống nhau hay không.assertSetEqual()so sánh xem hai bộ có bằng nhau hay không và chỉ báo cáo sự khác biệt giữa các bộ trong trường hợp có lỗi.Tương tự,
assertListEqual()vàassertTupleEqual()so sánh các loại được chỉ định và giải thích mọi khác biệt mà không nhất thiết phải in giá trị đầy đủ của chúng; các phương thức này hiện được sử dụng theo mặc định khi so sánh danh sách và bộ dữ liệu bằngassertEqual(). Tổng quát hơn,assertSequenceEqual()so sánh hai chuỗi và có thể tùy ý kiểm tra xem cả hai chuỗi có thuộc một loại cụ thể hay không.assertDictEqual()so sánh hai từ điển và báo cáo sự khác biệt; giờ đây nó được sử dụng theo mặc định khi bạn so sánh hai từ điển bằngassertEqual().assertDictContainsSubset()kiểm tra xem tất cả các cặp khóa/giá trị trong first có được tìm thấy trong second hay không.assertAlmostEqual()vàassertNotAlmostEqual()kiểm tra xem first và second có gần bằng nhau hay không. Phương pháp này có thể làm tròn chênh lệch của chúng thành số places được chỉ định tùy chọn (mặc định là 7) và so sánh nó với 0 hoặc yêu cầu chênh lệch nhỏ hơn giá trị delta được cung cấp.loadTestsFromName()tôn vinh đúng thuộc tínhsuiteClasscủaTestLoader. (Đã sửa bởi Mark Roddy; bpo-6866.)Một hook mới cho phép bạn mở rộng phương thức
assertEqual()để xử lý các loại dữ liệu mới. Phương thứcaddTypeEqualityFunc()lấy một đối tượng kiểu và một hàm. Hàm sẽ được sử dụng khi cả hai đối tượng được so sánh đều thuộc loại được chỉ định. Hàm này sẽ so sánh hai đối tượng và đưa ra một ngoại lệ nếu chúng không khớp; Đó là một ý tưởng hay để hàm cung cấp thông tin bổ sung về lý do tại sao hai đối tượng không khớp nhau, giống như các phương pháp so sánh trình tự mới thực hiện.
unittest.main() hiện có đối số exit tùy chọn. Nếu sai, main() không gọi sys.exit(), cho phép sử dụng main() từ trình thông dịch tương tác. (Được đóng góp bởi J. Pablo Fernández; bpo-3379.)
TestResult có các phương thức startTestRun() và stopTestRun() mới được gọi ngay trước và sau khi chạy thử. (Được đóng góp bởi Robert Collins; bpo-5728.)
Với tất cả những thay đổi này, unittest.py ngày càng trở nên lớn đến mức khó xử, do đó mô-đun đã được chuyển thành một gói và mã được chia thành nhiều tệp (bởi Benjamin Peterson). Điều này không ảnh hưởng đến cách nhập hoặc sử dụng mô-đun.
Xem thêm
- https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml
Mô tả các tính năng mới, cách sử dụng chúng và lý do căn bản cho các quyết định thiết kế khác nhau. (Bởi Michael Food.)
Mô-đun cập nhật: ElementTree 1.3¶
Phiên bản của thư viện ElementTree đi kèm với Python đã được cập nhật lên phiên bản 1.3. Một số tính năng mới là:
Các hàm phân tích cú pháp khác nhau hiện lấy đối số từ khóa parser đưa ra một phiên bản
XMLParsersẽ được sử dụng. Điều này giúp có thể ghi đè mã hóa nội bộ của tệp:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", trình phân tích cú pháp=p)
Các lỗi khi phân tích cú pháp XML hiện gây ra ngoại lệ
ParseError, trong đó các phiên bản của chúng có thuộc tínhpositionchứa bộ dữ liệu (line, column) cung cấp vị trí của sự cố.Mã của ElementTree để chuyển đổi cây thành chuỗi đã được làm lại đáng kể, khiến mã này nhanh gấp đôi trong nhiều trường hợp. Các phương thức
ElementTree.write()vàElement.write()hiện có tham số method có thể là "xml" (mặc định), "html" hoặc "text". Chế độ HTML sẽ xuất ra các phần tử trống dưới dạng<empty></empty>thay vì<empty/>và chế độ văn bản sẽ bỏ qua các phần tử và chỉ xuất các đoạn văn bản. Nếu bạn đặt thuộc tínhtagcủa một phần tử thànhNonenhưng vẫn giữ nguyên các phần tử con của nó, phần tử đó sẽ bị bỏ qua khi cây được viết ra, do đó bạn không cần thực hiện sắp xếp lại rộng rãi hơn để loại bỏ một phần tử duy nhất.Việc xử lý không gian tên cũng đã được cải thiện. Tất cả các khai báo
xmlns:<whatever>hiện được xuất ra trên phần tử gốc, không nằm rải rác trong XML thu được. Bạn có thể đặt không gian tên mặc định cho cây bằng cách đặt thuộc tínhdefault_namespacevà có thể đăng ký tiền tố mới vớiregister_namespace(). Trong chế độ XML, bạn có thể sử dụng tham số xml_declaration đúng/sai để chặn khai báo XML.Phương thức
Elementmới:extend()nối các mục từ một chuỗi vào phần tử con của phần tử. Bản thân các phần tử hoạt động giống như các chuỗi, vì vậy thật dễ dàng để di chuyển phần tử con từ phần tử này sang phần tử khác:từ xml.etree nhập ElementTree dưới dạng ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </danh sách>""") mới = ET.XML('<root/>') mới.extend(t) # Outputs <root><item>1</item>...</root> in ET.tostring (mới)
Phương thức
Elementmới:iter()mang lại các phần tử con của phần tử làm trình tạo. Cũng có thể viếtfor child in elem:để lặp qua phần tử con của một phần tử. Phương thức hiện tạigetiterator()hiện không được dùng nữa, cũng nhưgetchildren()xây dựng và trả về danh sách con.Phương thức
Elementmới:itertext()mang lại tất cả các đoạn văn bản là hậu duệ của phần tử. Ví dụ:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </danh sách>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] danh sách in(t.itertext())
Không được dùng nữa: sử dụng một phần tử làm Boolean (tức là
if elem:) sẽ trả về true nếu phần tử đó có bất kỳ phần tử con nào hoặc sai nếu không có phần tử con nào. Hành vi này gây nhầm lẫn --Nonelà sai, nhưng phần tử không có con cũng vậy? -- vì vậy bây giờ nó sẽ kích hoạtFutureWarning. Trong mã của bạn, bạn phải nói rõ: viếtlen(elem) != 0nếu bạn quan tâm đến số lượng trẻ em hoặcelem is not None.
Fredrik Lundh phát triển ElementTree và sản xuất phiên bản 1.3; bạn có thể đọc bài viết của anh ấy mô tả 1.3 tại https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna đã cập nhật phiên bản đi kèm với Python, sau các cuộc thảo luận về python-dev và trong bpo-6472.)
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:
Bản phát hành mới nhất của Trình gỡ lỗi GNU, GDB 7, có thể là scripted using Python. Khi bạn bắt đầu gỡ lỗi một chương trình thực thi P, GDB sẽ tìm tệp có tên
P-gdb.pyvà tự động đọc nó. Dave Malcolm đã đóng góp mộtpython-gdb.pybổ sung một số lệnh hữu ích khi gỡ lỗi Python. Ví dụ:py-upvàpy-downtăng hoặc giảm một khung ngăn xếp Python, thường tương ứng với một số khung ngăn xếp C.py-printin giá trị của biến Python vàpy-btin dấu vết ngăn xếp Python. (Đã thêm do bpo-8032.)Nếu bạn sử dụng tệp
.gdbinitđược cung cấp bằng Python, macro "pyo" trong phiên bản 2.7 hiện hoạt động chính xác khi luồng được gỡ lỗi không giữ GIL; macro hiện có được nó trước khi in. (Được đóng góp bởi Victor Stinner; bpo-3632.)Py_AddPendingCall()hiện an toàn cho luồng, cho phép mọi luồng công việc gửi thông báo đến luồng Python chính. Điều này đặc biệt hữu ích cho các hoạt động IO không đồng bộ. (Được đóng góp bởi Kristján Valur Jónsson; bpo-4293.)Chức năng mới:
PyCode_NewEmpty()tạo một đối tượng mã trống; chỉ cần tên tệp, tên hàm và số dòng đầu tiên. Điều này hữu ích cho các mô-đun mở rộng đang cố gắng xây dựng một ngăn xếp truy nguyên hữu ích hơn. Trước đây các tiện ích mở rộng như vậy cần gọiPyCode_New(), có nhiều đối số hơn. (Được thêm bởi Jeffrey Yasskin.)Hàm mới:
PyErr_NewExceptionWithDoc()tạo một lớp ngoại lệ mới, giống nhưPyErr_NewException()hiện có, nhưng lấy thêm một đối sốchar *chứa chuỗi tài liệu cho lớp ngoại lệ mới. (Được thêm bởi 'lekma' trên trình theo dõi lỗi Python; bpo-7033.)Hàm mới:
PyFrame_GetLineNumber()lấy một đối tượng khung và trả về số dòng mà khung hiện đang thực thi. Mã trước đây sẽ cần lấy chỉ mục của lệnh mã byte hiện đang thực thi, sau đó tra cứu số dòng tương ứng với địa chỉ đó. (Được thêm bởi Jeffrey Yasskin.)Các hàm mới:
PyLong_AsLongAndOverflow()vàPyLong_AsLongLongAndOverflow()xấp xỉ một số nguyên dài Python dưới dạng C long hoặc long long. Nếu số quá lớn để vừa với loại đầu ra, cờ overflow sẽ được đặt và trả về cho người gọi. (Được đóng góp bởi Case Van Horsen; bpo-7528 và bpo-7767.)Chức năng mới: xuất phát từ việc viết lại chuyển đổi chuỗi thành float, một chức năng
PyOS_string_to_double()mới đã được thêm vào. Các hàmPyOS_ascii_strtod()vàPyOS_ascii_atof()cũ hiện không được dùng nữa.Chức năng mới:
PySys_SetArgvEx()đặt giá trị củasys.argvvà có thể tùy chọn cập nhậtsys.pathđể bao gồm thư mục chứa tập lệnh được đặt tên bởisys.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ậtsys.pathvà đô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ênos.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ụngPySys_SetArgvEx()với updatepath được đặt thành false hay không.Vấn đề bảo mật được báo cáo là CVE 2008-5983; được thảo luận trong bpo-5753 và được Antoine Pitrou sửa.
Macro mới: các tệp tiêu đề Python hiện xác định các macro sau:
Py_ISALNUM,Py_ISALPHA,Py_ISDIGIT,Py_ISLOWER,Py_ISSPACE,Py_ISUPPER,Py_ISXDIGIT,Py_TOLOWERvàPy_TOUPPER. Tất cả các hàm này đều tương tự như các macro tiêu chuẩn C để phân loại ký tự, nhưng bỏ qua cài đặt ngôn ngữ hiện tại, vì ở một số nơi, Python cần phân tích các ký tự theo cách độc lập với ngôn ngữ. (Được thêm bởi Eric Smith; bpo-5793.)Chức năng đã bị xóa:
PyEval_CallObject()hiện chỉ khả dụng dưới dạng macro. Một phiên bản chức năng đã được giữ lại để duy trì khả năng tương thích liên kết ABI, nhưng đó là vào năm 1997; nó chắc chắn có thể bị xóa bây giờ. (Đã bị xóa bởi Antoine Pitrou; bpo-8276.)Mã định dạng mới: các hàm
PyString_FromFormat(),PyString_FromFormatV()vàPyErr_Format()hiện chấp nhận mã định dạng%lldvà%lluđể hiển thị các loại long long của C. (Được đóng góp bởi Mark Dickinson; bpo-7228.)Sự tương tác phức tạp giữa các luồng và quá trình phân nhánh đã được thay đổi. Trước đây, tiến trình con được tạo bởi
os.fork()có thể không thành công vì tiến trình con được tạo chỉ với một luồng duy nhất đang chạy, luồng thực hiệnos.fork(). Nếu các luồng khác đang giữ một khóa, chẳng hạn như khóa nhập của Python, khi phân nhánh được thực hiện, khóa sẽ vẫn được đánh dấu là "được giữ" trong quy trình mới. Nhưng trong quy trình con sẽ không có gì có thể giải phóng khóa vì các luồng khác không được sao chép và quy trình con sẽ không thể thực hiện nhập nữa.Python 2.7 lấy khóa nhập trước khi thực hiện
os.fork()và cũng sẽ dọn sạch mọi khóa được tạo bằng mô-đunthreading. Các mô-đun mở rộng C có khóa bên trong hoặc gọifork()sẽ không được hưởng lợi từ việc dọn dẹp này.(Đã sửa bởi Thomas Wouters; bpo-1590864.)
Hàm
Py_Finalize()hiện gọi hàmthreading._shutdown()nội bộ; điều này ngăn không cho một số trường hợp ngoại lệ được nêu ra khi trình thông dịch tắt. (Bản vá của Adam Olsen; bpo-1722344.)Khi sử dụng cấu trúc
PyMemberDefđể xác định thuộc tính của một loại, Python sẽ không còn cho phép bạn cố gắng xóa hoặc đặt thuộc tínhT_STRING_INPLACEnữa.Các ký hiệu chung được xác định bởi mô-đun
ctypeshiện có tiền tố làPyhoặc_ctypes. (Được thực hiện bởi Thomas Heller; bpo-3102.)Tùy chọn cấu hình mới: switch
--with-system-expatcho phép xây dựng mô-đunpyexpatđể sử dụng thư viện Expat của hệ thống. (Được đóng góp bởi Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Tùy chọn cấu hình mới: tùy chọn
--with-valgrindgiờ đây sẽ vô hiệu hóa bộ cấp phát pymalloc, điều này khiến trình phát hiện lỗi bộ nhớ Valgrind khó phân tích chính xác. Do đó, Valgrind sẽ phát hiện rò rỉ và tràn bộ nhớ tốt hơn. (Được đóng góp bởi James Henstridge; bpo-2422.)Tùy chọn cấu hình mới: giờ đây bạn có thể cung cấp một chuỗi trống cho
--with-dbmliborder=để tắt tất cả các mô-đun DBM khác nhau. (Được thêm bởi Arfrever Frehtes Taifersar Arahesis; bpo-6491.)Tập lệnh configure hiện kiểm tra các lỗi làm tròn dấu phẩy động trên một số chip Intel 32 bit nhất định và xác định định nghĩa bộ tiền xử lý
X87_DOUBLE_ROUNDING. Hiện tại không có mã nào sử dụng định nghĩa này nhưng nó có sẵn nếu có ai muốn sử dụng nó. (Được thêm bởi Mark Dickinson; bpo-2937.)configure hiện cũng đặt biến Makefile
LDCXXSHAREDđể hỗ trợ liên kết C++. (Được đóng góp bởi Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)Quá trình xây dựng hiện tạo các tệp cần thiết để hỗ trợ pkg-config. (Được đóng góp bởi Clinton Roy; bpo-3585.)
Quá trình xây dựng hiện hỗ trợ Subversion 1.7. (Được đóng góp bởi Arfrever Frehtes Taifersar Arahesis; bpo-6094.)
Viên nang¶
Python 3.1 bổ sung kiểu dữ liệu C mới, PyCapsule, để cung cấp C API cho mô-đun mở rộng. Về cơ bản, một viên nang là nơi chứa con trỏ C void * và được cung cấp dưới dạng thuộc tính mô-đun; ví dụ: API của mô-đun socket được hiển thị dưới dạng socket.CAPI và unicodedata hiển thị ucnhash_CAPI. Các tiện ích mở rộng khác có thể nhập mô-đun, truy cập từ điển của nó để lấy đối tượng viên nang và sau đó lấy con trỏ void *, con trỏ này thường trỏ đến một loạt các con trỏ tới các hàm API khác nhau của mô-đun.
Có một loại dữ liệu hiện có đã được sử dụng cho việc này, PyCObject, nhưng nó không cung cấp sự an toàn về loại. Mã xấu được viết bằng Python thuần túy có thể gây ra lỗi phân đoạn bằng cách lấy PyCObject từ mô-đun A và bằng cách nào đó thay thế nó bằng PyCObject trong mô-đun B. Các viên nang biết tên riêng của chúng và để nhận được con trỏ yêu cầu cung cấp tên:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "loại đối số không hợp lệ");
trả lại NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Bạn yên tâm rằng vtable trỏ đến bất cứ điều gì bạn đang mong đợi. Nếu một viên nang khác được chuyển vào, PyCapsule_IsValid() sẽ phát hiện tên không khớp và trả về sai. Tham khảo Cung cấp C API cho Mô-đun mở rộng để biết thêm thông tin về cách sử dụng các đối tượng này.
Python 2.7 hiện sử dụng các viên nang bên trong để cung cấp nhiều API mô-đun mở rộng khác nhau, nhưng PyCObject_AsVoidPtr() đã được sửa đổi để xử lý các viên nang, duy trì khả năng tương thích thời gian biên dịch với giao diện PyCObject. Việc sử dụng PyCObject_AsVoidPtr() sẽ báo hiệu PendingDeprecationWarning, theo mặc định là im lặng.
Được triển khai bằng Python 3.1 và được Larry Hastings chuyển sang 2.7; được thảo luận trong bpo-5630.
Thay đổi theo cổng cụ thể: Windows¶
Mô-đun
msvcrthiện chứa một số hằng số từ tệp tiêu đềcrtassem.h:CRT_ASSEMBLY_VERSION,VC_ASSEMBLY_PUBLICKEYTOKENvàLIBRARIES_ASSEMBLY_NAME_PREFIX. (Được đóng góp bởi David Cournapeau; bpo-4365.)Mô-đun
_winregđể truy cập sổ đăng ký hiện triển khai các hàmCreateKeyEx()vàDeleteKeyEx(), phiên bản mở rộng của các hàm được hỗ trợ trước đây có thêm một số đối số.DisableReflectionKey(),EnableReflectionKey()vàQueryReflectionKey()cũng đã được thử nghiệm và ghi lại. (Được thực hiện bởi Brian Curtin: bpo-7347.)_beginthreadex()API mới được sử dụng để bắt đầu các luồng và các chức năng lưu trữ cục bộ của luồng gốc hiện được sử dụng. (Được đóng góp bởi Kristján Valur Jónsson; bpo-3582.)Chức năng
os.kill()hiện hoạt động trên Windows. Giá trị tín hiệu có thể là hằng sốCTRL_C_EVENT,CTRL_BREAK_EVENThoặc bất kỳ số nguyên nào. Hai hằng số đầu tiên sẽ gửi các sự kiện nhấn phím Control-C và Control-Break tới các quy trình con; mọi giá trị khác sẽ sử dụngTerminateProcess()API. (Được đóng góp bởi Miki Tebeka; bpo-1220212.)Hàm
os.listdir()hiện không thành công đối với đường dẫn trống. (Đã sửa bởi Hirokazu Yamamoto; bpo-5913.)Mô-đun
mimetypesbây giờ sẽ đọc cơ sở dữ liệu MIME từ sổ đăng ký Windows khi khởi tạo. (Bản vá của Gabriel Genellina; bpo-4969.)
Thay đổi theo cổng cụ thể: Mac OS X¶
Đường dẫn
/Library/Python/2.7/site-packageshiện được thêm vàosys.path, để chia sẻ các gói bổ sung giữa quá trình cài đặt hệ thống và bản sao do người dùng cài đặt của cùng một phiên bản. (Được thay đổi bởi Ronald Oussoren; bpo-4865.)Thay đổi trong phiên bản 2.7.13: Kể từ ngày 2.7.13, thay đổi này đã bị xóa.
/Library/Python/2.7/site-packages, thư mục gói trang web được sử dụng bởi hệ thống Python 2.7 do Apple cung cấp không còn được thêm vàosys.pathcho các Python do người dùng cài đặt, chẳng hạn như từ trình cài đặt python.org. Kể từ macOS 10.12, Apple đã thay đổi cách định cấu hình thư mục gói trang web của hệ thống, điều này có thể khiến quá trình cài đặt các thành phần pip, như setuptools, không thành công. Các gói được cài đặt cho hệ thống Python sẽ không còn được chia sẻ với các Python do người dùng cài đặt. (bpo-28440)
Thay đổi theo cổng cụ thể: FreeBSD¶
Hằng số
SO_SETFIBcủa FreeBSD 7.1, được sử dụng với các phương thứcsocket()getsockopt()/setsockopt()để chọn bảng định tuyến thay thế, hiện có sẵn trong mô-đunsocket. (Được thêm bởi Kyle VanderBeek; bpo-8235.)
Những thay đổi và sửa lỗi khác¶
Hai tập lệnh chuẩn,
iobenchvàccbench, đã được thêm vào thư mụcTools.iobenchđo tốc độ của các đối tượng I/O tệp tích hợp đượcopen()trả về trong khi thực hiện nhiều thao tác khác nhau vàccbenchlà điểm chuẩn đồng thời cố gắng đo thông lượng tính toán, độ trễ chuyển đổi luồng và băng thông xử lý IO khi thực hiện một số tác vụ bằng cách sử dụng số lượng luồng khác nhau.Tập lệnh
Tools/i18n/msgfmt.pyhiện hiểu dạng số nhiều trong tệp.po. (Đã sửa bởi Martin von Löwis; bpo-5464.)Khi nhập mô-đun từ tệp
.pychoặc.pyobằng bản sao.pyhiện có, thuộc tínhco_filenamecủa đối tượng mã kết quả sẽ bị ghi đè khi tên tệp gốc đã lỗi thời. Điều này có thể xảy ra nếu tệp đã được đổi tên, di chuyển hoặc được truy cập qua các đường dẫn khác nhau. (Bản vá của Ziga Seilnacht và Jean-Paul Calderone; bpo-1180193.)Tập lệnh
regrtest.pyhiện có một công tắc--randseed=lấy một số nguyên sẽ được sử dụng làm hạt giống ngẫu nhiên cho tùy chọn-rthực hiện kiểm tra theo thứ tự ngẫu nhiên. Tùy chọn-rcũng báo cáo hạt giống đã được sử dụng (Được thêm bởi Collin Winter.)Một công tắc
regrtest.pykhác là-j, lấy một số nguyên chỉ định có bao nhiêu thử nghiệm chạy song song. Điều này cho phép giảm tổng thời gian chạy trên các máy đa lõi. Tùy chọn này tương thích với một số tùy chọn khác, bao gồm cả công tắc-Rđược biết là tạo ra thời gian chạy dài. (Được thêm bởi Antoine Pitrou, bpo-6152.) Điều này cũng có thể được sử dụng với công tắc-Fmới chạy các thử nghiệm đã chọn trong một vòng lặp cho đến khi chúng thất bại. (Được thêm bởi Antoine Pitrou; bpo-7312.)Khi được thực thi dưới dạng tập lệnh, mô-đun
py_compile.pyhiện chấp nhận'-'làm đối số, nó sẽ đọc đầu vào tiêu chuẩn cho danh sách tên tệp sẽ được biên dịch. (Được đóng góp bởi Piotr Ożarowski; bpo-8233.)
Chuyển sang Python 2.7¶
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:
Hàm
range()xử lý các đối số của nó một cách nhất quán hơn; bây giờ nó sẽ gọi__int__()trên các đối số không float, không nguyên được cung cấp cho nó. (Đã sửa bởi Alexander Belopolsky; bpo-1533.)Phương thức chuỗi
format()đã thay đổi độ chính xác mặc định được sử dụng cho số dấu phẩy động và số phức từ 6 chữ số thập phân thành 12, khớp với độ chính xác được sử dụng bởistr(). (Được thay đổi bởi Eric Smith; bpo-5920.)Do tối ưu hóa câu lệnh
with, các phương thức đặc biệt__enter__()và__exit__()phải thuộc loại của đối tượng và không thể được gắn trực tiếp vào phiên bản của đối tượng. Điều này ảnh hưởng đến các lớp kiểu mới (bắt nguồn từobject) và các loại phần mở rộng C. (bpo-6101.)Do lỗi trong Python 2.6, tham số exc_value cho các phương thức
__exit__()thường là biểu diễn chuỗi của ngoại lệ, không phải là một phiên bản. Điều này đã được sửa trong phiên bản 2.7, vì vậy exc_value sẽ là một phiên bản như mong đợi. (Đã sửa bởi Florent Xicluna; bpo-7853.)Khi một tập hợp thuộc tính bị hạn chế được đặt bằng
__slots__, việc xóa một thuộc tính chưa được đặt sẽ không làm tăngAttributeErrornhư bạn mong đợi. Đã sửa bởi Benjamin Peterson; bpo-7604.)
Trong thư viện tiêu chuẩn:
Các hoạt động với phiên bản
datetimedẫn đến một năm nằm ngoài phạm vi được hỗ trợ không phải lúc nào cũng tăngOverflowError. Những lỗi như vậy hiện được kiểm tra cẩn thận hơn và sẽ đưa ra ngoại lệ. (Báo cáo bởi Mark Leander, bản vá của Anand B. Pillai và Alexander Belopolsky; bpo-7150.)Khi sử dụng các phiên bản
Decimalvới phương thứcformat()của chuỗi, căn chỉnh mặc định trước đây là căn trái. Điều này đã được thay đổi thành căn lề phải, điều này có thể thay đổi kết quả đầu ra của chương trình của bạn. (Được thay đổi bởi Mark Dickinson; bpo-6857.)Các so sánh liên quan đến giá trị NaN báo hiệu (hoặc
sNAN) hiện báo hiệuInvalidOperationthay vì âm thầm trả về giá trị đúng hoặc sai tùy thuộc vào toán tử so sánh. Các giá trị NaN yên tĩnh (hoặcNaN) hiện có thể băm được. (Đã sửa bởi Mark Dickinson; bpo-7279.)Thư viện
xml.etree.ElementTreekhông còn thoát khỏi ký hiệu và dấu ngoặc nhọn khi xuất ra lệnh xử lý XML (trông giống<?xml-stylesheet href="#style1"?>) hoặc nhận xét (trông giống<!-- comment -->). (Bản vá của Neil Muller; bpo-2746.)Phương thức
readline()của các đối tượngStringIOhiện không làm gì khi yêu cầu độ dài âm, giống như các đối tượng giống tệp khác vẫn làm. (bpo-7348).Mô-đun
syslogbây giờ sẽ sử dụng giá trị củasys.argv[0]làm mã định danh thay vì giá trị mặc định trước đó là'python'. (Được thay đổi bởi Sean Reifschneider; bpo-8451.)Việc xử lý lỗi mặc định của mô-đun
tarfileđã thay đổi để không còn ngăn chặn các lỗi nghiêm trọng nữa. Mức lỗi mặc định trước đây là 0, có nghĩa là lỗi sẽ chỉ dẫn đến một thông báo được ghi vào nhật ký gỡ lỗi, nhưng do nhật ký gỡ lỗi không được kích hoạt theo mặc định nên những lỗi này sẽ không được chú ý. Mức lỗi mặc định bây giờ là 1, sẽ có ngoại lệ nếu có lỗi. (Được thay đổi bởi Lars Gustäbel; bpo-7357.)urlsplit()của mô-đunurlparsehiện xử lý các lược đồ URL không xác định theo kiểu tương thích với RFC 3986: nếu URL có dạng"<something>://...", thì văn bản trước://sẽ được coi là lược đồ, ngay cả khi đó là một lược đồ bịa đặt mà mô-đun không biết. Thay đổi này có thể phá vỡ mã hoạt động xung quanh hành vi cũ. Ví dụ: Python 2.6.4 hoặc 2.5 sẽ trả về như sau:>>> nhập urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('được phát minh', '', '//host/filename?query', '', '')
Python 2.7 (và Python 2.6.5) sẽ trả về:
>>> nhập urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('được phát minh', 'máy chủ', '/filename?query', '', '')
(Python 2.7 thực sự tạo ra kết quả hơi khác một chút, vì nó trả về một bộ dữ liệu có tên thay vì một bộ dữ liệu tiêu chuẩn.)
Đối với phần mở rộng C:
Các tiện ích mở rộng C sử dụng mã định dạng số nguyên với họ hàm
PyArg_Parse*giờ đây sẽ đưa ra ngoại lệTypeErrorthay vì kích hoạtDeprecationWarning(bpo-5080).Sử dụng hàm
PyOS_string_to_double()mới thay vì các hàmPyOS_ascii_strtod()vàPyOS_ascii_atof()cũ hiện không được dùng nữa.
Đối với các ứng dụng nhúng Python:
Chức năng
PySys_SetArgvEx()đã được thêm vào, cho phép các ứng dụng đóng lỗ hổng bảo mật khi sử dụng chức năngPySys_SetArgv()hiện có. Kiểm tra xem bạn có đang gọiPySys_SetArgv()hay không và cân nhắc cẩn thận xem ứng dụng có nên sử dụngPySys_SetArgvEx()với updatepath được đặt thành false hay không.
Các tính năng mới được thêm vào bản phát hành bảo trì Python 2.7¶
Các tính năng mới có thể được thêm vào bản phát hành bảo trì Python 2.7 khi tình huống thực sự cần đến nó. Bất kỳ bổ sung nào như vậy đều phải trải qua quy trình Đề xuất cải tiến Python và đưa ra trường hợp thuyết phục về lý do tại sao chúng không thể được giải quyết thỏa đáng bằng cách chỉ thêm tính năng mới vào Python 3 hoặc bằng cách xuất bản nó trên Chỉ mục gói Python.
Ngoài các đề xuất cụ thể được liệt kê bên dưới, còn có một ngoại lệ chung cho phép thêm cảnh báo -3 mới vào bất kỳ bản phát hành bảo trì Python 2.7 nào.
Hai biến môi trường mới cho chế độ gỡ lỗi¶
Trong chế độ gỡ lỗi, thống kê [xxx refs] không được ghi theo mặc định, biến môi trường PYTHONSHOWREFCOUNT bây giờ cũng phải được đặt. (Được đóng góp bởi Victor Stinner; bpo-31733.)
Khi Python được biên dịch với COUNT_ALLOC được xác định, số lượng phân bổ không còn được kết xuất theo mặc định nữa: biến môi trường PYTHONSHOWALLOCCOUNT bây giờ cũng phải được đặt. Hơn nữa, số lượng phân bổ hiện được chuyển vào thiết bị xuất chuẩn, thay vì thiết bị xuất chuẩn. (Được đóng góp bởi Victor Stinner; bpo-31692.)
Added in version 2.7.15.
PEP 434: Ngoại lệ nâng cao IDLE cho tất cả các nhánh¶
PEP 434 mô tả sự miễn trừ chung đối với những thay đổi được thực hiện đối với môi trường phát triển IDLE được cung cấp cùng với Python. Sự miễn trừ này giúp các nhà phát triển IDLE có thể cung cấp trải nghiệm người dùng nhất quán hơn trên tất cả các phiên bản Python 2 và 3 được hỗ trợ.
Để biết chi tiết về mọi thay đổi IDLE, hãy tham khảo tệp NEWS để biết bản phát hành cụ thể.
PEP 466: Cải tiến bảo mật mạng cho Python 2.7¶
PEP 466 mô tả một số đề xuất nâng cao bảo mật mạng đã được phê duyệt để đưa vào bản phát hành bảo trì Python 2.7, với những thay đổi đầu tiên xuất hiện trong bản phát hành Python 2.7.7.
Các tính năng liên quan đến PEP 466 được thêm vào Python 2.7.7:
hmac.compare_digest()đã được nhập lại từ Python 3 để cung cấp hoạt động so sánh khả năng chống tấn công theo thời gian cho các ứng dụng Python 2. (Được đóng góp bởi Alex Gaynor; bpo-21306.)OpenSSL 1.0.1g đã được nâng cấp trong trình cài đặt Windows chính thức được xuất bản trên python.org. (Được đóng góp bởi Zachary Ware; bpo-21462.)
Các tính năng liên quan đến PEP 466 được thêm vào trong Python 2.7.8:
hashlib.pbkdf2_hmac()được nhập lại từ Python 3 để tạo ra thuật toán băm phù hợp cho việc lưu trữ mật khẩu an toàn được cung cấp rộng rãi cho các ứng dụng Python 2. (Được đóng góp bởi Alex Gaynor; bpo-21304.)OpenSSL 1.0.1h đã được nâng cấp cho trình cài đặt Windows chính thức được xuất bản trên python.org. (Được đóng góp bởi Zachary Ware trong bpo-21671 cho CVE 2014-0224.)
Các tính năng liên quan đến PEP 466 được thêm vào trong Python 2.7.9:
Hầu hết mô-đun
sslcủa Python 3.4 đã được nhập lại. Điều này có nghĩa làsslhiện hỗ trợ Chỉ định tên máy chủ, cài đặt TLS1.x, quyền truy cập vào kho chứng chỉ nền tảng, lớpSSLContextvà các tính năng khác. (Được đóng góp bởi Alex Gaynor và David Reid; bpo-21308.)Tham khảo ghi chú "Phiên bản đã thêm: 2.7.9" trong tài liệu mô-đun để biết chi tiết cụ thể.
os.urandom()đã được thay đổi để lưu bộ mô tả tệp vào bộ đệm/dev/urandomthay vì mở lại/dev/urandomtrong mỗi cuộc gọi. (Được đóng góp bởi Alex Gaynor; bpo-21305.)hashlib.algorithms_guaranteedvàhashlib.algorithms_availableđược nhập lại từ Python 3 để giúp các ứng dụng Python 2 dễ dàng chọn thuật toán băm mạnh nhất hiện có. (Được đóng góp bởi Alex Gaynor trong bpo-21307)
PEP 477: Đảm bảo backport (PEP 453) sang Python 2.7¶
PEP 477 phê duyệt việc đưa mô-đun đảm bảo PEP 453 và tài liệu cải tiến được nó kích hoạt trong bản phát hành bảo trì Python 2.7, xuất hiện đầu tiên trong bản phát hành Python 2.7.9.
Khởi động pip theo mặc định¶
Mô-đun ensurepip mới (được xác định trong PEP 453) cung cấp cơ chế đa nền tảng tiêu chuẩn để khởi động trình cài đặt pip vào bản cài đặt Python. Phiên bản pip đi kèm với Python 2.7.9 là pip 1.5.6 và các bản phát hành bảo trì 2.7.x trong tương lai sẽ cập nhật phiên bản đi kèm lên phiên bản mới nhất của pip hiện có tại thời điểm tạo ứng cử viên phát hành.
Theo mặc định, các lệnh pip, pipX và pipX.Y sẽ được cài đặt trên tất cả các nền tảng (trong đó X.Y là viết tắt của phiên bản cài đặt Python), cùng với gói Python pip và các phần phụ thuộc của nó.
Đối với CPython source builds on POSIX systems, các lệnh make install và make altinstall không khởi động pip theo mặc định. Hành vi này có thể được kiểm soát thông qua các tùy chọn cấu hình và được ghi đè thông qua các tùy chọn Makefile.
Trên Windows và Mac OS X, trình cài đặt CPython hiện mặc định cài đặt pip cùng với chính CPython (người dùng có thể chọn không cài đặt nó trong quá trình cài đặt). Người dùng Windows sẽ cần chọn tham gia sửa đổi PATH tự động để có sẵn pip từ dòng lệnh theo mặc định, nếu không, nó vẫn có thể được truy cập thông qua trình khởi chạy Python dành cho Windows dưới dạng py -m pip.
Giống như discussed in the PEP, người đóng gói nền tảng có thể chọn không cài đặt các lệnh này theo mặc định, miễn là khi được gọi, chúng cung cấp hướng dẫn rõ ràng và đơn giản về cách cài đặt chúng trên nền tảng đó (thường sử dụng trình quản lý gói hệ thống).
Thay đổi tài liệu¶
Là một phần của thay đổi này, các phần Cài đặt mô-đun Python và Phân phối các mô-đun Python của tài liệu đã được thiết kế lại hoàn toàn dưới dạng tài liệu bắt đầu ngắn và tài liệu FAQ. Hầu hết các tài liệu đóng gói hiện đã được chuyển đến Cơ quan quản lý đóng gói Python được duy trì Python Packaging User Guide và tài liệu của từng dự án.
Tuy nhiên, vì quá trình di chuyển này hiện vẫn chưa hoàn tất nên các phiên bản cũ của những hướng dẫn đó vẫn có sẵn dưới dạng Xây dựng tiện ích mở rộng C và C++ bằng setuptools và Xây dựng tiện ích mở rộng C và C++ bằng setuptools.
Xem thêm
- PEP 453 -- Khởi động rõ ràng pip trong cài đặt Python
PEP được viết bởi Donald Stufft và Nick Coghlan, được thực hiện bởi Donald Stufft, Nick Coghlan, Martin von Löwis và Ned Deily.
PEP 476: Bật xác minh chứng chỉ theo mặc định cho máy khách http stdlib¶
PEP 476 đã cập nhật httplib và các mô-đun sử dụng nó, chẳng hạn như urllib2 và xmlrpclib, để xác minh rằng máy chủ xuất trình chứng chỉ được Cơ quan cấp chứng chỉ ký trong kho lưu trữ tin cậy của nền tảng và tên máy chủ của nó khớp với tên máy chủ được yêu cầu theo mặc định, cải thiện đáng kể tính bảo mật cho nhiều ứng dụng. Thay đổi này được thực hiện trong bản phát hành Python 2.7.9.
Đối với các ứng dụng yêu cầu hành vi cũ trước đó, chúng có thể chuyển ngữ cảnh thay thế:
nhập urllib2
nhập khẩu ssl
# This vô hiệu hóa tất cả xác minh
bối cảnh = ssl._create_unverified_context()
# This cho phép sử dụng chứng chỉ cụ thể cho máy chủ mà không cần
# to hãy vào cửa hàng ủy thác
bối cảnh = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", bối cảnh=bối cảnh)
PEP 493: công cụ di chuyển xác minh HTTPS cho Python 2.7¶
PEP 493 cung cấp các công cụ di chuyển bổ sung để hỗ trợ quá trình nâng cấp cơ sở hạ tầng gia tăng hơn cho các môi trường chứa ứng dụng và dịch vụ dựa vào quá trình xử lý chứng chỉ máy chủ cho phép trước đây khi thiết lập kết nối HTTPS máy khách. Những bổ sung này được thực hiện trong bản phát hành Python 2.7.12.
Những công cụ này được thiết kế để sử dụng trong trường hợp không thể sửa đổi các ứng dụng và dịch vụ bị ảnh hưởng để vượt qua bối cảnh SSL dễ dàng hơn khi thiết lập kết nối.
Đối với các ứng dụng và dịch vụ hoàn toàn không thể sửa đổi, biến môi trường PYTHONHTTPSVERIFY mới có thể được đặt thành 0 để hoàn nguyên toàn bộ quy trình Python về hành vi cho phép mặc định của Python 2.7.8 trở về trước.
Đối với những trường hợp không thể sửa đổi mã thiết lập kết nối nhưng ứng dụng tổng thể thì có thể, chức năng ssl._https_verify_certificates() mới có thể được sử dụng để điều chỉnh hành vi mặc định trong thời gian chạy.
Mục tiêu xây dựng make regen-all mới¶
Để đơn giản hóa quá trình biên dịch chéo và để đảm bảo rằng CPython có thể được biên dịch một cách đáng tin cậy mà không yêu cầu phải có sẵn phiên bản Python hiện có, hệ thống xây dựng dựa trên autotools không còn cố gắng biên dịch lại các tệp được tạo dựa trên thời gian sửa đổi tệp một cách ngầm định nữa.
Thay vào đó, lệnh make regen-all mới đã được thêm vào để buộc tái tạo các tệp này khi muốn (ví dụ: sau khi phiên bản ban đầu của Python đã được xây dựng dựa trên các phiên bản được tạo trước).
Các mục tiêu tái tạo có chọn lọc hơn cũng được xác định - xem Makefile.pre.in để biết chi tiết.
(Được đóng góp bởi Victor Stinner trong bpo-23404.)
Added in version 2.7.14.
Loại bỏ mục tiêu xây dựng make touch¶
Mục tiêu xây dựng make touch trước đây được sử dụng để yêu cầu tái tạo ngầm các tệp được tạo bằng cách cập nhật thời gian sửa đổi của chúng đã bị xóa.
Nó đã được thay thế bằng mục tiêu make regen-all mới.
(Được đóng góp bởi Victor Stinner trong bpo-23404.)
Thay đổi trong phiên bản 2.7.14.
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: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray, Hugh Secker-Walker.