Có gì mới trong Python 3.2¶
- tác giả:
Raymond Hettinger
Bài viết này giải thích các tính năng mới trong Python 3.2 so với 3.1. Python 3.2 được phát hành vào ngày 20 tháng 2 năm 2011. Nó tập trung vào một số điểm nổi bật và đưa ra một số ví dụ. Để biết chi tiết đầy đủ, hãy xem tệp Misc/NEWS.
Xem thêm
PEP 392 - Lịch phát hành Python 3.2
PEP 384: Xác định ABI ổn định¶
Trước đây, các mô-đun mở rộng được xây dựng cho một phiên bản Python thường không thể sử dụng được với các phiên bản Python khác. Đặc biệt trên Windows, mọi bản phát hành tính năng của Python đều yêu cầu phải xây dựng lại tất cả các mô-đun mở rộng mà người dùng muốn sử dụng. Yêu cầu này là kết quả của quyền truy cập miễn phí vào phần bên trong của trình thông dịch Python mà các mô-đun mở rộng có thể sử dụng.
Với Python 3.2, một phương pháp thay thế sẽ khả dụng: các mô-đun mở rộng tự giới hạn ở một API giới hạn (bằng cách xác định Py_LIMITED_API) không thể sử dụng nhiều phần bên trong, nhưng bị hạn chế ở một tập hợp các hàm API được hứa hẹn sẽ ổn định cho một số bản phát hành. Do đó, các mô-đun mở rộng được xây dựng cho 3.2 ở chế độ đó cũng sẽ hoạt động với 3.3, 3.4, v.v. Các mô-đun mở rộng sử dụng các chi tiết của cấu trúc bộ nhớ vẫn có thể được xây dựng nhưng sẽ cần được biên dịch lại cho mỗi lần phát hành tính năng.
Xem thêm
- PEP 384 - Xác định ABI ổn định
PEP được viết bởi Martin von Löwis.
PEP 389: Mô-đun phân tích dòng lệnh Argparse¶
Một mô-đun mới để phân tích cú pháp dòng lệnh, argparse, đã được giới thiệu để khắc phục những hạn chế của optparse không cung cấp hỗ trợ cho các đối số vị trí (không chỉ các tùy chọn), các lệnh phụ, các tùy chọn bắt buộc và các mẫu phổ biến khác về chỉ định và xác thực các tùy chọn.
Mô-đun này đã đạt được thành công rộng rãi trong cộng đồng với tư cách là mô-đun của bên thứ ba. Với đầy đủ tính năng hơn phiên bản tiền nhiệm, mô-đun argparse hiện là mô-đun được ưa thích để xử lý dòng lệnh. Mô-đun cũ hơn vẫn đang được duy trì vì có một lượng lớn mã kế thừa phụ thuộc vào nó.
Dưới đây là trình phân tích cú pháp ví dụ có chú thích hiển thị các tính năng như giới hạn kết quả cho một tập hợp các lựa chọn, chỉ định metavar trong màn hình trợ giúp, xác thực rằng có một hoặc nhiều đối số vị trí và tạo một tùy chọn bắt buộc:
nhập khẩu argparse
trình phân tích cú pháp = argparse.ArgumentParser(
description = 'Quản lý máy chủ', # main description để được trợ giúp
epilog = 'Đã thử nghiệm trên Solaris và Linux') # displayed sau khi được trợ giúp
parser.add_argument('action', tên # argument
lựa chọn = ['triển khai', 'bắt đầu', 'dừng'], giá trị được phép # three
help = 'hành động trên từng mục tiêu') tin nhắn # help
trình phân tích cú pháp.add_argument('mục tiêu',
metavar = 'HOSTNAME', tên # var được sử dụng trong thông báo trợ giúp
nargs = '+', # require một hoặc nhiều mục tiêu
help = 'url cho máy mục tiêu') giải thích về tin nhắn # help
tùy chọn Parser.add_argument('-u', '--user', # -u hoặc --user
bắt buộc = Đúng, # make đó là đối số bắt buộc
help = 'đăng nhập với tư cách người dùng')
Ví dụ về cách gọi trình phân tích cú pháp trên chuỗi lệnh:
>>> cmd = 'triển khai sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'triển khai'
>>> kết quả.mục tiêu
['sneezy.example.com', 'sleepy.example.com']
>>> kết quả.user
'thuyền trưởng bầu trời'
Ví dụ về trợ giúp được tạo tự động của trình phân tích cú pháp:
>>> Parser.parse_args('-h'.split())
cách sử dụng: manager_cloud.py [-h] -u USER
{triển khai,bắt đầu,dừng} HOSTNAME [HOSTNAME ...]
Quản lý máy chủ
lập luận vị trí:
hành động {triển khai,bắt đầu,dừng} trên từng mục tiêu
url HOSTNAME cho máy mục tiêu
đối số tùy chọn:
-h, --help hiển thị thông báo trợ giúp này và thoát
-u USER, --user USER đăng nhập với tư cách người dùng
Đã thử nghiệm trên Solaris và Linux
Một tính năng đặc biệt thú vị của argparse là khả năng xác định các phân tích cú pháp con, mỗi phân tích có các mẫu đối số riêng và hiển thị trợ giúp
nhập khẩu argparse
trình phân tích cú pháp = argparse.ArgumentParser(prog='HELM')
subparsers = trình phân tích cú pháp.add_subparsers()
Parser_l = subparsers.add_parser('launch', help='Launch Control') nhóm con # first
Parser_l.add_argument('-m', '--missiles', action='store_true')
Parser_l.add_argument('-t', '--torpedos', action='store_true')
Parser_m = subparsers.add_parser('move', help='Di chuyển tàu', nhóm con # second
bí danh=('lái', 'xoay')) tên # equivalent
Parser_m.add_argument('-c', '--course', type=int, require=True)
Parser_m.add_argument('-s', '--speed', type=int, default=0)
$ ./helm.py --help Trợ giúp về cấp độ # top (khởi chạy và di chuyển)
$ ./helm.py launch --help # help để biết các tùy chọn khởi chạy
$ ./helm.py phóng --tên lửa # set=Đúng và ngư lôi=Sai
$ ./helm.py chỉ đạo --course 180 --speed 5 thông số chuyển động # set
Xem thêm
- PEP 389 - Mô-đun phân tích dòng lệnh mới
PEP được viết bởi Steven Bethard.
Di chuyển mã optparse sang argparse để biết chi tiết về sự khác biệt so với optparse.
PEP 391: Cấu hình dựa trên từ điển để ghi nhật ký¶
Mô-đun logging cung cấp hai loại cấu hình, một kiểu có lệnh gọi hàm cho từng tùy chọn hoặc kiểu khác được điều khiển bởi tệp bên ngoài được lưu ở định dạng configparser. Các tùy chọn đó không cung cấp tính linh hoạt để tạo cấu hình từ các tệp JSON hoặc YAML, cũng như không hỗ trợ cấu hình tăng dần, cần thiết để chỉ định các tùy chọn trình ghi nhật ký từ một dòng lệnh.
Để hỗ trợ phong cách linh hoạt hơn, mô-đun hiện cung cấp logging.config.dictConfig() để chỉ định cấu hình ghi nhật ký bằng từ điển Python đơn giản. Các tùy chọn cấu hình bao gồm trình định dạng, trình xử lý, bộ lọc và trình ghi nhật ký. Đây là một ví dụ hoạt động của từ điển cấu hình:
{"phiên bản": 1,
"formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},
"full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}
},
"trình xử lý": {"console": {
"class": "logging.StreamHandler",
"formatter": "ngắn gọn",
"cấp độ": "INFO",
"stream": "ext://sys.stdout"},
"console_priority": {
"class": "logging.StreamHandler",
"trình định dạng": "đầy đủ",
"cấp độ": "ERROR",
"stream": "ext://sys.stderr"}
},
"root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}
Nếu từ điển đó được lưu trữ trong một tệp có tên conf.json, nó có thể được tải và gọi bằng mã như thế này
>>> nhập json, log.config
>>> với open('conf.json') là f:
... conf = json.load(f)
...
>>> log.config.dictConfig(conf)
>>>logging.info("Giao dịch hoàn tất bình thường")
INFO : root : Giao dịch hoàn tất bình thường
>>>logging.cript("Chấm dứt bất thường")
2011-02-17 11:14:36,694 root CRITICAL Chấm dứt bất thườ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 bởi Vinay Sajip.
PEP 3148: Mô-đun concurrent.futures¶
Mã để tạo và quản lý đồng thời đang được thu thập trong không gian tên cấp cao nhất mới, concurrent. Thành viên đầu tiên của nó là gói futures cung cấp giao diện cấp cao thống nhất để quản lý các luồng và quy trình.
Thiết kế của concurrent.futures được lấy cảm hứng từ gói java.util.concurrent. Trong mô hình đó, một cuộc gọi đang chạy và kết quả của nó được biểu thị bằng một đối tượng Future tóm tắt các tính năng chung cho các luồng, quy trình và lệnh gọi thủ tục từ xa. Đối tượng đó hỗ trợ kiểm tra trạng thái (đang chạy hoặc đã hoàn tất), hết thời gian chờ, hủy, thêm lệnh gọi lại và truy cập vào kết quả hoặc ngoại lệ.
Ưu đãi chính của mô-đun mới là một cặp lớp thực thi để khởi chạy và quản lý cuộc gọi. Mục tiêu của những người thực thi là giúp việc sử dụng các công cụ hiện có để thực hiện các cuộc gọi song song trở nên dễ dàng hơn. Chúng tiết kiệm công sức cần thiết để thiết lập nhóm tài nguyên, khởi chạy cuộc gọi, tạo hàng đợi kết quả, thêm xử lý hết thời gian chờ và giới hạn tổng số luồng, quy trình hoặc lệnh gọi thủ tục từ xa.
Lý tưởng nhất là mỗi ứng dụng nên chia sẻ một bộ thực thi duy nhất trên nhiều thành phần để các giới hạn tiến trình và luồng có thể được quản lý tập trung. Điều này giải quyết thách thức thiết kế phát sinh khi mỗi thành phần có chiến lược cạnh tranh riêng để quản lý tài nguyên.
Cả hai lớp đều có chung một giao diện với ba phương thức: submit() để lên lịch cho một đối tượng có thể gọi và trả về một đối tượng Future; map() để lên lịch nhiều cuộc gọi không đồng bộ cùng một lúc và shutdown() để giải phóng tài nguyên. Lớp này là context manager và có thể được sử dụng trong câu lệnh with để đảm bảo rằng các tài nguyên được tự động giải phóng khi các hợp đồng tương lai hiện đang chờ xử lý được thực thi xong.
Một ví dụ đơn giản về ThreadPoolExecutor là việc khởi chạy bốn luồng song song để sao chép tệp
nhập đồng thời.futures, đóng cửa
với concurrent.futures.ThreadPoolExecutor(max_workers=4) là e:
e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
Xem thêm
- PEP 3148 - Tương lai -- Thực hiện tính toán không đồng bộ
PEP được viết bởi Brian Quinlan.
Code for Threaded Parallel URL reads, một ví dụ sử dụng các luồng để tìm nạp nhiều trang web song song.
Code for computing prime numbers in parallel, một ví dụ minh họa ProcessPoolExecutor.
PEP 3147: Thư mục kho lưu trữ PYC¶
Lược đồ của Python để lưu mã byte vào bộ nhớ đệm trong các tệp .pyc không hoạt động tốt trong môi trường có nhiều trình thông dịch Python. Nếu một trình thông dịch gặp phải một tệp được lưu trong bộ nhớ đệm do một trình thông dịch khác tạo ra, nó sẽ biên dịch lại nguồn và ghi đè lên tệp được lưu trong bộ nhớ đệm, do đó làm mất đi lợi ích của bộ nhớ đệm.
Vấn đề "chiến đấu pyc" đã trở nên rõ ràng hơn khi việc các bản phân phối Linux có nhiều phiên bản Python trở nên phổ biến. Những xung đột này cũng nảy sinh với các lựa chọn thay thế CPython như Unladen Swallow.
Để giải quyết vấn đề này, cơ chế nhập của Python đã được mở rộng để sử dụng tên tệp riêng biệt cho mỗi trình thông dịch. Thay vì Python 3.2 và Python 3.3 và Unladen Swallow mỗi bên cạnh tranh một tệp có tên "mymodule.pyc", giờ đây họ sẽ tìm kiếm "mymodule.cpython-32.pyc", "mymodule.cpython-33.pyc" và "mymodule.unladen10.pyc". Và để ngăn tất cả các tệp mới này làm lộn xộn các thư mục nguồn, các tệp pyc hiện được thu thập trong thư mục "__pycache__" được lưu trữ trong thư mục gói.
Ngoài tên tệp và thư mục đích, lược đồ mới còn có một số khía cạnh mà người lập trình có thể nhìn thấy:
Các mô-đun đã nhập hiện có thuộc tính
__cached__lưu trữ tên của tệp thực tế đã được nhập:>>> import collections >>> collections.__cached__ 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
Thẻ dành riêng cho mỗi trình thông dịch có thể truy cập được từ mô-đun
imp:>>> import imp >>> imp.get_tag() 'cpython-32'
Các tập lệnh cố gắng suy ra tên tệp nguồn từ tệp đã nhập giờ đây cần phải thông minh hơn. Việc chỉ loại bỏ chữ "c" khỏi tên tệp ".pyc" là không đủ. Thay vào đó, hãy sử dụng các chức năng mới trong mô-đun
imp:>>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc') 'c:/py32/lib/collections.py' >>> imp.cache_from_source('c:/py32/lib/collections.py') 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
Các mô-đun
py_compilevàcompileallđã được cập nhật để phản ánh quy ước đặt tên mới và thư mục đích. Lệnh gọi dòng lệnh của compileall có các tùy chọn mới:-iđể chỉ định danh sách các tệp và thư mục cần biên dịch và-bkhiến các tệp mã byte được ghi vào vị trí cũ của chúng thay vì __pycache__.Mô-đun
importlib.abcđã được cập nhật với abstract base classes mới để tải các tệp mã byte. Các ABC lỗi thời,PyLoadervàPyPycLoader, đã không được dùng nữa (hướng dẫn về cách duy trì khả năng tương thích với Python 3.1 được bao gồm trong tài liệu).
Xem thêm
- PEP 3147 - Thư mục kho lưu trữ PYC
PEP được viết bởi Barry Warsaw.
PEP 3149: Phiên bản ABI được gắn thẻ Tệp .so¶
Thư mục kho lưu trữ PYC cho phép đặt nhiều tệp bộ đệm mã byte cùng một lúc. Zz001zz này thực hiện một cơ chế tương tự cho các tệp đối tượng dùng chung bằng cách cung cấp cho chúng một thư mục chung và các tên riêng biệt cho từng phiên bản.
Thư mục chung là "pyshared" và tên tệp được phân biệt bằng cách xác định cách triển khai Python (chẳng hạn như CPython, PyPy, Jython, v.v.), số phiên bản chính và phụ cũng như cờ xây dựng tùy chọn (chẳng hạn như "d" để gỡ lỗi, "m" cho pymalloc, "u" cho unicode rộng). Đối với gói "foo" tùy ý, bạn có thể thấy các tệp này khi gói phân phối được cài đặt:
/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so
Trong Python, các thẻ có thể truy cập được từ các hàm trong mô-đun sysconfig
>>> nhập cấu hình hệ thống
>>> sysconfig.get_config_var('SOABI') # find thẻ phiên bản
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX') # find phần mở rộng tên tệp đầy đủ
'.cpython-32mu.so'
Xem thêm
- PEP 3149 - Phiên bản ABI được gắn thẻ tệp .so
PEP được viết bởi Barry Warsaw.
PEP 3333: Giao diện cổng máy chủ web Python v1.0.1¶
Thông tin PEP này làm rõ cách xử lý các vấn đề về byte/văn bản bằng giao thức WSGI. Thách thức là việc xử lý chuỗi trong Python 3 được xử lý thuận tiện nhất với loại str mặc dù giao thức HTTP tự định hướng theo byte.
PEP phân biệt cái gọi là native strings được sử dụng cho tiêu đề yêu cầu/phản hồi và siêu dữ liệu so với byte strings được sử dụng cho nội dung của yêu cầu và phản hồi.
native strings luôn thuộc loại str nhưng bị giới hạn ở các điểm mã giữa U+0000 đến U+00FF có thể dịch sang byte bằng cách sử dụng mã hóa Latin-1. Các chuỗi này được sử dụng cho các khóa và giá trị trong từ điển môi trường cũng như cho các tiêu đề và trạng thái phản hồi trong hàm start_response(). Họ phải tuân theo RFC 2616 về mặt mã hóa. Nghĩa là, chúng phải là ký tự ISO-8859-1 hoặc sử dụng mã hóa RFC 2047 MIME.
Đối với các nhà phát triển chuyển ứng dụng WSGI từ Python 2, đây là những điểm nổi bật:
Nếu ứng dụng đã sử dụng chuỗi cho tiêu đề trong Python 2 thì không cần thay đổi.
Thay vào đó, nếu ứng dụng đã mã hóa tiêu đề đầu ra hoặc tiêu đề đầu vào đã giải mã thì tiêu đề đó sẽ cần được mã hóa lại thành Latin-1. Ví dụ: tiêu đề đầu ra được mã hóa bằng utf-8 đang sử dụng
h.encode('utf-8')hiện cần chuyển đổi từ byte sang chuỗi gốc bằngh.encode('utf-8').decode('latin-1').Các giá trị do ứng dụng mang lại hoặc được gửi bằng phương thức
write()phải là chuỗi byte. Hàm và môi trườngstart_response()phải sử dụng chuỗi gốc. Cả hai không thể trộn lẫn được.
Đối với những người triển khai máy chủ viết đường dẫn CGI-to-WSGI hoặc các giao thức kiểu CGI khác, người dùng phải có khả năng truy cập vào môi trường bằng chuỗi gốc ngay cả khi nền tảng cơ bản có thể có quy ước khác. Để thu hẹp khoảng cách này, mô-đun wsgiref có một chức năng mới, wsgiref.handlers.read_environ() để chuyển mã các biến CGI từ os.environ thành chuỗi gốc và trả về một từ điển mới.
Xem thêm
- PEP 3333 - Giao diện cổng máy chủ web Python v1.0.1
PEP được viết bởi Phillip Eby.
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à:
Định dạng chuỗi cho
format()vàstr.format()đã có được các khả năng mới cho ký tự định dạng #. Trước đây, đối với các số nguyên ở dạng nhị phân, bát phân hoặc thập lục phân, điều này khiến đầu ra có tiền tố tương ứng là '0b', '0o' hoặc '0x'. Giờ đây, nó cũng có thể xử lý số float, số phức và số thập phân, khiến đầu ra luôn có dấu thập phân ngay cả khi không có chữ số nào theo sau.>>> format(20, '#o') '0o24' >>> format(12.34, '#5.0f') ' 12.'
(Được đề xuất bởi Mark Dickinson và được Eric Smith thực hiện trong bpo-7094.)
Ngoài ra còn có một phương thức
str.format_map()mới giúp mở rộng khả năng của phương thứcstr.format()hiện có bằng cách chấp nhận các đối tượng mapping tùy ý. Phương pháp mới này cho phép sử dụng định dạng chuỗi với bất kỳ đối tượng giống từ điển nào của Python nhưdefaultdict,Shelf,ConfigParserhoặcdbm. Nó cũng hữu ích với các lớp condicttùy chỉnh giúp chuẩn hóa các khóa trước khi tra cứu hoặc cung cấp phương thức__missing__()cho các khóa không xác định:>>> kệ nhập khẩu >>> d = shelve.open('tmp.shl') >>> 'Trạng thái {project_name} là {status} kể từ {date}'.format_map(d) 'Trạng thái dự án thử nghiệm là xanh kể từ ngày 15 tháng 2 năm 2011' >>> lớp LowerCasedDict(dict): ... def __getitem__(self, key): ... trả về dict.__getitem__(self, key.low()) ... >>> lcd = LowerCasedDict(part='widget', số lượng=10) >>> 'Có {QUANTITY} {Part} trong kho'.format_map(lcd) 'Có 10 vật dụng trong kho' >>> lớp PlaceholderDict(dict): ... def __missing__(self, key): ... trả về '<{}>'.format(key) ... >>> 'Xin chào {name}, chào mừng đến với {location}'.format_map(PlaceholderDict()) 'Xin chào <name>, chào mừng đến với <location>'
(Được đề xuất bởi Raymond Hettinger và được Eric Smith thực hiện trong bpo-6081.)
Giờ đây, trình thông dịch có thể được khởi động bằng tùy chọn im lặng,
-q, để ngăn thông tin bản quyền và phiên bản hiển thị ở chế độ tương tác. Tùy chọn này có thể được xem xét nội tâm bằng cách sử dụng thuộc tínhsys.flags:$ trăn -q >>> sys.flags sys.flags(debug=0, Division_warning=0, kiểm tra=0, tương tác=0, tối ưu hóa=0, không_write_bytecode=0, no_user_site=0, no_site=0, bỏ qua_môi trường = 0, dài dòng = 0, byte_warning = 0, yên tĩnh = 1)
(Được đóng góp bởi Marcin Wojdyr trong bpo-1772833).
Hàm
hasattr()hoạt động bằng cách gọigetattr()và phát hiện xem có ngoại lệ nào được đưa ra hay không. Kỹ thuật này cho phép nó phát hiện các phương thức được tạo động bởi__getattr__()hoặc__getattribute__()mà lẽ ra sẽ không có trong từ điển lớp. Trước đây, hasattr sẽ phát hiện bất kỳ ngoại lệ nào, có thể che giấu các lỗi thực sự. Bây giờ, hasattr đã được thắt chặt để chỉ bắtAttributeErrorvà để các ngoại lệ khác đi qua:>>> lớp A: ... @property ... def f(tự): ... trả về 1 // 0 ... >>> a = A() >>> hasattr(a, 'f') Traceback (cuộc gọi gần đây nhất): ... ZeroDivisionError: chia số nguyên hoặc modulo cho 0
(Được phát hiện bởi Yury Selivanov và được sửa bởi Benjamin Peterson; bpo-9666.)
Zz000zz của số thực hoặc số phức hiện giống với
repr()của nó. Trước đây, dạngstr()ngắn hơn nhưng điều đó chỉ gây nhầm lẫn và giờ đây không còn cần thiết nữa vì dạngrepr()ngắn nhất có thể được hiển thị theo mặc định:>>> import math >>> repr(math.pi) '3.141592653589793' >>> str(math.pi) '3.141592653589793'
(Được đề xuất và thực hiện bởi Mark Dickinson; bpo-9337.)
Các đối tượng
memoryviewhiện có phương thứcrelease()và hiện chúng cũng hỗ trợ giao thức quản lý ngữ cảnh. Điều này cho phép giải phóng kịp thời mọi tài nguyên đã có được khi yêu cầu bộ đệm từ đối tượng ban đầu.>>> with memoryview(b'abcdefgh') as v: ... print(v.tolist()) [97, 98, 99, 100, 101, 102, 103, 104]
(Được thêm bởi Antoine Pitrou; bpo-9757.)
Trước đây, việc xóa tên khỏi không gian tên cục bộ là bất hợp pháp nếu nó xuất hiện dưới dạng biến tự do trong khối lồng nhau:
def bên ngoài (x): def bên trong(): trả lại x bên trong() del x
Điều này hiện đã được cho phép. Hãy nhớ rằng mục tiêu của mệnh đề
exceptđã bị xóa, do đó, mã này từng hoạt động với Python 2.6, đã tạo raSyntaxErrorvới Python 3.1 và hiện hoạt động trở lại:chắc chắn f(): chắc chắn print_error(): in (e) thử: cái gì đó ngoại trừ Ngoại lệ là e: print_error() # implicit "del e" đây
(Xem bpo-4617.)
Struct sequence types hiện là lớp con của bộ dữ liệu. Điều này có nghĩa là các cấu trúc C giống như các cấu trúc được trả về bởi
os.stat(),time.gmtime()vàsys.version_infohiện hoạt động giống như named tuple và hiện hoạt động với các hàm và phương thức yêu cầu một bộ dữ liệu làm đối số. Đây là một bước tiến lớn trong việc làm cho các cấu trúc C linh hoạt như các cấu trúc Python thuần túy của chúng:>>> import sys >>> isinstance(sys.version_info, tuple) True >>> 'Version %d.%d.%d %s(%d)' % sys.version_info 'Version 3.2.0 final(0)'
(Được đề xuất bởi Arfrever Frehtes Taifersar Arahesis và được thực hiện bởi Benjamin Peterson trong bpo-8413.)
Giờ đây, việc kiểm soát các cảnh báo trở nên dễ dàng hơn bằng cách sử dụng biến môi trường
PYTHONWARNINGSthay thế cho việc sử dụng-Wở dòng lệnh:$ import PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'
(Được đề xuất bởi Barry Warsaw và được Philip Jenvey thực hiện trong bpo-7301.)
Một danh mục cảnh báo mới,
ResourceWarning, đã được thêm vào. Nó được phát ra khi phát hiện các vấn đề tiềm ẩn về tiêu thụ tài nguyên hoặc dọn dẹp. Theo mặc định, nó bị tắt tiếng trong các bản phát hành thông thường nhưng có thể được bật thông qua các phương tiện được cung cấp bởi mô-đunwarningshoặc trên dòng lệnh.Một
ResourceWarningđược phát ra khi tắt trình thông dịch nếu danh sáchgc.garbagekhông trống và nếugc.DEBUG_UNCOLLECTABLEđược đặt, tất cả các đối tượng không thể thu thập được sẽ được in. Điều này nhằm mục đích làm cho lập trình viên biết rằng mã của họ có chứa các vấn đề về hoàn thiện đối tượng.Một
ResourceWarningcũng được cấp khi một file object bị phá hủy mà không bị đóng một cách rõ ràng. Mặc dù bộ giải phóng cho đối tượng đó đảm bảo nó đóng tài nguyên hệ điều hành cơ bản (thường là bộ mô tả tệp), nhưng sự chậm trễ trong việc giải phóng đối tượng có thể gây ra nhiều vấn đề khác nhau, đặc biệt là trong Windows. Dưới đây là ví dụ về cách bật cảnh báo từ dòng lệnh:$ python -q -Wmặc định >>> f = open("foo", "wb") >>> del f __main__:1: ResourceWarning: tệp không được tiết lộ <_io.BufferedWriter name='foo'>
(Được thêm bởi Antoine Pitrou và Georg Brandl trong bpo-10093 và bpo-477863.)
Các đối tượng
rangehiện hỗ trợ các phương thức index và count. Đây là một phần trong nỗ lực giúp nhiều đối tượng hơn triển khai đầy đủcollections.Sequenceabstract base class. Kết quả là ngôn ngữ sẽ có API đồng đều hơn. Ngoài ra, các đối tượngrangehiện hỗ trợ cắt lát và chỉ số âm, ngay cả với các giá trị lớn hơnsys.maxsize. Điều này làm cho range tương tác tốt hơn với các danh sách:>>> phạm vi(0, 100, 2).count(10) 1 >>> phạm vi(0, 100, 2).index(10) 5 >>> phạm vi (0, 100, 2)[5] 10 >>> phạm vi(0, 100, 2)[0:5] phạm vi (0, 10, 2)
(Được đóng góp bởi Daniel Stutzbach trong bpo-9213, bởi Alexander Belopolsky trong bpo-2690 và bởi Nick Coghlan trong bpo-10889.)
Hàm dựng sẵn
callable()từ Py2.x đã được phục hồi. Nó cung cấp một giải pháp thay thế ngắn gọn, dễ đọc cho việc sử dụng abstract base class trong một biểu thức nhưisinstance(x, collections.Callable):>>> callable(max) True >>> callable(20) False
(Xem bpo-10518.)
Cơ chế nhập của Python hiện có thể tải các mô-đun được cài đặt trong các thư mục có ký tự không phải ASCII trong tên đường dẫn. Điều này đã giải quyết được một vấn đề nghiêm trọng hơn với các thư mục chính dành cho người dùng có các ký tự không phải ASCII trong tên người dùng của họ.
(Cần có tác phẩm mở rộng của Victor Stinner trong bpo-9425.)
Các mô-đun mới, cải tiến và không được dùng nữa¶
Thư viện chuẩn của Python đã trải qua những nỗ lực bảo trì và cải tiến chất lượng đáng kể.
Tin tức lớn nhất đối với Python 3.2 là gói email, mô-đun mailbox và mô-đun nntplib hiện hoạt động chính xác với mô hình byte/văn bản trong Python 3. Lần đầu tiên, có cách xử lý chính xác các thông báo có mã hóa hỗn hợp.
Trong toàn bộ thư viện tiêu chuẩn, đã có sự chú ý cẩn thận hơn đến các vấn đề về mã hóa và văn bản so với byte. Đặc biệt, các tương tác với hệ điều hành giờ đây có thể trao đổi dữ liệu không phải ASCII tốt hơn bằng cách sử dụng mã hóa MBCS của Windows, mã hóa nhận biết miền địa phương hoặc UTF-8.
Một chiến thắng quan trọng khác là việc bổ sung hỗ trợ tốt hơn đáng kể cho các kết nối SSL và chứng chỉ bảo mật.
Ngoài ra, hiện nay có nhiều lớp triển khai context manager hơn để hỗ trợ việc dọn dẹp tài nguyên thuận tiện và đáng tin cậy bằng cách sử dụng câu lệnh with.
email¶
Khả năng sử dụng của gói email trong Python 3 hầu như đã được khắc phục nhờ những nỗ lực sâu rộng của R. David Murray. Vấn đề là các email thường được đọc và lưu trữ dưới dạng văn bản bytes thay vì str và chúng có thể chứa nhiều mã hóa trong một email. Vì vậy, gói email phải được mở rộng để phân tích cú pháp và tạo thư email ở định dạng byte.
Các hàm mới
message_from_bytes()vàmessage_from_binary_file()cũng như các lớp mớiBytesFeedParservàBytesParsercho phép phân tích dữ liệu thông báo nhị phân thành các đối tượng mô hình.Khi cung cấp byte đầu vào cho mô hình,
get_payload()theo mặc định sẽ giải mã nội dung thư có Content-Transfer-Encoding là 8bit bằng cách sử dụng bộ ký tự được chỉ định trong tiêu đề MIME và trả về chuỗi kết quả.Đưa byte đầu vào vào mô hình,
Generatorsẽ chuyển đổi nội dung thông báo có Content-Transfer-Encoding của 8bit thành 7bit Content-Transfer-Encoding.Các tiêu đề có byte không phải ASCII chưa được mã hóa được coi là RFC 2047- được mã hóa bằng bộ ký tự unknown-8bit.
Lớp
BytesGeneratormới tạo ra byte làm đầu ra, bảo toàn mọi dữ liệu không phải ASCII không thay đổi có trong đầu vào được sử dụng để xây dựng mô hình, bao gồm nội dung thông báo có Content-Transfer-Encoding là 8bit.Lớp
smtplibSMTPhiện chấp nhận một chuỗi byte cho đối số msg cho phương thứcsendmail()và một phương thức mới,send_message()chấp nhận một đối tượngMessagevà có thể tùy ý lấy địa chỉ from_addr và to_addrs trực tiếp từ đối tượng.
(Được đề xuất và thực hiện bởi R. David Murray, bpo-4661 và bpo-10321.)
cây phần tử¶
Gói xml.etree.ElementTree và phiên bản xml.etree.cElementTree của nó đã được cập nhật lên phiên bản 1.3.
Một số chức năng và phương thức mới và hữu ích đã được thêm vào:
xml.etree.ElementTree.fromstringlist()xây dựng tài liệu XML từ một chuỗi các đoạnxml.etree.ElementTree.register_namespace()để đăng ký tiền tố không gian tên chungxml.etree.ElementTree.tostringlist()để biểu diễn chuỗi bao gồm tất cả các danh sách conxml.etree.ElementTree.Element.extend()để nối thêm một chuỗi gồm 0 hoặc nhiều phần tửxml.etree.ElementTree.Element.iterfind()tìm kiếm một phần tử và các phần tử conxml.etree.ElementTree.Element.itertext()tạo trình lặp văn bản trên một phần tử và các phần tử con của nóxml.etree.ElementTree.TreeBuilder.end()đóng phần tử hiện tạixml.etree.ElementTree.TreeBuilder.doctype()xử lý khai báo loại tài liệu
Hai phương pháp đã không còn được dùng nữa:
xml.etree.ElementTree.getchildren()hãy sử dụnglist(elem)thay thế.xml.etree.ElementTree.getiterator()hãy sử dụngElement.iterthay thế.
Để biết chi tiết về bản cập nhật, hãy xem Introducing ElementTree trên trang web của Fredrik Lundh.
(Được đóng góp bởi Florent Xicluna và Fredrik Lundh, bpo-6472.)
công cụ chức năng¶
Mô-đun
functoolsbao gồm một trình trang trí mới cho các lệnh gọi chức năng bộ nhớ đệm.functools.lru_cache()có thể lưu các truy vấn lặp lại vào tài nguyên bên ngoài bất cứ khi nào kết quả được mong đợi là giống nhau.Ví dụ: việc thêm trình trang trí bộ nhớ đệm vào hàm truy vấn cơ sở dữ liệu có thể lưu các quyền truy cập cơ sở dữ liệu cho các tìm kiếm phổ biến:
>>> import functools >>> @functools.lru_cache(maxsize=300) ... def get_phone_number(name): ... c = conn.cursor() ... c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,)) ... return c.fetchone()[0]
>>> for name in user_requests: ... get_phone_number(name) # cached lookup
Để giúp chọn kích thước bộ đệm hiệu quả, chức năng được bao bọc được sử dụng để theo dõi số liệu thống kê bộ đệm:
>>> get_phone_number.cache_info() CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)
Nếu bảng danh sách điện thoại được cập nhật, nội dung lỗi thời của bộ đệm có thể bị xóa bằng:
>>> get_phone_number.cache_clear()
(Được đóng góp bởi Raymond Hettinger và kết hợp các ý tưởng thiết kế từ Jim Baker, Miki Tebeka và Nick Coghlan; xem recipe 498245, recipe 577479, bpo-10586 và bpo-10593.)
Trình trang trí
functools.wraps()hiện thêm thuộc tính__wrapped__trỏ đến hàm có thể gọi ban đầu. Điều này cho phép các hàm được bao bọc được xem xét nội tâm. Nó cũng sao chép__annotations__nếu được xác định. Và bây giờ, nó cũng bỏ qua một cách duyên dáng các thuộc tính bị thiếu, chẳng hạn như__doc__có thể không được xác định cho lệnh gọi được bao bọc.Trong ví dụ trên, bộ đệm có thể được xóa bằng cách khôi phục chức năng ban đầu:
>>> get_phone_number = get_phone_number.__wrapped__ # uncached function
(Bởi Nick Coghlan và Terrence Cole; bpo-9567, bpo-3445 và bpo-8814.)
Để giúp viết các lớp với các phương thức so sánh phong phú, trình trang trí mới
functools.total_ordering()sẽ sử dụng các phương thức đẳng thức và bất đẳng thức hiện có để điền vào các phương thức còn lại.Ví dụ: việc cung cấp __eq__ và __lt__ sẽ cho phép
total_ordering()điền vào __le__, __gt__ và __ge__:@total_ordering học sinh lớp: def __eq__(bản thân, người khác): trả về ((self.lastname.low(), self.firstname.low()) == (other.lastname.low(), other.firstname.low())) def __lt__(bản thân, người khác): trả về ((self.lastname.low(), self.firstname.low()) < (other.lastname.low(), other.firstname.low()))
Với trình trang trí total_ordering, các phương pháp so sánh còn lại sẽ được điền tự động.
(Được đóng góp bởi Raymond Hettinger.)
Để hỗ trợ chuyển các chương trình từ Python 2, hàm
functools.cmp_to_key()chuyển đổi hàm so sánh kiểu cũ sang key function hiện đại:>>> # locale-aware sort order >>> sorted(iterable, key=cmp_to_key(locale.strcoll))
Để biết các ví dụ sắp xếp và hướng dẫn sắp xếp ngắn gọn, hãy xem hướng dẫn Sorting HowTo.
(Được đóng góp bởi Raymond Hettinger.)
itertools¶
Mô-đun
itertoolscó chức năngaccumulate()mới được mô phỏng theo toán tử scan của APL và chức năng accumulate của Numpy:>>> from itertools import accumulate >>> list(accumulate([8, 2, 50])) [8, 10, 60]
>>> prob_dist = [0.1, 0.4, 0.2, 0.3] >>> list(accumulate(prob_dist)) # cumulative probability distribution [0.1, 0.5, 0.7, 1.0]
Để biết ví dụ sử dụng
accumulate(), hãy xem examples for the random module.(Được đóng góp bởi Raymond Hettinger và kết hợp các đề xuất thiết kế từ Mark Dickinson.)
bộ sưu tập¶
Lớp
collections.Counterhiện có hai dạng phép trừ tại chỗ, toán tử -= hiện có cho saturating subtraction và phương thứcsubtract()mới cho phép trừ thông thường. Cái trước phù hợp với multisets chỉ có số đếm dương và cái sau phù hợp hơn với các trường hợp sử dụng cho phép đếm âm:>>> from collections import Counter >>> tally = Counter(dogs=5, cats=3) >>> tally -= Counter(dogs=2, cats=8) # saturating subtraction >>> tally Counter({'dogs': 3})
>>> tally = Counter(dogs=5, cats=3) >>> tally.subtract(dogs=2, cats=8) # regular subtraction >>> tally Counter({'dogs': 3, 'cats': -5})
(Được đóng góp bởi Raymond Hettinger.)
Lớp
collections.OrderedDictcó một phương thức mớimove_to_end()lấy một khóa hiện có và di chuyển nó đến vị trí đầu tiên hoặc cuối cùng trong chuỗi được sắp xếp.Mặc định là di chuyển một mục đến vị trí cuối cùng. Điều này tương đương với việc gia hạn một mục nhập bằng
od[k] = od.pop(k).Thao tác chuyển từ đầu đến cuối nhanh rất hữu ích cho việc sắp xếp lại các mục nhập. Ví dụ: một từ điển có thứ tự có thể được sử dụng để theo dõi thứ tự truy cập theo các mục cũ từ mục cũ nhất đến mục được truy cập gần đây nhất.
>>> from collections import OrderedDict >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e']) >>> list(d) ['a', 'b', 'X', 'd', 'e'] >>> d.move_to_end('X') >>> list(d) ['a', 'b', 'd', 'e', 'X']
(Được đóng góp bởi Raymond Hettinger.)
Lớp
collections.dequeđã phát triển hai phương thức mớicount()vàreverse()khiến chúng có thể thay thế được nhiều hơn cho các đối tượnglist:>>> from collections import deque >>> d = deque('simsalabim') >>> d.count('s') 2 >>> d.reverse() >>> d deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])
(Được đóng góp bởi Raymond Hettinger.)
luồng¶
Mô-đun threading có lớp đồng bộ hóa Barrier mới để tạo nhiều luồng chờ cho đến khi tất cả chúng đạt đến điểm rào cản chung. Rào cản rất hữu ích để đảm bảo rằng một nhiệm vụ có nhiều điều kiện tiên quyết không chạy cho đến khi tất cả các nhiệm vụ trước đó hoàn tất.
Rào cản có thể hoạt động với số lượng chủ đề tùy ý. Đây là sự khái quát hóa của Rendezvous chỉ được xác định cho hai luồng.
Được triển khai như một rào cản tuần hoàn hai pha, các đối tượng Barrier phù hợp để sử dụng trong các vòng lặp. Các giai đoạn filling và draining riêng biệt đảm bảo rằng tất cả các luồng được giải phóng (thoát) trước khi bất kỳ luồng nào trong số chúng có thể lặp lại và vào lại hàng rào. Rào chắn được đặt lại hoàn toàn sau mỗi chu kỳ.
Ví dụ về việc sử dụng các rào cản:
từ nhập luồng Rào cản, luồng
chắc chắn get_votes(trang web):
phiếu bầu = tiến hành_bầu cử(địa điểm)
all_polls_closed.wait() # do không được tính cho đến khi tất cả các cuộc thăm dò được đóng lại
tổng cộng = tóm tắt(phiếu bầu)
xuất bản(trang web, tổng số)
all_polls_closed = Rào cản(len(site))
cho trang web trong các trang web:
Thread(target=get_votes, args=(site,)).start()
Trong ví dụ này, rào cản thực thi quy tắc không thể đếm phiếu bầu tại bất kỳ địa điểm bỏ phiếu nào cho đến khi tất cả các cuộc bỏ phiếu đóng cửa. Lưu ý rằng giải pháp có rào cản tương tự như giải pháp có threading.Thread.join(), nhưng các chuỗi vẫn tồn tại và tiếp tục hoạt động (tóm tắt các lá phiếu) sau khi vượt qua điểm rào cản.
Nếu bất kỳ tác vụ nào trước đó có thể bị treo hoặc bị trì hoãn, thì có thể tạo rào cản bằng tham số timeout tùy chọn. Sau đó, nếu khoảng thời gian chờ trôi qua trước khi tất cả các tác vụ trước đó đạt đến điểm rào cản, thì tất cả các luồng đang chờ sẽ được giải phóng và một ngoại lệ BrokenBarrierError sẽ xuất hiện:
chắc chắn get_votes(trang web):
phiếu bầu = tiến hành_bầu cử(địa điểm)
thử:
all_polls_closed.wait(timeout=nửa đêm - time.now())
ngoại trừ BrokenBarrierError:
lockbox = seal_ballots(phiếu bầu)
queue.put(lockbox)
khác:
tổng cộng = tóm tắt(phiếu bầu)
xuất bản(trang web, tổng số)
Trong ví dụ này, rào cản thực thi một quy tắc mạnh mẽ hơn. Nếu một số địa điểm bầu cử không kết thúc trước nửa đêm, rào chắn sẽ hết thời gian chờ và các lá phiếu sẽ được niêm phong và xếp thành hàng đợi để xử lý sau.
Xem Barrier Synchronization Patterns để biết thêm ví dụ về cách sử dụng các rào cản trong điện toán song song. Ngoài ra còn có phần giải thích đơn giản nhưng kỹ lưỡng về các rào cản trong The Little Book of Semaphores, section 3.6.
(Được đóng góp bởi Kristján Valur Jónsson với bài đánh giá API của Jeffrey Yasskin trên bpo-8777.)
ngày giờ và thời gian¶
Mô-đun
datetimecó loạitimezonemới triển khai giao diệntzinfobằng cách trả về tên múi giờ và độ lệch UTC cố định. Điều này giúp việc tạo các đối tượng datetime nhận biết múi giờ dễ dàng hơn>>> nhập ngày giờ dưới dạng dt >>> dt.datetime.now(dt.timezone.utc) datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc) >>> dt.datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z") datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
Ngoài ra, các đối tượng
timedeltahiện có thể được nhân vớifloatvà chia cho các đối tượngfloatvàint. Và các đối tượngtimedeltagiờ đây có thể phân chia lẫn nhau.Phương pháp
datetime.date.strftime()không còn bị giới hạn trong các năm sau năm 1900. Phạm vi năm mới được hỗ trợ là từ 1000 đến 9999.Bất cứ khi nào năm có hai chữ số được sử dụng trong bộ dữ liệu thời gian, việc diễn giải sẽ bị chi phối bởi
time.accept2dyear. Giá trị mặc định làTrue, có nghĩa là đối với năm có hai chữ số, thế kỷ được đoán theo quy tắc POSIX chi phối định dạng thời gian%y.Bắt đầu với Py3.2, việc sử dụng phương pháp phỏng đoán thế kỷ sẽ phát ra
DeprecationWarning. Thay vào đó, bạn nên đặttime.accept2dyearthànhFalseđể có thể sử dụng phạm vi ngày lớn mà không cần phỏng đoán:>>> thời gian nhập, cảnh báo >>> Warning.resetwarnings() # remove bộ lọc cảnh báo mặc định >>> time.accept2dyear = Đúng # guess dù 11 có nghĩa là 11 hay 2011 >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0)) Cảnh báo (từ mô-đun cảnh báo): ... Khấu haoCảnh báo: Thông tin thế kỷ được đoán cho năm có 2 chữ số. 'Thứ Sáu ngày 1 tháng 1 12:34:56 2011' >>> time.accept2dyear = Sai # use toàn bộ phạm vi ngày cho phép >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0)) 'Thứ sáu ngày 1 tháng 1 12:34:56 11'
Một số hàm hiện có phạm vi ngày được mở rộng đáng kể. Khi
time.accept2dyearsai, hàmtime.asctime()sẽ chấp nhận bất kỳ năm nào phù hợp với C int, trong khi các hàmtime.mktime()vàtime.strftime()sẽ chấp nhận toàn bộ phạm vi được hỗ trợ bởi các hàm hệ điều hành tương ứng.
(Được đóng góp bởi Alexander Belopolsky và Victor Stinner trong bpo-1289118, bpo-5094, bpo-6641, bpo-2706, bpo-1777412, bpo-8013 và bpo-10827.)
môn toán¶
Mô-đun math đã được cập nhật sáu chức năng mới lấy cảm hứng từ tiêu chuẩn C99.
Hàm isfinite() cung cấp một cách nhanh chóng và đáng tin cậy để phát hiện các giá trị đặc biệt. Nó trả về True cho các số thông thường và False cho Nan hoặc Infinity:
>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]
Hàm expm1() tính toán e**x-1 cho các giá trị nhỏ của x mà không làm mất đi độ chính xác thường đi kèm với phép trừ các số lượng gần bằng nhau:
>>> from math import expm1
>>> expm1(0.013671875) # more accurate way to compute e**x-1 for a small x
0.013765762467652909
Hàm erf() tính tích phân xác suất hoặc Gaussian error function. Hàm lỗi bổ sung, erfc(), là 1 - erf(x):
>>> từ nhập toán erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0)) # portion của phân phối chuẩn trong phạm vi 1 độ lệch chuẩn
0.682689492137086
>>> erfc(1.0/sqrt(2.0)) # portion của phân phối chuẩn ngoài 1 độ lệch chuẩn
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0
Hàm gamma() là phần mở rộng liên tục của hàm giai thừa. Xem https://en.wikipedia.org/wiki/Gamma_function để biết chi tiết. Bởi vì hàm liên quan đến giai thừa nên nó tăng lớn ngay cả đối với các giá trị nhỏ của x, do đó cũng có hàm lgamma() để tính logarit tự nhiên của hàm gamma:
>>> from math import gamma, lgamma
>>> gamma(7.0) # six factorial
720.0
>>> lgamma(801.0) # log(800 factorial)
4551.950730698041
(Được đóng góp bởi Mark Dickinson.)
abc¶
Mô-đun abc hiện hỗ trợ abstractclassmethod() và abstractstaticmethod().
Những công cụ này giúp xác định một abstract base class yêu cầu triển khai một classmethod() hoặc staticmethod() cụ thể:
Nhiệt độ lớp (metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def from_fahrenheit(cls, t):
...
@abc.abstractclassmethod
def from_celsius(cls, t):
...
(Bản vá do Daniel Urban gửi; bpo-5867.)
io¶
io.BytesIO có một phương thức mới, getbuffer(), cung cấp chức năng tương tự như memoryview(). Nó tạo ra một chế độ xem có thể chỉnh sửa dữ liệu mà không cần tạo bản sao. Khả năng truy cập ngẫu nhiên của bộ đệm và hỗ trợ ký hiệu lát cắt rất phù hợp để chỉnh sửa tại chỗ
>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11
>>> def thay đổi_location(bộ đệm, số bản ghi, vị trí):
... bắt đầu = số_bản ghi * REC_LEN + LOC_START
... bộ đệm[bắt đầu: start+LOC_LEN] = vị trí
>>> nhập io
>>> byte_stream = io.BytesIO(
... b'G3805 kho chứa Khung gầm chính '
... b'X7899 vận chuyển Bánh răng dự trữ '
... b'L6988 nhận bánh xích sơ cấp'
... )
>>> bộ đệm = byte_stream.getbuffer()
>>> Change_location(buffer, 1, b'warehouse ')
>>> thay đổi_location(bộ đệm, 0, b'showroom ')
>>> in(byte_stream.getvalue())
b'G3805 showroom Khung gầm chính '
kho b'X7899 Bánh răng dự trữ '
b'L6988 nhận bánh xích sơ cấp'
(Được đóng góp bởi Antoine Pitrou trong bpo-5506.)
viết lại¶
Khi viết phương thức __repr__() cho vùng chứa tùy chỉnh, bạn rất dễ quên xử lý trường hợp thành viên tham chiếu trở lại chính vùng chứa đó. Các đối tượng dựng sẵn của Python như list và set xử lý việc tự tham chiếu bằng cách hiển thị "..." trong phần đệ quy của chuỗi biểu diễn.
Để giúp viết các phương thức __repr__() như vậy, mô-đun reprlib có một trình trang trí mới, recursive_repr(), để phát hiện các lệnh gọi đệ quy tới __repr__() và thay thế một chuỗi giữ chỗ:
>>> lớp MyList(danh sách):
... @recursive_repr()
... def __repr__(self):
... return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> in(m)
<'a'|'b'|'c'|...|'x'>
(Được đóng góp bởi Raymond Hettinger trong bpo-9826 và bpo-9840.)
khai thác gỗ¶
Ngoài cấu hình dựa trên từ điển được mô tả ở trên, gói logging còn có nhiều cải tiến khác.
Tài liệu ghi nhật ký đã được tăng cường bởi basic tutorial, advanced tutorialvà cookbook các công thức ghi nhật ký. Những tài liệu này là cách nhanh nhất để tìm hiểu về ghi nhật ký.
Hàm thiết lập logging.basicConfig() đã nhận được đối số style để hỗ trợ ba loại định dạng chuỗi khác nhau. Nó mặc định là "%" cho định dạng % truyền thống, có thể được đặt thành "{" cho kiểu str.format() mới hoặc có thể được đặt thành "$" cho định dạng kiểu shell do string.Template cung cấp. Ba cấu hình sau đây là tương đương:
>>> từ ghi nhật ký nhập basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='{', format="{name} -> {levelname} {message}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")
Nếu không có cấu hình nào được thiết lập trước khi sự kiện ghi nhật ký xảy ra thì hiện đã có cấu hình mặc định sử dụng StreamHandler được chuyển hướng tới sys.stderr cho các sự kiện ở cấp độ WARNING trở lên. Trước đây, một sự kiện xảy ra trước khi thiết lập cấu hình sẽ đưa ra một ngoại lệ hoặc âm thầm loại bỏ sự kiện đó tùy thuộc vào giá trị của logging.raiseExceptions. Trình xử lý mặc định mới được lưu trữ trong logging.lastResort.
Việc sử dụng các bộ lọc đã được đơn giản hóa. Thay vì tạo đối tượng Filter, vị từ có thể là bất kỳ lệnh gọi Python nào trả về True hoặc False.
Có một số cải tiến khác giúp tăng thêm tính linh hoạt và đơn giản hóa cấu hình. Xem tài liệu mô-đun để biết danh sách đầy đủ các thay đổi trong Python 3.2.
csv¶
Mô-đun csv hiện hỗ trợ một phương ngữ mới, unix_dialect, áp dụng trích dẫn cho tất cả các trường và kiểu Unix truyền thống với '\n' làm dấu kết thúc dòng. Tên phương ngữ đã đăng ký là unix.
csv.DictWriter có một phương thức mới, writeheader() để viết ra hàng đầu tiên để ghi lại tên trường
>>> nhập csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], address='unix')
>>> w.writeheader()
"tên","phòng"
>>> w.writerows([
... {'name': 'tom', 'dept': 'accounting'},
... {'name': 'susan', 'dept': 'Salesl'}])
"tom","kế toán"
"susan","bán hàng"
(Phương ngữ mới do Jay Talbot đề xuất trong bpo-5975 và phương pháp mới do Ed Abraham đề xuất trong bpo-1537721.)
bối cảnh¶
Có một công cụ mới và hơi thú vị ContextDecorator rất hữu ích để tạo ra một context manager có nhiệm vụ kép như một công cụ trang trí chức năng.
Để thuận tiện, chức năng mới này được contextmanager() sử dụng để không cần nỗ lực thêm để hỗ trợ cả hai vai trò.
Ý tưởng cơ bản là cả trình quản lý bối cảnh và trình trang trí hàm đều có thể được sử dụng cho các trình bao bọc trước và sau hành động. Trình quản lý bối cảnh bao bọc một nhóm câu lệnh bằng cách sử dụng câu lệnh with và trình trang trí hàm bao bọc một nhóm câu lệnh được đặt trong một hàm. Vì vậy, đôi khi cần phải viết một trình bao bọc tiền hành động hoặc hậu hành động để có thể sử dụng ở một trong hai vai trò.
Ví dụ: đôi khi rất hữu ích khi bọc các hàm hoặc nhóm câu lệnh bằng một trình ghi nhật ký có thể theo dõi thời gian vào và thời gian thoát. Thay vì viết cả trình trang trí hàm và trình quản lý bối cảnh cho tác vụ, contextmanager() cung cấp cả hai khả năng trong một định nghĩa duy nhất:
từ trình quản lý bối cảnh nhập khẩu contextlib
nhập nhật ký
logging.basicConfig(level=logging.INFO)
@contextmanager
def track_entry_and_exit(tên):
logging.info('Đang nhập: %s', name)
năng suất
logging.info('Đang thoát: %s', name)
Trước đây, điều này chỉ có thể sử dụng được với tư cách là trình quản lý bối cảnh
với track_entry_and_exit('trình tải widget'):
print('Một số hoạt động tiêu tốn thời gian sẽ diễn ra ở đây')
tải_widget()
Bây giờ, nó cũng có thể được sử dụng như một vật trang trí
@track_entry_and_exit('trình tải widget')
hoạt động chắc chắn():
print('Một số hoạt động tiêu tốn thời gian sẽ diễn ra ở đây')
tải_widget()
Việc cố gắng hoàn thành hai vai trò cùng một lúc đặt ra một số hạn chế đối với kỹ thuật này. Trình quản lý bối cảnh thường có khả năng linh hoạt trả về một đối số có thể sử dụng được bằng câu lệnh with, nhưng không có sự tương đương nào đối với trình trang trí hàm.
Trong ví dụ trên, không có cách nào rõ ràng để trình quản lý bối cảnh track_entry_and_exit trả về một phiên bản ghi nhật ký để sử dụng trong nội dung của các câu lệnh kèm theo.
(Được đóng góp bởi Michael Foodd trong bpo-9110.)
số thập phân và phân số¶
Mark Dickinson đã tạo ra một sơ đồ tinh tế và hiệu quả để đảm bảo rằng các kiểu dữ liệu số khác nhau sẽ có cùng giá trị băm bất cứ khi nào giá trị thực của chúng bằng nhau (bpo-8188):
khẳng định hàm băm(Phân số(3, 2)) == hàm băm(1.5) == \
hàm băm(Thập phân("1.5")) == hàm băm(phức tạp(1.5, 0))
Một số chi tiết băm được hiển thị thông qua thuộc tính mới, sys.hash_info, mô tả độ rộng bit của giá trị băm, mô đun nguyên tố, giá trị băm cho infinity và nan cũng như hệ số nhân được sử dụng cho phần ảo của một số:
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)
Một quyết định ban đầu nhằm hạn chế khả năng tương tác của các loại số khác nhau đã được nới lỏng. Việc trộn lẫn ngầm trong các biểu thức số học như Decimal('1.1') + float('1.1') vẫn không được hỗ trợ (và không được khuyến khích) vì biểu thức sau sẽ mất thông tin trong quá trình xây dựng số float nhị phân. Tuy nhiên, vì giá trị dấu phẩy động hiện tại có thể được chuyển đổi dễ dàng thành biểu diễn thập phân hoặc hữu tỉ, nên việc thêm chúng vào hàm tạo và hỗ trợ so sánh kiểu hỗn hợp là điều hợp lý.
Hàm tạo
decimal.Decimalhiện chấp nhận trực tiếp các đối tượngfloatnên không cần sử dụng phương thứcfrom_float()(bpo-8257).So sánh loại hỗn hợp hiện được hỗ trợ đầy đủ để các đối tượng
Decimalcó thể được so sánh trực tiếp vớifloatvàfractions.Fraction(bpo-2531 và bpo-8188).
Những thay đổi tương tự đã được thực hiện đối với fractions.Fraction để các phương thức from_float() và from_decimal() không còn cần thiết nữa (bpo-8294):
>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
Một thay đổi hữu ích khác cho mô-đun decimal là thuộc tính Context.clamp hiện được công khai. Điều này hữu ích trong việc tạo các ngữ cảnh tương ứng với các định dạng trao đổi thập phân được chỉ định trong IEEE 754 (xem bpo-8540).
(Được đóng góp bởi Mark Dickinson và Raymond Hettinger.)
ftp¶
Lớp ftplib.FTP hiện hỗ trợ giao thức quản lý ngữ cảnh để sử dụng các ngoại lệ socket.error một cách vô điều kiện và đóng kết nối FTP khi hoàn tất:
>>> từ ftplib nhập FTP
>>> với FTP("ftp1.at.proftpd.org") là ftp:
ftp.login()
ftp.dir()
'230 Đăng nhập ẩn danh được, áp dụng hạn chế.'
dr-xr-xr-x 9 ftp ftp 154 Ngày 6 tháng 5 10:43 .
dr-xr-xr-x 9 ftp ftp 154 Ngày 6 tháng 5 10:43 ..
dr-xr-xr-x 5 ftp ftp 4096 Ngày 6 tháng 5 10:43 CentOS
dr-xr-xr-x 3 ftp ftp 18 tháng 7 10 2008 Fedora
Các đối tượng giống tệp khác như mmap.mmap và fileinput.input() cũng phát triển trình quản lý bối cảnh tự động đóng:
với fileinput.input(files=('log1.txt', 'log2.txt')) là f:
cho dòng trong f:
quá trình (dòng)
(Được đóng góp bởi Tarek Ziadé và Giampaolo Rodolà trong bpo-4972 và bởi Georg Brandl trong bpo-8046 và bpo-1286.)
Lớp FTP_TLS hiện chấp nhận tham số context, là một đối tượng ssl.SSLContext cho phép gộp các tùy chọn cấu hình, chứng chỉ và khóa riêng của SSL vào một cấu trúc duy nhất (có khả năng tồn tại lâu dài).
(Được đóng góp bởi Giampaolo Rodolà; bpo-8806.)
bật lên¶
Các hàm os.popen() và subprocess.Popen() hiện hỗ trợ các câu lệnh with để tự động đóng các bộ mô tả tệp.
(Được đóng góp bởi Antoine Pitrou và Brian Curtin trong bpo-7461 và bpo-10554.)
chọn¶
Mô-đun select hiện hiển thị một thuộc tính mới, không đổi, PIPE_BUF, cung cấp số byte tối thiểu được đảm bảo không chặn khi select.select() cho biết một đường dẫn đã sẵn sàng để ghi.
>>> import select
>>> select.PIPE_BUF
512
(Có sẵn trên hệ thống Unix. Bản vá của Sébastien Sablé trong bpo-9862)
gzip và tập tin zip¶
gzip.GzipFile hiện triển khai io.BufferedIOBase abstract base class (ngoại trừ truncate()). Nó cũng có một phương thức peek() và hỗ trợ các đối tượng tệp không thể tìm kiếm cũng như không có phần đệm.
Mô-đun gzip cũng có các chức năng compress() và decompress() để nén và giải nén trong bộ nhớ dễ dàng hơn. Hãy nhớ rằng văn bản cần được mã hóa thành bytes trước khi nén và giải nén:
>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode() # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42] # decompress and convert to text
'Three shall be the number thou shalt count'
(Được đóng góp bởi Anand B. Pillai trong bpo-3488; và bởi Antoine Pitrou, Nir Aides và Brian Curtin trong bpo-9962, bpo-1675951, bpo-7471 và bpo-2846.)
Ngoài ra, lớp zipfile.ZipExtFile đã được làm lại nội bộ để thể hiện các tệp được lưu trữ bên trong kho lưu trữ. Việc triển khai mới nhanh hơn đáng kể và có thể được gói trong đối tượng io.BufferedReader để tăng tốc độ hơn. Nó cũng giải quyết vấn đề trong đó các lệnh gọi xen kẽ tới read và readline cho kết quả sai.
(Bản vá được gửi bởi Nir Aides trong bpo-7610.)
hồ dầu¶
Lớp TarFile hiện có thể được sử dụng làm trình quản lý bối cảnh. Ngoài ra, phương thức add() của nó có một tùy chọn mới, filter, kiểm soát những tệp nào được thêm vào kho lưu trữ và cho phép chỉnh sửa siêu dữ liệu của tệp.
Tùy chọn filter mới thay thế tham số exclude cũ hơn, kém linh hoạt hơn hiện không được dùng nữa. Nếu được chỉ định, tham số filter tùy chọn cần phải là keyword argument. Hàm lọc do người dùng cung cấp chấp nhận đối tượng TarInfo và trả về đối tượng TarInfo đã cập nhật hoặc nếu muốn loại trừ tệp, hàm có thể trả về None:
>>> nhập tarfile, toàn cầu
>>> def myfilter(tarinfo):
... if tarinfo.isfile(): # only lưu các tập tin thực
... tarinfo.uname = 'monty' # redact tên người dùng
... trả lại tarinfo
>>> với tarfile.open(name='myarchive.tar.gz', mode='w:gz') là tf:
... cho tên tệp trong glob.glob('*.txt'):
... tf.add(tên tệp, filter=myfilter)
... tf.list()
-rw-r--r-- monty/501 902 2011-01-26 17:59:11 chú thích.txt
-rw-r--r-- monty/501 123 2011-01-26 17:59:11 generic_questions.txt
-rw-r--r-- monty/501 3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501 124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501 1399 2011-01-26 17:59:11 semaphore_notes.txt
(Được đề xuất bởi Tarek Ziadé và được Lars Gustäbel thực hiện trong bpo-6856.)
hàm băm¶
Mô-đun hashlib có hai thuộc tính không đổi mới liệt kê các thuật toán băm được đảm bảo có trong tất cả các triển khai và các thuộc tính có sẵn trong triển khai hiện tại:
>>> nhập hashlib
>>> hashlib.algorithms_guaranteed
{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}
>>> hashlib.algorithms_available
{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}
(Được đề xuất bởi Carl Chenet trong bpo-7418.)
ast¶
Mô-đun ast có một công cụ đa năng tuyệt vời để đánh giá các chuỗi biểu thức một cách an toàn bằng cú pháp chữ Python. Hàm ast.literal_eval() đóng vai trò như một giải pháp thay thế an toàn cho hàm eval() tích hợp vốn dễ bị lạm dụng. Python 3.2 thêm các chữ bytes và set vào danh sách các loại được hỗ trợ: chuỗi, byte, số, bộ dữ liệu, danh sách, dicts, bộ, booleans và None.
>>> từ ast nhập chữ_eval
>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"
>>> chữ_eval(yêu cầu)
{'args': (2, 0.5), 'req': 3, 'func': 'pow'}
>>> request = "os.system('làm điều gì đó có hại')"
>>> chữ_eval(yêu cầu)
Traceback (cuộc gọi gần đây nhất):
...
ValueError: nút hoặc chuỗi không đúng định dạng: <_ast.Call đối tượng tại 0x101739a10>
(Được thực hiện bởi Benjamin Peterson và Georg Brandl.)
hệ điều hành¶
Các hệ điều hành khác nhau sử dụng các cách mã hóa khác nhau cho tên tệp và biến môi trường. Mô-đun os cung cấp hai chức năng mới, fsencode() và fsdecode(), để mã hóa và giải mã tên tệp:
>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'
Một số hệ điều hành cho phép truy cập trực tiếp vào các byte được mã hóa trong môi trường. Nếu vậy, hằng số os.supports_bytes_environ sẽ đúng.
Để truy cập trực tiếp vào các biến môi trường được mã hóa (nếu có), hãy sử dụng hàm os.getenvb() mới hoặc sử dụng os.environb là phiên bản byte của os.environ.
(Được đóng góp bởi Victor Stinner.)
im lặng¶
Chức năng shutil.copytree() có hai tùy chọn mới:
ignore_dangling_symlinks: khi
symlinks=Falseđể hàm sao chép một tệp được trỏ đến bởi một liên kết tượng trưng chứ không phải chính liên kết tượng trưng đó. Tùy chọn này sẽ tắt tiếng lỗi nêu ra nếu tệp không tồn tại.copy_function: là một lệnh gọi sẽ được sử dụng để sao chép tập tin.
shutil.copy2()được sử dụng theo mặc định.
(Được đóng góp bởi Tarek Ziadé.)
Ngoài ra, mô-đun shutil hiện hỗ trợ archiving operations cho các tệp zip, tarfile không nén, tarfile được nén và tarfile được nén. Và có các chức năng để đăng ký các định dạng tệp lưu trữ bổ sung (chẳng hạn như tệp tarfile nén xz hoặc định dạng tùy chỉnh).
Các chức năng chính là make_archive() và unpack_archive(). Theo mặc định, cả hai đều hoạt động trên thư mục hiện tại (có thể được đặt bởi os.chdir()) và trên bất kỳ thư mục con nào. Tên tệp lưu trữ cần phải được chỉ định bằng tên đường dẫn đầy đủ. Bước lưu trữ không phá hủy (các tập tin gốc được giữ nguyên).
>>> nhập imil, pprint
>>> os.chdir('mydata') # change vào thư mục nguồn
>>> f = Shutil.make_archive('/var/backup/mydata',
... 'zip') # archive thư mục hiện tại
>>> f # show tên của kho lưu trữ
'/var/backup/mydata.zip'
>>> os.chdir('tmp') # change để giải nén
>>> Shutil.unpack_archive('/var/backup/mydata.zip') # recover dữ liệu
>>> pprint.pprint(shutil.get_archive_formats()) # display các định dạng đã biết
[('bztar', "tệp tar bzip2'ed"),
("gztar", "gzip'ed tar-file"),
('tar', 'tệp tar không nén'),
('zip', 'tệp ZIP')]
>>> Shutil.register_archive_format( # register một định dạng lưu trữ mới
... tên='xz',
... function=xz.compress, chức năng lưu trữ # callable
... extra_args=[('level', 8)], # arguments cho hàm
... mô tả='nén xz'
... )
(Được đóng góp bởi Tarek Ziadé.)
sqlite3¶
Mô-đun sqlite3 đã được cập nhật lên phiên bản pysqlite 2.6.0. Nó có hai khả năng mới.
Thuộc tính
sqlite3.Connection.in_transitlà đúng nếu có một giao dịch đang hoạt động đối với những thay đổi không được cam kết.Các phương thức
sqlite3.Connection.enable_load_extension()vàsqlite3.Connection.load_extension()cho phép bạn tải các phần mở rộng SQLite từ các tệp ".so". Một tiện ích mở rộng nổi tiếng là tiện ích mở rộng tìm kiếm toàn văn bản được phân phối bằng SQLite.
(Được đóng góp bởi R. David Murray và Shashwat Anand; bpo-8845.)
html¶
Một mô-đun html mới được giới thiệu chỉ có một chức năng duy nhất, escape(), được sử dụng để thoát các ký tự dành riêng khỏi đánh dấu HTML:
>>> import html
>>> html.escape('x > 2 && x < 7')
'x > 2 && x < 7'
ổ cắm¶
Mô-đun socket có hai cải tiến mới.
Các đối tượng ổ cắm hiện có phương thức
detach()đặt ổ cắm vào trạng thái đóng mà không thực sự đóng bộ mô tả tệp cơ bản. Sau này có thể được tái sử dụng cho các mục đích khác. (Được thêm bởi Antoine Pitrou; bpo-8524.)socket.create_connection()hiện hỗ trợ giao thức quản lý ngữ cảnh để sử dụng vô điều kiện các ngoại lệsocket.errorvà đóng ổ cắm khi hoàn tất. (Được đóng góp bởi Giampaolo Rodolà; bpo-9794.)
ssl¶
Mô-đun ssl đã thêm một số tính năng để đáp ứng các yêu cầu chung về kết nối internet an toàn (được mã hóa, xác thực):
Một lớp mới,
SSLContext, đóng vai trò là nơi chứa dữ liệu SSL liên tục, chẳng hạn như cài đặt giao thức, chứng chỉ, khóa riêng tư và nhiều tùy chọn khác. Nó bao gồm mộtwrap_socket()để tạo ổ cắm SSL từ ngữ cảnh SSL.Một chức năng mới,
ssl.match_hostname(), hỗ trợ xác minh danh tính máy chủ cho các giao thức cấp cao hơn bằng cách triển khai các quy tắc của HTTPS (từ RFC 2818) cũng phù hợp với các giao thức khác.Hàm khởi tạo
ssl.wrap_socket()hiện có đối số ciphers. Chuỗi ciphers liệt kê các thuật toán mã hóa được phép sử dụng định dạng được mô tả trong tệp OpenSSL documentation.Khi được liên kết với các phiên bản OpenSSL gần đây, mô-đun
sslhiện hỗ trợ tiện ích mở rộng Chỉ định tên máy chủ cho giao thức TLS, cho phép nhiều "máy chủ ảo" sử dụng các chứng chỉ khác nhau trên một cổng IP. Tiện ích mở rộng này chỉ được hỗ trợ ở chế độ máy khách và được kích hoạt bằng cách chuyển đối số server_hostname chossl.SSLContext.wrap_socket().Nhiều tùy chọn khác nhau đã được thêm vào mô-đun
ssl, chẳng hạn nhưOP_NO_SSLv2để vô hiệu hóa giao thức SSLv2 không an toàn và lỗi thời.Tiện ích mở rộng hiện tải tất cả các thuật toán mã hóa và phân loại OpenSSL. Nếu một số chứng chỉ SSL không thể được xác minh, chúng sẽ được báo cáo là lỗi "thuật toán không xác định".
Phiên bản OpenSSL đang được sử dụng hiện có thể truy cập được bằng cách sử dụng các thuộc tính mô-đun
ssl.OPENSSL_VERSION(một chuỗi),ssl.OPENSSL_VERSION_INFO(5 bộ dữ liệu) vàssl.OPENSSL_VERSION_NUMBER(một số nguyên).
(Được đóng góp bởi Antoine Pitrou trong bpo-8850, bpo-1589, bpo-8322, bpo-5639, bpo-4870, bpo-8484 và bpo-8321.)
nntp¶
Mô-đun nntplib có cách triển khai được cải tiến với byte và ngữ nghĩa văn bản tốt hơn cũng như các API thực tế hơn. Những cải tiến này phá vỡ khả năng tương thích với phiên bản nntplib trong Python 3.1, bản thân phiên bản này có một phần không hoạt động.
Hỗ trợ kết nối an toàn thông qua cả ngầm định (sử dụng nntplib.NNTP_SSL) và rõ ràng (sử dụng nntplib.NNTP.starttls()) TLS cũng đã được thêm vào.
(Được đóng góp bởi Antoine Pitrou trong bpo-9360 và Andrew Vant trong bpo-1926.)
giấy chứng nhận¶
http.client.HTTPSConnection, urllib.request.HTTPSHandler và urllib.request.urlopen() hiện có các đối số tùy chọn để cho phép kiểm tra chứng chỉ máy chủ dựa trên một nhóm Tổ chức phát hành chứng chỉ, như được khuyến nghị khi sử dụng HTTPS công khai.
(Được thêm bởi Antoine Pitrou, bpo-9003.)
imaplib¶
Hỗ trợ cho TLS rõ ràng trên các kết nối IMAP4 tiêu chuẩn đã được thêm vào thông qua phương thức imaplib.IMAP4.starttls mới.
(Được đóng góp bởi Lorenzo M. Catucci và Antoine Pitrou, bpo-4471.)
http.client¶
Có một số cải tiến nhỏ về API trong mô-đun http.client. Các phản hồi đơn giản HTTP 0.9 kiểu cũ không còn được hỗ trợ và tham số strict không được dùng nữa trong tất cả các lớp.
Các lớp HTTPConnection và HTTPSConnection hiện có tham số source_address cho một bộ dữ liệu (máy chủ, cổng) cho biết kết nối HTTP được tạo từ đâu.
Hỗ trợ kiểm tra chứng chỉ và máy chủ ảo HTTPS đã được thêm vào HTTPSConnection.
Phương thức request() trên các đối tượng kết nối cho phép một đối số body tùy chọn để có thể sử dụng file object để cung cấp nội dung của yêu cầu. Thuận tiện hơn, đối số body hiện cũng chấp nhận đối tượng iterable miễn là nó bao gồm tiêu đề Content-Length rõ ràng. Giao diện mở rộng này linh hoạt hơn nhiều so với trước đây.
Để thiết lập kết nối HTTPS thông qua máy chủ proxy, có một phương pháp set_tunnel() mới đặt máy chủ và cổng cho đường hầm kết nối HTTP.
Để phù hợp với hành vi của http.server, thư viện máy khách HTTP hiện cũng mã hóa các tiêu đề bằng mã hóa ISO-8859-1 (Latin-1). Nó đã thực hiện điều đó đối với các tiêu đề đến, vì vậy giờ đây hoạt động này nhất quán cho cả lưu lượng truy cập đến và đi. (Xem tác phẩm của Armin Ronacher trên bpo-10980.)
nhỏ nhất¶
Mô-đun unittest có một số cải tiến hỗ trợ khám phá thử nghiệm cho các gói, thử nghiệm dễ dàng hơn tại dấu nhắc tương tác, các phương pháp thử nghiệm mới, thông báo chẩn đoán được cải thiện cho các lỗi thử nghiệm và tên phương thức tốt hơn.
Lệnh gọi dòng lệnh
python -m unittesthiện có thể chấp nhận đường dẫn tệp thay vì tên mô-đun để chạy các thử nghiệm cụ thể (bpo-10620). Khám phá thử nghiệm mới có thể tìm thấy các thử nghiệm trong các gói, định vị bất kỳ thử nghiệm nào có thể nhập được từ thư mục cấp cao nhất. Thư mục cấp cao nhất có thể được chỉ định bằng tùy chọn-t, một mẫu để khớp các tệp với-pvà một thư mục để bắt đầu khám phá với-s:$ python -m khám phá không đáng tin cậy nhất -s my_proj_dir -p _test.py
(Được đóng góp bởi Michael Foodd.)
Việc thử nghiệm tại dấu nhắc tương tác giờ đây dễ dàng hơn vì lớp
unittest.TestCasehiện có thể được khởi tạo mà không cần đối số:>>> from unittest import TestCase >>> TestCase().assertEqual(pow(2, 3), 8)
(Được đóng góp bởi Michael Foodd.)
Mô-đun
unittestcó hai phương thức mới,assertWarns()vàassertWarnsRegex()để xác minh rằng loại cảnh báo nhất định được kích hoạt bởi mã đang thử nghiệm:với self.assertWarns(DeprecationWarning): di sản_function('XYZ')
(Được đóng góp bởi Antoine Pitrou, bpo-9754.)
Một phương pháp mới khác,
assertCountEqual()được sử dụng để so sánh hai lần lặp để xác định xem số phần tử của chúng có bằng nhau hay không (liệu các phần tử giống nhau có xuất hiện với cùng số lần xuất hiện bất kể thứ tự hay không):def test_anagram(tự): self.assertCountEqual('thuật toán', 'logarit')
(Được đóng góp bởi Raymond Hettinger.)
Tính năng chính của mô-đun unittest là nỗ lực tạo ra các chẩn đoán có ý nghĩa khi thử nghiệm thất bại. Khi có thể, lỗi sẽ được ghi lại cùng với chênh lệch đầu ra. Điều này đặc biệt hữu ích cho việc phân tích các tệp nhật ký của các lần chạy thử nghiệm không thành công. Tuy nhiên, vì các khác biệt đôi khi có thể rất lớn nên có một thuộc tính
maxDiffmới đặt độ dài tối đa của các khác biệt được hiển thị.Ngoài ra, tên phương thức trong mô-đun đã trải qua một số lần chỉnh sửa.
Ví dụ:
assertRegex()là tên mới củaassertRegexpMatches()đã bị đặt tên sai vì thử nghiệm sử dụngre.search()chứ không phảire.match(). Các phương thức khác sử dụng biểu thức chính quy hiện được đặt tên bằng dạng ngắn "Regex" thay vì "Regexp" -- tên này khớp với tên được sử dụng trong các triển khai nhỏ nhất khác, khớp với tên cũ của Python cho mô-đunrevà nó có vỏ lạc đà rõ ràng.(Được đóng góp bởi Raymond Hettinger và được thực hiện bởi Ezio Melotti.)
Để cải thiện tính nhất quán, một số bí danh phương thức lâu đời không được dùng nữa để thay thế bằng các tên ưa thích:
Tên cũ
Tên ưa thích
assert_()assertEquals()assertNotEquals()assertAlmostEquals()assertNotAlmostEquals()Tương tự, các phương thức
TestCase.fail*không được dùng nữa trong Python 3.1 dự kiến sẽ bị xóa trong Python 3.3.(Được đóng góp bởi Ezio Melotti; bpo-9424.)
Phương thức
assertDictContainsSubset()không được dùng nữa vì nó được triển khai sai với các đối số không đúng thứ tự. Điều này tạo ra ảo ảnh quang học khó gỡ lỗi trong đó các thử nghiệm nhưTestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})sẽ thất bại.(Được đóng góp bởi Raymond Hettinger.)
ngẫu nhiên¶
Các phương thức số nguyên trong mô-đun random hiện thực hiện công việc phân phối đồng đều tốt hơn. Trước đây, họ đã tính toán các lựa chọn với int(n*random()) có độ lệch nhẹ bất cứ khi nào n không phải là lũy thừa của hai. Bây giờ, nhiều lựa chọn được thực hiện từ một phạm vi lên đến lũy thừa tiếp theo của 2 và một lựa chọn chỉ được giữ lại khi nó nằm trong phạm vi 0 <= x < n. Các chức năng và phương thức bị ảnh hưởng là randrange(), randint(), choice(), shuffle() và sample().
(Được đóng góp bởi Raymond Hettinger; bpo-9025.)
poplib¶
Lớp POP3_SSL hiện chấp nhận tham số context, là đối tượng ssl.SSLContext cho phép kết hợp các tùy chọn cấu hình, chứng chỉ và khóa riêng của SSL vào một cấu trúc duy nhất (có khả năng tồn tại lâu dài).
(Được đóng góp bởi Giampaolo Rodolà; bpo-8807.)
không đồng bộ¶
asyncore.dispatcher hiện cung cấp phương thức handle_accepted() trả về cặp (sock, addr) được gọi khi kết nối thực sự được thiết lập với điểm cuối từ xa mới. Điều này được cho là được sử dụng để thay thế cho handle_accept() cũ và tránh người dùng gọi trực tiếp accept().
(Được đóng góp bởi Giampaolo Rodolà; bpo-6706.)
tập tin tạm thời¶
Mô-đun tempfile có trình quản lý bối cảnh mới, TemporaryDirectory, cung cấp khả năng dọn dẹp dễ dàng xác định các thư mục tạm thời
với tempfile.TemporaryDirectory() là tmpdirname:
print('đã tạo thư mục tạm thời:', tmpdirname)
(Được đóng góp bởi Neil Schenauer và Nick Coghlan; bpo-5178.)
kiểm tra¶
Mô-đun
inspectcó chức năng mớigetgeneratorstate()để dễ dàng xác định trạng thái hiện tại của trình tạo-iterator>>> từ kiểm tra nhập getgeneratorstate >>> def gen(): ... mang lại 'bản demo' ... >>> g = gen() >>> getgeneratorstate(g) 'GEN_CREATED' >>> tiếp theo(g) 'bản demo' >>> getgeneratorstate(g) 'GEN_SUSPENDED' >>> tiếp theo(g, Không có) >>> getgeneratorstate(g) 'GEN_CLOSED'
(Được đóng góp bởi Rodolpho Eckhardt và Nick Coghlan, bpo-10220.)
Để hỗ trợ tra cứu mà không có khả năng kích hoạt thuộc tính động, mô-đun
inspectcó một chức năng mới,getattr_static(). Không giống nhưhasattr(), đây là tìm kiếm chỉ đọc thực sự, được đảm bảo không thay đổi trạng thái trong khi tìm kiếm>>> lớp A: ... @property ... def f(tự): ... print('Đang chạy') ... trả về 10 ... >>> a = A() >>> getattr(a, 'f') Đang chạy 10 >>> kiểm tra.getattr_static(a, 'f') <đối tượng thuộc tính tại 0x1022bd788>
(Được đóng góp bởi Michael Foodd.)
pydoc¶
Mô-đun pydoc hiện cung cấp giao diện máy chủ web được cải tiến nhiều, cũng như tùy chọn dòng lệnh mới -b để tự động mở cửa sổ trình duyệt để hiển thị máy chủ đó:
$ pydoc3.2 -b
(Được đóng góp bởi Ron Adam; bpo-2001.)
dis¶
Mô-đun dis có hai chức năng mới để kiểm tra mã, code_info() và show_code(). Cả hai đều cung cấp thông tin đối tượng mã chi tiết cho hàm, phương thức, chuỗi mã nguồn hoặc đối tượng mã được cung cấp. Cái trước trả về một chuỗi và cái sau in nó
>>> nhập đĩa, ngẫu nhiên
>>> dis.show_code(random.choice)
Tên: sự lựa chọn
Tên tệp: /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Số lượng đối số: 2
Đối số chỉ có Kw: 0
Số người dân địa phương: 3
Kích thước ngăn xếp: 11
Cờ: OPTIMIZED, NEWLOCALS, NOFREE
Hằng số:
0: 'Chọn một phần tử ngẫu nhiên từ một chuỗi không trống.'
1: 'Không thể chọn từ một chuỗi trống'
Tên:
0: _randbelow
1: len
2: Lỗi giá trị
3: Lỗi chỉ mục
Tên biến:
0: bản thân
1: thứ tự
2: tôi
Ngoài ra, hàm dis() hiện chấp nhận các đối số chuỗi để có thể rút ngắn thành ngữ phổ biến dis(compile(s, '', 'eval')) thành dis(s):
>>> dis('3*x+1 if x%2==1 else x//2')
1 0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (2)
6 BINARY_MODULO
7 LOAD_CONST 1 (1)
10 COMPARE_OP 2 (==)
13 POP_JUMP_IF_FALSE 28
16 LOAD_CONST 2 (3)
19 LOAD_NAME 0 (x)
22 BINARY_MULTIPLY
23 LOAD_CONST 1 (1)
26 BINARY_ADD
27 RETURN_VALUE
>> 28 LOAD_NAME 0 (x)
31 LOAD_CONST 0 (2)
34 BINARY_FLOOR_DIVIDE
35 RETURN_VALUE
Kết hợp lại với nhau, những cải tiến này giúp bạn dễ dàng khám phá cách triển khai CPython hơn và tự mình xem cú pháp ngôn ngữ thực hiện những gì.
(Được đóng góp bởi Nick Coghlan trong bpo-9147.)
dbm¶
Tất cả các mô-đun cơ sở dữ liệu hiện đều hỗ trợ các phương thức get() và setdefault().
(Được đề xuất bởi Ray Allen trong bpo-9523.)
ctypes¶
Một kiểu mới, ctypes.c_ssize_t đại diện cho kiểu dữ liệu C ssize_t.
trang web¶
Mô-đun site có ba chức năng mới hữu ích để báo cáo chi tiết về bản cài đặt Python nhất định.
getsitepackages()liệt kê tất cả các thư mục gói trang web toàn cầu.getuserbase()báo cáo về thư mục cơ sở của người dùng nơi dữ liệu có thể được lưu trữ.getusersitepackages()tiết lộ đường dẫn thư mục gói trang web dành riêng cho người dùng.
>>> trang web nhập khẩu
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
'/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
'/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Người dùng/raymondhettinger/Thư viện/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'
Thuận tiện, một số chức năng của trang web có thể truy cập trực tiếp từ dòng lệnh:
$ python -m trang web --cơ sở người dùng
/Users/raymondhettinger/.local
$ python -m trang web --trang web người dùng
/Users/raymondhettinger/.local/lib/python3.2/site-packages
(Được đóng góp bởi Tarek Ziadé trong bpo-6693.)
cấu hình hệ thống¶
Mô-đun sysconfig mới giúp dễ dàng khám phá các đường dẫn cài đặt và các biến cấu hình khác nhau giữa các nền tảng và cài đặt.
Mô-đun này cung cấp các chức năng truy cập đơn giản để biết thông tin về nền tảng và phiên bản:
get_platform()trả về các giá trị như linux-i586 hoặc macosx-10.6-ppc.get_python_version()trả về chuỗi phiên bản Python, chẳng hạn như "3.2".
Nó cũng cung cấp quyền truy cập vào các đường dẫn và biến tương ứng với một trong bảy lược đồ được đặt tên được distutils sử dụng. Chúng bao gồm posix_prefix, posix_home, posix_user, nt, nt_user, os2, os2_home:
get_paths()tạo một từ điển chứa các đường dẫn cài đặt cho sơ đồ cài đặt hiện tại.get_config_vars()trả về một từ điển gồm các biến cụ thể của nền tảng.
Ngoài ra còn có giao diện dòng lệnh thuận tiện:
C:\Python32>python -m sysconfig
Nền tảng: "win32"
Phiên bản Python: "3.2"
Sơ đồ cài đặt hiện tại: "nt"
Đường dẫn:
dữ liệu = "C:\Python32"
include = "C:\Python32\Include"
platinclude = "C:\Python32\Include"
platlib = "C:\Python32\Lib\site-gói"
platstdlib = "C:\Python32\Lib"
purelib = "C:\Python32\Lib\site-gói"
scripts = "C:\Python32\Scripts"
stdlib = "C:\Python32\Lib"
Biến:
BINDIR = "C:\Python32"
BINLIBDEST = "C:\Python32\Lib"
EXE = ".exe"
INCLUDEPY = "C:\Python32\Bao gồm"
LIBDEST = "C:\Python32\Lib"
SO = ".pyd"
VERSION = "32"
abiflags = ""
cơ sở = "C:\Python32"
exec_prefix = "C:\Python32"
platbase = "C:\Python32"
tiền tố = "C:\Python32"
dự án = "C:\Python32"
py_version = "3.2"
py_version_nodot = "32"
py_version_short = "3.2"
srcdir = "C:\Python32"
userbase = "C:\Documents and Cài đặt\Raymond\Dữ liệu ứng dụng\Python"
(Đã chuyển khỏi Distutils bởi Tarek Ziadé.)
pdb¶
Mô-đun trình gỡ lỗi pdb đã đạt được một số cải tiến về khả năng sử dụng:
pdb.pyhiện có tùy chọn-cthực thi các lệnh như được đưa ra trong tệp tập lệnh.pdbrc.Tệp tập lệnh
.pdbrccó thể chứa các lệnhcontinuevànexttiếp tục gỡ lỗi.Hàm tạo của lớp
Pdbhiện chấp nhận đối số nosigint.Các lệnh mới:
l(list),ll(long list)vàsourceđể liệt kê mã nguồn.Lệnh mới:
displayvàundisplayđể hiển thị hoặc ẩn giá trị của biểu thức nếu nó thay đổi.Lệnh mới:
interactđể khởi động trình thông dịch tương tác chứa tên chung và tên cục bộ được tìm thấy trong phạm vi hiện tại.Điểm dừng có thể được xóa bằng số điểm dừng.
(Được đóng góp bởi Georg Brandl, Antonio Cuni và Ilya Sandler.)
trình phân tích cú pháp cấu hình¶
Mô-đun configparser đã được sửa đổi để cải thiện khả năng sử dụng và khả năng dự đoán của trình phân tích cú pháp mặc định cũng như cú pháp INI được hỗ trợ của nó. Lớp ConfigParser cũ đã bị loại bỏ để nhường chỗ cho SafeConfigParser, sau đó được đổi tên thành ConfigParser. Hỗ trợ nhận xét nội tuyến hiện bị tắt theo mặc định và các bản sao phần hoặc tùy chọn không được phép trong một nguồn cấu hình.
Trình phân tích cú pháp cấu hình đã nhận được API mới dựa trên giao thức ánh xạ:
>>> trình phân tích cú pháp = ConfigParser()
>>> trình phân tích cú pháp.read_string("""
... [DEFAULT]
... vị trí = phía trên bên trái
... có thể nhìn thấy = có
... có thể chỉnh sửa = không
... màu = xanh
...
... [chính]
... tiêu đề = Menu chính
... màu sắc = xanh lá cây
...
... [tùy chọn]
... tiêu đề = Tùy chọn
... """)
>>> trình phân tích cú pháp['main']['color']
'xanh'
>>> trình phân tích cú pháp['main']['editable']
'không'
>>> phần = trình phân tích cú pháp['options']
>>> phần['title']
'Tùy chọn'
>>> phần['title'] = 'Tùy chọn (có thể chỉnh sửa: %(editable)s)'
>>> phần['title']
'Tùy chọn (có thể chỉnh sửa: không)'
API mới được triển khai dựa trên API cổ điển, vì vậy các lớp con của trình phân tích cú pháp tùy chỉnh sẽ có thể sử dụng nó mà không cần sửa đổi.
Cấu trúc tệp INI được các trình phân tích cú pháp cấu hình chấp nhận hiện có thể được tùy chỉnh. Người dùng có thể chỉ định các dấu phân cách tùy chọn/giá trị thay thế và tiền tố nhận xét, thay đổi tên của phần DEFAULT hoặc chuyển cú pháp nội suy.
Có hỗ trợ cho phép nội suy có thể cắm được bao gồm trình xử lý nội suy bổ sung ExtendedInterpolation:
>>> trình phân tích cú pháp = ConfigParser(interpolation=ExtendsInterpolation())
>>> Parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},
... 'tùy chỉnh': {'tiền tố': '/usr/local'}})
>>> trình phân tích cú pháp.read_string("""
... [xây dựng]
... bộ phận =
... zope9
... ví dụ
... liên kết tìm =
... ${buildout:directory}/downloads/dist
...
... [zope9]
... công thức = plone.recipe.zope9install
... vị trí = /opt/zope
...
... [ví dụ]
... công thức = plone.recipe.zope9instance
... zope9-location = ${zope9:location}
... zope-conf = ${custom:prefix}/etc/zope.conf
... """)
>>> trình phân tích cú pháp['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> trình phân tích cú pháp['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = trình phân tích cú pháp['instance']
>>> ví dụ['zope-conf']
'/usr/local/etc/zope.conf'
>>> ví dụ['zope9-location']
'/opt/zope'
Một số tính năng nhỏ hơn cũng được giới thiệu, như hỗ trợ chỉ định mã hóa trong thao tác đọc, chỉ định giá trị dự phòng cho hàm get hoặc đọc trực tiếp từ từ điển và chuỗi.
(Tất cả những thay đổi được đóng góp bởi Łukasz Langa.)
urllib.parse¶
Một số cải tiến về khả năng sử dụng đã được thực hiện cho mô-đun urllib.parse.
Hàm urlparse() hiện hỗ trợ các địa chỉ IPv6 như được mô tả trong RFC 2732:
>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
ParseResult(scheme='http',
netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
path='/foo/',
params='',
query='',
fragment='')
Hàm urldefrag() hiện trả về named tuple:
>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', frag='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'mục tiêu'
Và, hàm urlencode() giờ đây linh hoạt hơn nhiều, chấp nhận kiểu chuỗi hoặc kiểu byte cho đối số query. Nếu là một chuỗi thì các tham số safe, encoding và error sẽ được gửi đến quote_plus() để mã hóa:
>>> urllib.parse.urlencode([
... ('loại', 'telenovela'),
... ('tên', '¿Dónde Está Elisa?')],
... mã hóa='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'
Như chi tiết trong Phân tích byte được mã hóa ASCII, tất cả các hàm urllib.parse hiện chấp nhận chuỗi byte được mã hóa ASCII làm đầu vào, miễn là chúng không bị trộn lẫn với các chuỗi thông thường. Nếu chuỗi byte được mã hóa ASCII được cung cấp dưới dạng tham số thì kiểu trả về cũng sẽ là chuỗi byte được mã hóa ASCII:
>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
path=b'/about/', params=b'', query=b'', fragment=b'')
(Tác phẩm của Nick Coghlan, Dan Mahn và Senthil Kumaran trong bpo-2987, bpo-5468 và bpo-9873.)
hộp thư¶
Nhờ nỗ lực phối hợp của R. David Murray, mô-đun mailbox đã được sửa cho Python 3.2. Thách thức là hộp thư ban đầu được thiết kế với giao diện văn bản, nhưng các email được thể hiện tốt nhất bằng bytes vì các phần khác nhau của thư có thể có các mã hóa khác nhau.
Giải pháp khai thác hỗ trợ nhị phân của gói email để phân tích cú pháp các tin nhắn email tùy ý. Ngoài ra, giải pháp yêu cầu một số thay đổi API.
Đúng như mong đợi, phương thức add() cho các đối tượng mailbox.Mailbox hiện chấp nhận đầu vào nhị phân.
StringIO và tính năng nhập tệp văn bản không được dùng nữa. Ngoài ra, việc nhập chuỗi sẽ sớm bị lỗi nếu sử dụng các ký tự không phải ASCII. Trước đây nó sẽ thất bại khi email được xử lý ở bước sau.
Ngoài ra còn có hỗ trợ cho đầu ra nhị phân. Phương thức get_file() hiện trả về một tệp ở chế độ nhị phân (trong đó nó được sử dụng để đặt tệp thành chế độ văn bản không chính xác). Ngoài ra còn có một phương thức get_bytes() mới trả về biểu diễn bytes của một thông báo tương ứng với một key nhất định.
Vẫn có thể nhận được đầu ra không nhị phân bằng phương pháp get_string() cũ của API, nhưng cách tiếp cận đó không hữu ích lắm. Thay vào đó, tốt nhất là trích xuất tin nhắn từ đối tượng Message hoặc tải chúng từ đầu vào nhị phân.
(Được đóng góp bởi R. David Murray, với nỗ lực của Steffen Daode Nurpmeso và bản vá đầu tiên của Victor Stinner trong bpo-9124.)
bản demo rùa¶
Mã trình diễn cho mô-đun turtle đã được chuyển từ thư mục Demo sang thư viện chính. Nó bao gồm hơn chục tập lệnh mẫu với màn hình sống động. Đang sử dụng sys.path, giờ đây nó có thể được chạy trực tiếp từ dòng lệnh:
$ python -m rùademo
(Được chuyển từ thư mục Demo bởi Alexander Belopolsky trong bpo-10199.)
Đa luồng¶
Cơ chế thực thi tuần tự hóa các luồng Python chạy đồng thời (thường được gọi là GIL hoặc Khóa phiên dịch toàn cầu) đã được viết lại. Trong số các mục tiêu có khoảng thời gian chuyển đổi có thể dự đoán được nhiều hơn và giảm chi phí do xung đột khóa và số lượng cuộc gọi hệ thống tiếp theo. Khái niệm "khoảng thời gian kiểm tra" để cho phép chuyển đổi luồng đã bị loại bỏ và thay thế bằng khoảng thời gian tuyệt đối được biểu thị bằng giây. Tham số này có thể điều chỉnh được thông qua
sys.setswitchinterval(). Hiện tại nó được mặc định là 5 mili giây.Bạn có thể đọc thông tin chi tiết bổ sung về việc triển khai từ python-dev mailing-list message (tuy nhiên, "các yêu cầu ưu tiên" được nêu trong thông báo này chưa được lưu giữ để đưa vào).
(Được đóng góp bởi Antoine Pitrou.)
Các khóa thông thường và đệ quy hiện chấp nhận đối số timeout tùy chọn cho phương thức
acquire()của chúng. (Được đóng góp bởi Antoine Pitrou; bpo-7316.)Tương tự,
threading.Semaphore.acquire()cũng nhận được đối số timeout. (Được đóng góp bởi Torsten Landschoff; bpo-850728.)Việc mua lại khóa thông thường và đệ quy hiện có thể bị gián đoạn bởi các tín hiệu trên nền tảng sử dụng Pthreads. Điều này có nghĩa là các chương trình Python bị bế tắc trong khi lấy khóa có thể bị loại bỏ thành công bằng cách gửi liên tục SIGINT đến quy trình (bằng cách nhấn Ctrl+C trong hầu hết các shell). (Được đóng góp bởi Reid Kleckner; bpo-8844.)
Tối ưu hóa¶
Một số cải tiến hiệu suất nhỏ đã được thêm vào:
Trình tối ưu hóa lỗ nhìn trộm của Python hiện nhận dạng các mẫu như
x in {1, 2, 3}như một bài kiểm tra tư cách thành viên trong một tập hợp các hằng số. Trình tối ưu hóa sẽ tạo lạisetdưới dạngfrozensetvà lưu trữ hằng số được tạo sẵn.Bây giờ, hình phạt về tốc độ đã không còn nữa, việc bắt đầu viết bài kiểm tra tư cách thành viên bằng cách sử dụng ký hiệu tập hợp là điều thực tế. Phong cách này vừa rõ ràng về mặt ngữ nghĩa vừa hoạt động nhanh:
phần mở rộng = name.rpartition('.')[2] nếu tiện ích mở rộng trong {'xml', 'html', 'xhtml', 'css'}: xử lý (tên)
(Bản vá và các bài kiểm tra bổ sung do Dave Malcolm đóng góp; bpo-6690).
Việc tuần tự hóa và hủy tuần tự hóa dữ liệu bằng mô-đun
picklehiện nhanh hơn nhiều lần.(Được đóng góp bởi Alexandre Vassalotti, Antoine Pitrou và nhóm Unladen Swallow trong bpo-9410 và bpo-3873.)
Timsort algorithm được sử dụng trong
list.sort()vàsorted()hiện chạy nhanh hơn và sử dụng ít bộ nhớ hơn khi được gọi bằng key function. Trước đây, mọi phần tử của danh sách được bao bọc bằng một đối tượng tạm thời ghi nhớ giá trị khóa liên kết với từng phần tử. Bây giờ, hai mảng khóa và giá trị được sắp xếp song song. Điều này giúp tiết kiệm bộ nhớ mà trình bao bọc sắp xếp sử dụng và tiết kiệm thời gian bị mất khi ủy quyền so sánh.(Bản vá của Daniel Stutzbach trong bpo-9915.)
Hiệu suất giải mã JSON được cải thiện và giảm mức tiêu thụ bộ nhớ bất cứ khi nào lặp lại cùng một chuỗi cho nhiều khóa. Ngoài ra, mã hóa JSON hiện sử dụng tăng tốc C khi đối số
sort_keyslà đúng.(Được đóng góp bởi Antoine Pitrou trong bpo-7451 và bởi Raymond Hettinger và Antoine Pitrou trong bpo-10314.)
Khóa đệ quy (được tạo bằng
threading.RLock()API) hiện được hưởng lợi từ việc triển khai C, giúp chúng nhanh như khóa thông thường và nhanh hơn từ 10 đến 15 lần so với triển khai Python thuần túy trước đây.(Được đóng góp bởi Antoine Pitrou; bpo-3001.)
Thuật toán tìm kiếm nhanh trong stringlib hiện được sử dụng bởi các phương thức
split(),rsplit(),splitlines()vàreplace()trên các đối tượngbytes,bytearrayvàstr. Tương tự, thuật toán cũng được sử dụng bởirfind(),rindex(),rsplit()vàrpartition().Chuyển đổi số nguyên thành chuỗi hiện hoạt động hai "chữ số" cùng một lúc, giảm số lượng phép chia và modulo.
(bpo-6713 của Gawain Bolton, Mark Dickinson và Victor Stinner.)
Có một số tối ưu hóa nhỏ khác. Giờ đây, việc thiết lập sự khác biệt sẽ chạy nhanh hơn khi một toán hạng lớn hơn nhiều so với toán hạng kia (bản vá của Andress Bennetts trong bpo-8685). Phương pháp array.repeat() có cách triển khai nhanh hơn (bpo-1569291 của Alexander Belopolsky). Zz003zz có bộ đệm hiệu quả hơn (bpo-3709 của Andrew Schaaf). Chức năng operator.attrgetter() đã được tăng tốc (bpo-10160 của Christos Georgiou). Và ConfigParser tải các đối số nhiều dòng nhanh hơn một chút (bpo-7113 của Łukasz Langa).
bảng mã Unicode¶
Python đã được cập nhật lên Unicode 6.0.0. Bản cập nhật tiêu chuẩn bổ sung hơn 2.000 ký tự mới bao gồm các ký hiệu emoji rất quan trọng đối với điện thoại di động.
Ngoài ra, tiêu chuẩn cập nhật đã thay đổi các thuộc tính ký tự cho hai ký tự Kannada (U+0CF1, U+0CF2) và một ký tự số Tai Lue mới (U+19DA), khiến ký tự trước đủ điều kiện để sử dụng trong số nhận dạng trong khi loại ký tự sau. Để biết thêm thông tin, xem Unicode Character Database Changes.
Codec¶
Đã thêm hỗ trợ cho mã hóa DOS tiếng Ả Rập cp720 (bpo-1616979).
Mã hóa MBCS không còn bỏ qua đối số xử lý lỗi nữa. Ở chế độ nghiêm ngặt mặc định, nó sẽ tăng UnicodeDecodeError khi gặp một chuỗi byte không thể giải mã được và UnicodeEncodeError cho một ký tự không thể mã hóa.
Codec MBCS hỗ trợ trình xử lý lỗi 'strict' và 'ignore' để giải mã cũng như 'strict' và 'replace' để mã hóa.
Để mô phỏng mã hóa Python3.1 MBCS, hãy chọn trình xử lý 'ignore' để giải mã và trình xử lý 'replace' để mã hóa.
Trên Mac OS X, Python giải mã các đối số dòng lệnh bằng 'utf-8' thay vì mã hóa ngôn ngữ.
Theo mặc định, tarfile sử dụng mã hóa 'utf-8' trên Windows (thay vì 'mbcs') và trình xử lý lỗi 'surrogateescape' trên tất cả các hệ điều hành.
Tài liệu¶
Các tài liệu tiếp tục được cải thiện.
Một bảng liên kết nhanh đã được thêm vào đầu các phần dài như Chức năng tích hợp. Trong trường hợp của
itertools, các liên kết được kèm theo các bảng tóm tắt kiểu cheatsheet để cung cấp cái nhìn tổng quan và giúp ghi nhớ mà không cần phải đọc tất cả tài liệu.Trong một số trường hợp, mã nguồn Python thuần túy có thể là một công cụ bổ trợ hữu ích cho tài liệu, vì vậy hiện nay nhiều mô-đun có các liên kết nhanh đến phiên bản mới nhất của mã nguồn. Ví dụ: tài liệu mô-đun
functoolscó liên kết nhanh ở trên cùng có nhãn:Source code Lib/functools.py.
(Được đóng góp bởi Raymond Hettinger; xem rationale.)
Các tài liệu bây giờ chứa nhiều ví dụ và công thức nấu ăn hơn. Đặc biệt, mô-đun
recó một phần mở rộng là Ví dụ về biểu thức chính quy. Tương tự như vậy, mô-đunitertoolstiếp tục được cập nhật với Bí quyết Itertools mới.Mô-đun
datetimehiện có triển khai phụ trợ bằng Python thuần túy. Không có chức năng nào được thay đổi. Điều này chỉ cung cấp cách triển khai thay thế dễ đọc hơn.(Được đóng góp bởi Alexander Belopolsky trong bpo-9528.)
Thư mục
Demokhông được bảo trì đã bị xóa. Một số bản demo đã được tích hợp vào tài liệu, một số được chuyển vào thư mụcTools/demovà một số khác đã bị xóa hoàn toàn.(Được đóng góp bởi Georg Brandl trong bpo-7962.)
IDLE¶
Kho lưu trữ mã¶
Ngoài kho lưu trữ mã Subversion hiện có tại https://svn.python.org, hiện còn có kho lưu trữ Mercurial tại https://hg.python.org/.
Sau bản phát hành 3.2, có kế hoạch chuyển sang Mercurial làm kho lưu trữ chính. Hệ thống kiểm soát phiên bản phân tán này sẽ giúp các thành viên trong cộng đồng tạo và chia sẻ các bộ thay đổi bên ngoài dễ dàng hơn. Xem PEP 385 để biết chi tiết.
Để tìm hiểu cách sử dụng hệ thống kiểm soát phiên bản mới, hãy xem Quick Start hoặc Guide to Mercurial Workflows.
Xây dựng và thay đổi C API¶
Những thay đổi trong quá trình xây dựng của Python và C API bao gồm:
Các tập lệnh idle, pydoc và 2to3 hiện đã được cài đặt với hậu tố dành riêng cho phiên bản trên
make altinstall(bpo-10679).Các hàm C truy cập Cơ sở dữ liệu Unicode hiện chấp nhận và trả về các ký tự từ phạm vi Unicode đầy đủ, ngay cả trên các bản dựng unicode hẹp (Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL và các ký tự khác). Một sự khác biệt rõ ràng trong Python là
unicodedata.numeric()hiện trả về giá trị chính xác cho các điểm mã lớn vàrepr()có thể coi nhiều ký tự hơn là có thể in được.(Báo cáo bởi Bupjoe Lee và sửa bởi Amaury Forgeot D'Arc; bpo-5127.)
Gotos được tính toán hiện được bật theo mặc định trên các trình biên dịch được hỗ trợ (được phát hiện bởi tập lệnh cấu hình). Chúng vẫn có thể bị vô hiệu hóa một cách có chọn lọc bằng cách chỉ định
--without-computed-gotos.(Được đóng góp bởi Antoine Pitrou; bpo-9203.)
Tùy chọn
--with-wctype-functionsđã bị xóa. Cơ sở dữ liệu unicode tích hợp hiện được sử dụng cho tất cả các chức năng.(Được đóng góp bởi Amaury Forgeot D'Arc; bpo-9210.)
Giá trị băm hiện là giá trị của một loại mới,
Py_hash_t, được xác định là có cùng kích thước với một con trỏ. Trước đây chúng thuộc loại dài, trên một số hệ điều hành 64 bit vẫn chỉ dài 32 bit. Nhờ bản sửa lỗi này,setvàdicthiện có thể chứa nhiều hơn các mục2**32trên các bản dựng có con trỏ 64-bit (trước đây, chúng có thể tăng đến kích thước đó nhưng hiệu suất của chúng bị suy giảm nghiêm trọng).(Được đề xuất bởi Raymond Hettinger và được thực hiện bởi Benjamin Peterson; bpo-9778.)
Macro
Py_VA_COPYmới sao chép trạng thái của danh sách đối số biến. Nó tương đương với C99 va_copy nhưng có sẵn trên tất cả các nền tảng Python (bpo-2443).Hàm C API mới
PySys_SetArgvEx()cho phép trình thông dịch nhúng đặtsys.argvmà không cần sửa đổisys.path(bpo-5753).PyEval_CallObject()hiện chỉ có ở dạng macro. Phần khai báo hàm được giữ lại vì lý do tương thích ngược hiện đã bị xóa -- macro được giới thiệu vào năm 1997 (bpo-8276).Có một chức năng mới
PyLong_AsLongLongAndOverflow()tương tự nhưPyLong_AsLongAndOverflow(). Cả hai đều dùng để chuyển đổi Pythonintthành loại có chiều rộng cố định gốc đồng thời cung cấp khả năng phát hiện các trường hợp chuyển đổi không phù hợp (bpo-7767).Hàm
PyUnicode_CompareWithASCIIString()hiện trả về not equal nếu chuỗi Python bị NUL chấm dứt.Có một hàm mới
PyErr_NewExceptionWithDoc()giống nhưPyErr_NewException()nhưng cho phép chỉ định một chuỗi tài liệu. Điều này cho phép các ngoại lệ C có khả năng tự ghi tài liệu giống như các đối tác Python thuần túy của chúng (bpo-7033).Khi được biên dịch bằng tùy chọn
--with-valgrind, bộ cấp phát pymalloc sẽ tự động bị tắt khi chạy trong Valgrind. Điều này giúp cải thiện khả năng phát hiện rò rỉ bộ nhớ khi chạy trong Valgrind, đồng thời tận dụng pymalloc vào những thời điểm khác (bpo-2422).Đã xóa định dạng
O?khỏi các hàm PyArg_Parse. Định dạng này không còn được sử dụng nữa và nó chưa bao giờ được ghi lại (bpo-8837).
Có một số thay đổi nhỏ khác đối với C-API. Xem tệp Misc/NEWS để biết danh sách đầy đủ.
Ngoài ra, còn có một số bản cập nhật cho bản dựng Mac OS X, hãy xem Mac/BuildScript/README.txt để biết chi tiết. Đối với người dùng đang chạy bản dựng 32/64-bit, đã xảy ra sự cố với Tcl/Tk mặc định trên Mac OS X 10.6. Theo đó, chúng tôi khuyên bạn nên cài đặt một bản cập nhật thay thế như ActiveState Tcl/Tk 8.5.9. Xem https://www.python.org/download/mac/tcltk/ để biết thêm chi tiết.
Chuyển sang Python 3.2¶
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:
Mô-đun
configparsercó một số tính năng dọn dẹp. Thay đổi lớn là thay thế lớpConfigParsercũ bằng lớpSafeConfigParserthay thế được ưa thích từ lâu. Ngoài ra còn có một số điểm không tương thích nhỏ hơn:Cú pháp nội suy hiện được xác thực trên các hoạt động
get()vàset(). Trong sơ đồ nội suy mặc định, chỉ có hai mã thông báo có dấu phần trăm là hợp lệ:%(name)svà%%, mã sau là ký hiệu phần trăm thoát.Các phương thức
set()vàadd_section()hiện xác minh rằng các giá trị là chuỗi thực. Trước đây, các loại không được hỗ trợ có thể được đưa vào một cách vô ý.Các phần hoặc tùy chọn trùng lặp từ một nguồn duy nhất giờ đây sẽ tăng
DuplicateSectionErrorhoặcDuplicateOptionError. Trước đây, các bản sao sẽ âm thầm ghi đè lên mục trước đó.Nhận xét nội tuyến hiện bị tắt theo mặc định nên giờ đây ký tự ; có thể được sử dụng một cách an toàn trong các giá trị.
Bình luận bây giờ có thể được thụt lề. Do đó, để ; hoặc # xuất hiện ở đầu một dòng trong các giá trị nhiều dòng, nó phải được nội suy. Điều này giúp các ký tự tiền tố nhận xét trong các giá trị không bị nhầm lẫn là nhận xét.
""hiện là giá trị hợp lệ và không còn được tự động chuyển đổi thành chuỗi trống nữa. Đối với các chuỗi trống, hãy sử dụng"option ="trong một dòng.
Mô-đun
nntplibđã được làm lại rộng rãi, có nghĩa là các API của nó thường không tương thích với API 3.1.đối tượng
bytearraykhông còn có thể được sử dụng làm tên tệp nữa; thay vào đó, chúng nên được chuyển đổi thànhbytes.array.tostring()vàarray.fromstring()đã được đổi tên thànharray.tobytes()vàarray.frombytes()cho rõ ràng. Những cái tên cũ đã không còn được dùng nữa. (Xem bpo-8990.)chức năng
PyArg_Parse*():Định dạng "t#" đã bị xóa: thay vào đó hãy sử dụng "s#" hoặc "s*"
Định dạng "w" và "w#" đã bị xóa: thay vào đó hãy sử dụng "w*"
Loại
PyCObject, không được dùng nữa trong phiên bản 3.1, đã bị xóa. Để bao bọc các con trỏ C mờ trong các đối tượng Python, thay vào đó nên sử dụngPyCapsuleAPI; loại mới có giao diện được xác định rõ ràng để truyền thông tin an toàn khi nhập và chữ ký ít phức tạp hơn để gọi hàm hủy.Chức năng
sys.setfilesystemencoding()đã bị loại bỏ vì nó có thiết kế sai sót.Hàm và phương thức
random.seed()hiện có chuỗi hạt muối với hàm băm sha512. Để truy cập phiên bản trước của seed nhằm tái tạo các chuỗi Python 3.1, hãy đặt đối số version thành 1,random.seed(s, version=1).Hàm
string.maketrans()không được dùng nữa trước đây đã bị xóa để thay thế bằng các phương thức tĩnhbytes.maketrans()vàbytearray.maketrans(). Thay đổi này giải quyết sự nhầm lẫn xung quanh loại nào được mô-đunstringhỗ trợ. Hiện tại, mỗi phương thứcstr,bytesvàbytearrayđều có các phương thức maketrans và translate riêng với các bảng dịch trung gian thuộc loại thích hợp.(Được đóng góp bởi Georg Brandl; bpo-5675.)
Hàm
contextlib.nested()không được dùng nữa trước đây đã bị xóa để thay thế bằng một câu lệnhwithđơn giản có thể chấp nhận nhiều trình quản lý bối cảnh. Kỹ thuật thứ hai nhanh hơn (vì nó được tích hợp sẵn) và thực hiện công việc tốt hơn khi hoàn thiện nhiều trình quản lý bối cảnh khi một trong số chúng đưa ra một ngoại lệvới open('mylog.txt') là infile, open('a.out', 'w') là outfile: cho dòng trong infile: nếu '<quan trọng>' xếp hàng: outfile.write(line)
(Được đóng góp bởi Georg Brandl và Mattias Brändström; appspot issue 53094.)
struct.pack()hiện chỉ cho phép byte cho mã gói chuỗis. Trước đây, nó sẽ chấp nhận các đối số văn bản và ngầm mã hóa chúng thành byte bằng UTF-8. Điều này có vấn đề vì nó đưa ra các giả định về mã hóa chính xác và vì mã hóa có độ dài thay đổi có thể không thành công khi ghi vào đoạn có độ dài cố định của cấu trúc.Mã như
struct.pack('<6sHHBBB', 'GIF87a', x, y)nên được viết lại để sử dụng byte thay vì văn bản,struct.pack('<6sHHBBB', b'GIF87a', x, y).(Được phát hiện bởi David Beazley và được sửa bởi Victor Stinner; bpo-10783.)
Lớp
xml.etree.ElementTreehiện tăngxml.etree.ElementTree.ParseErrorkhi phân tích cú pháp không thành công. Trước đây nó đã đưa ra mộtxml.parsers.expat.ExpatError.Giá trị
str()mới, dài hơn trên các số float có thể phá vỡ các tài liệu dựa trên định dạng đầu ra cũ.Trong
subprocess.Popen, giá trị mặc định cho close_fds hiện làTruetrong Unix; trong Windows, đó làTruenếu ba luồng tiêu chuẩn được đặt thànhNone,Falsenếu không. Trước đây, close_fds luôn làFalsetheo mặc định, điều này tạo ra các lỗi khó giải quyết hoặc tình trạng tranh đua khi các bộ mô tả tệp mở sẽ rò rỉ vào tiến trình con.Hỗ trợ cho HTTP 0.9 cũ đã bị xóa khỏi
urllib.requestvàhttp.client. Hỗ trợ như vậy vẫn còn ở phía máy chủ (tronghttp.server).(Được đóng góp bởi Antoine Pitrou, bpo-10711.)
Ổ cắm SSL ở chế độ hết thời gian chờ hiện tăng
socket.timeoutkhi hết thời gian chờ, thay vìSSLErrorchung.(Được đóng góp bởi Antoine Pitrou, bpo-10272.)
Các hàm gây hiểu lầm
PyEval_AcquireLock()vàPyEval_ReleaseLock()đã chính thức không được dùng nữa. Thay vào đó, nên sử dụng các API nhận biết trạng thái luồng (chẳng hạn nhưPyEval_SaveThread()vàPyEval_RestoreThread()).Do các rủi ro bảo mật,
asyncore.handle_accept()không được dùng nữa và một chức năng mới,asyncore.handle_accepted(), đã được thêm vào để thay thế.(Được đóng góp bởi Giampaolo Rodola trong bpo-6706.)
Do việc triển khai GIL mới,
PyEval_InitThreads()không thể được gọi trướcPy_Initialize()nữa.