Hướng dẫn python essential reference 6th edition pdf - python cần thiết tài liệu tham khảo phiên bản thứ 6 pdf

Table of contents :
Table of Contents......Page 8
Introduction......Page 26
I: The Python Language......Page 28
Running Python......Page 30
Variables and Arithmetic Expressions......Page 32
Conditionals......Page 34
File Input and Output......Page 35
Strings......Page 36
Lists......Page 37
Tuples......Page 39
Sets......Page 40
Dictionaries......Page 41
Iteration and Looping......Page 42
Functions......Page 43
Generators......Page 44
Coroutines......Page 45
Objects and Classes......Page 46
Exceptions......Page 47
Modules......Page 48
Getting Help......Page 49
Line Structure and Indentation......Page 50
Numeric Literals......Page 51
String Literals......Page 52
Containers......Page 54
Decorators......Page 55
Source Code Encoding......Page 56
Object Identity and Type......Page 58
Reference Counting and Garbage Collection......Page 59
References and Copies......Page 60
First-Class Objects......Page 61
Built-in Types for Representing Data......Page 62
Built-in Types for Representing Program Structure......Page 72
Built-in Types for Interpreter Internals......Page 76
Object Behavior and Special Methods......Page 79
Operations on Numbers......Page 90
Operations on Sequences......Page 92
String Formatting......Page 95
Advanced String Formatting......Page 97
Operations on Dictionaries......Page 99
Augmented Assignment......Page 100
Conversion Functions......Page 101
Boolean Expressions and Truth Values......Page 102
Order of Evaluation......Page 103
Conditional Expressions......Page 104
Conditional Execution......Page 106
Loops and Iteration......Page 107
Exceptions......Page 109
Context Managers and the with Statement......Page 114
Assertions and __debug__......Page 116
Functions......Page 118
Parameter Passing and Return Values......Page 120
Scoping Rules......Page 121
Functions as Objects and Closures......Page 123
Decorators......Page 126
Generators and yield......Page 127
Coroutines and yield Expressions......Page 129
Using Generators and Coroutines......Page 131
List Comprehensions......Page 133
Generator Expressions......Page 134
Declarative Programming......Page 135
Recursion......Page 137
Documentation Strings......Page 138
Function Attributes......Page 139
eval[], exec[], and compile[]......Page 140
The class Statement......Page 142
Scoping Rules......Page 143
Inheritance......Page 144
Polymorphism Dynamic Binding and Duck Typing......Page 147
Static Methods and Class Methods......Page 148
Properties......Page 149
Descriptors......Page 151
Data Encapsulation and Private Attributes......Page 152
Object Memory Management......Page 153
Object Representation and Attribute Binding......Page 156
__slots__......Page 157
Operator Overloading......Page 158
Types and Class Membership Tests......Page 159
Abstract Base Classes......Page 161
Metaclasses......Page 163
Class Decorators......Page 166
Modules and the import Statement......Page 168
Importing Selected Symbols from a Module......Page 170
Execution as the Main Program......Page 171
Module Loading and Compilation......Page 172
Packages......Page 174
Distributing Python Programs and Libraries......Page 177
Installing Third-Party Libraries......Page 179
Reading Command-Line Options......Page 182
Files and File Objects......Page 183
Standard Input, Output, and Error......Page 186
The print Statement......Page 187
Variable Interpolation in Text Output......Page 188
Generating Output......Page 189
Unicode String Handling......Page 190
Unicode I/O......Page 192
Object Persistence and the pickle Module......Page 196
Interpreter Options and Environment......Page 198
Interactive Sessions......Page 200
Launching Python Applications......Page 201
Per-user Site Packages......Page 202
Enabling Future Features......Page 203
Program Termination......Page 204
Documentation Strings and the doctest Module......Page 206
Unit Testing and the unittest Module......Page 208
The Python Debugger and the pdb Module......Page 211
Program Profiling......Page 215
Tuning and Optimization......Page 216
II: The Python Library......Page 224
Built-in Functions and Types......Page 226
Built-In Exceptions......Page 237
Built-In Warnings......Page 241
future_builtins......Page 242
copy......Page 244
gc......Page 245
inspect......Page 247
pickle......Page 251
sys......Page 254
traceback......Page 260
types......Page 262
warnings......Page 263
weakref......Page 265
decimal......Page 268
fractions......Page 275
math......Page 276
numbers......Page 277
random......Page 279
abc......Page 282
array......Page 284
bisect......Page 286
collections......Page 287
contextlib......Page 292
functools......Page 293
heapq......Page 294
itertools......Page 295
operator......Page 298
codecs......Page 302
re......Page 306
string......Page 312
struct......Page 315
unicodedata......Page 318
Relational Database API Specification......Page 322
sqlite3 Module......Page 328
DBM-Style Database Modules......Page 335
shelve Module......Page 336
bz2......Page 338
filecmp......Page 339
fnmatch......Page 341
gzip......Page 342
shutil......Page 343
tarfile......Page 344
tempfile......Page 348
zipfile......Page 349
zlib......Page 353
commands......Page 356
configParser, Configparser......Page 357
datetime......Page 361
errno......Page 368
fcntl......Page 372
io......Page 374
logging......Page 380
mmap......Page 394
msvcrt......Page 397
optparse......Page 399
os......Page 403
os.path......Page 421
signal......Page 424
subprocess......Page 427
time......Page 430
winreg......Page 433
Basic Concepts......Page 438
Concurrent Programming and Python......Page 439
multiprocessing......Page 440
threading......Page 461
queue, Queue......Page 469
Coroutines and Microthreading......Page 471
Network Programming Basics......Page 474
asynchat......Page 477
asyncore......Page 480
select......Page 484
socket......Page 494
ssl......Page 511
SocketServer......Page 514
ftplib......Page 522
http Package......Page 525
smtplib......Page 538
urllib Package......Page 539
xmlrpc Package......Page 549
23 Web Programming......Page 556
cgi......Page 558
cgitb......Page 564
wsgiref......Page 565
webbrowser......Page 569
base64......Page 570
binascii......Page 572
csv......Page 573
email Package......Page 577
hmac......Page 584
HTMLParser......Page 586
json......Page 588
mimetypes......Page 591
quopri......Page 592
xml Package......Page 593
Python Services......Page 610
Operating System Modules......Page 611
Internationalization......Page 612
Miscellaneous......Page 613
III: Extending and Embedding......Page 614
Extension Modules......Page 616
Embedding the Python Interpreter......Page 633
ctypes......Page 637
Advanced Extending and Embedding......Page 644
Jython and IronPython......Page 645
Who Should Be Using Python 3?......Page 646
Set Literals......Page 647
Extended Iterable Unpacking......Page 648
Function Annotations......Page 649
Keyword-Only Arguments......Page 650
Chained Exceptions......Page 651
Advanced Metaclasses......Page 652
Text Versus Bytes......Page 654
print[] and exec[] Functions......Page 656
Use of Iterators and Views......Page 657
File Names, Arguments, and Environment Variables......Page 658
Porting Code to Python 2.6......Page 659
Using the 2to3 Tool......Page 660
A Practical Porting Strategy......Page 662
Participate......Page 663
Index......Page 664
A......Page 665
B......Page 668
C......Page 670
D......Page 677
E......Page 682
F......Page 686
G......Page 690
H......Page 695
I......Page 697
J......Page 701
L......Page 702
M......Page 705
N......Page 709
O......Page 711
P......Page 713
Q......Page 718
R......Page 719
S......Page 723
T......Page 732
U......Page 736
W......Page 739
X......Page 741
Z......Page 742

Xem trước trích dẫn

Python Tài liệu tham khảo thiết yếu

Phiên bản thứ tư

F

H lib

fl

B

d

ff

Nhà phát triển Thư viện Tài liệu tham khảo thiết yếu cho các chuyên gia lập trình

Sách thư viện nhà phát triển được thiết kế để cung cấp cho các lập trình viên thực hành các tài liệu tham khảo và hướng dẫn chất lượng cao, độc đáo về các ngôn ngữ và công nghệ lập trình mà họ sử dụng trong công việc hàng ngày của họ. Tất cả các cuốn sách trong thư viện nhà phát triển được viết bởi các nhà thực hành công nghệ chuyên gia, những người đặc biệt có kỹ năng tổ chức và trình bày thông tin theo cách mà hữu ích cho các lập trình viên khác. Các tiêu đề chính bao gồm một số cuốn sách hay nhất được hoan nghênh nhất trong lĩnh vực chủ đề của họ: phát triển web PHP và MySQL

Python Tài liệu tham khảo thiết yếu

Luke Welling & Laura Thomson ISBN 978-0-672-32916-6

David Beazley ISBN-13: 978-0-672-32862-6

Mysql

Lập trình trong Objective-C

Paul Dubois ISBN-13: 978-0-672-32938-8

Stephen G. Kochan ISBN-13: 978-0-321-56615-7

Phát triển kernel Linux

Postgresql

Robert Love ISBN-13: 978-0-672-32946-3

Korry Douglas ISBN-13: 978-0-672-33015-5

Sách thư viện nhà phát triển có sẵn tại hầu hết các nhà sách bán lẻ và trực tuyến, cũng như bằng cách đăng ký từ Safari Books Online tại Safari.informit.com

Thư viện nhà phát triển Informit.com/devl Library

F

H lib

fl

B

d

ff

Nhà phát triển Thư viện Tài liệu tham khảo thiết yếu cho các chuyên gia lập trình

Phiên bản thứ tư

Sách thư viện nhà phát triển được thiết kế để cung cấp cho các lập trình viên thực hành các tài liệu tham khảo và hướng dẫn chất lượng cao, độc đáo về các ngôn ngữ và công nghệ lập trình mà họ sử dụng trong công việc hàng ngày của họ. Tất cả các cuốn sách trong thư viện nhà phát triển được viết bởi các nhà thực hành công nghệ chuyên gia, những người đặc biệt có kỹ năng tổ chức và trình bày thông tin theo cách mà hữu ích cho các lập trình viên khác. Các tiêu đề chính bao gồm một số cuốn sách hay nhất được hoan nghênh nhất trong lĩnh vực chủ đề của họ: phát triển web PHP và MySQL

Python Tài liệu tham khảo thiết yếu

F

H lib

fl

B

d

ff

Nhà phát triển Thư viện Tài liệu tham khảo thiết yếu cho các chuyên gia lập trình

Sách thư viện nhà phát triển được thiết kế để cung cấp cho các lập trình viên thực hành các tài liệu tham khảo và hướng dẫn chất lượng cao, độc đáo về các ngôn ngữ và công nghệ lập trình mà họ sử dụng trong công việc hàng ngày của họ. Tất cả các cuốn sách trong thư viện nhà phát triển được viết bởi các nhà thực hành công nghệ chuyên gia, những người đặc biệt có kỹ năng tổ chức và trình bày thông tin theo cách mà hữu ích cho các lập trình viên khác. Các tiêu đề chính bao gồm một số cuốn sách hay nhất được hoan nghênh nhất trong lĩnh vực chủ đề của họ: phát triển web PHP và MySQL

Python Tài liệu tham khảo thiết yếu

Luke Welling & Laura Thomson ISBN 978-0-672-32916-6

David Beazley ISBN-13: 978-0-672-32862-6

Mysql

Lập trình trong Objective-C

Paul Dubois ISBN-13: 978-0-672-32938-8

Stephen G. Kochan ISBN-13: 978-0-321-56615-7

Phát triển kernel Linux

Postgresql

Robert Love ISBN-13: 978-0-672-32946-3

Korry Douglas ISBN-13: 978-0-672-33015-5

F

H lib

fl

B

d

ff

Nhà phát triển Thư viện Tài liệu tham khảo thiết yếu cho các chuyên gia lập trình

F

H lib

fl

B

d

ff

Nhà phát triển Thư viện Tài liệu tham khảo thiết yếu cho các chuyên gia lập trình

1

Sách thư viện nhà phát triển được thiết kế để cung cấp cho các lập trình viên thực hành các tài liệu tham khảo và hướng dẫn chất lượng cao, độc đáo về các ngôn ngữ và công nghệ lập trình mà họ sử dụng trong công việc hàng ngày của họ. Tất cả các cuốn sách trong thư viện nhà phát triển được viết bởi các nhà thực hành công nghệ chuyên gia, những người đặc biệt có kỹ năng tổ chức và trình bày thông tin theo cách mà hữu ích cho các lập trình viên khác. Các tiêu đề chính bao gồm một số cuốn sách hay nhất được hoan nghênh nhất trong lĩnh vực chủ đề của họ: phát triển web PHP và MySQL

5

Python Tài liệu tham khảo thiết yếu

25

33

Luke Welling & Laura Thomson ISBN 978-0-672-32916-6

65

David Beazley ISBN-13: 978-0-672-32862-6

81

Mysql

93

Lập trình trong Objective-C

117

143

157

Paul Dubois ISBN-13: 978-0-672-32938-8

173

Stephen G. Kochan ISBN-13: 978-0-321-56615-7

181

Phát triển kernel Linux

201

13 Dịch vụ thời gian chạy Python 14 Toán học

219

243

15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã 16 Chuỗi và xử lý văn bản

277

17 Truy cập cơ sở dữ liệu Python

297

18 tệp và thư mục xử lý

313

19 Dịch vụ hệ điều hành

331

20 chủ đề và đồng thời

413

21 Lập trình mạng và ổ cắm 22 Lập trình ứng dụng Internet 23 Lập trình web

257

449 497

531

24 Xử lý dữ liệu Internet và mã hóa 25 Mô -đun thư viện linh tinh

545

585

Phần III: Mở rộng và nhúng 26 phần mở rộng và nhúng Python

Phụ lục: Chỉ số Python 3

591

621

639

F

H lib

fl

B

d

ff

Mục lục Giới thiệu

1

I: Ngôn ngữ Python 1 Giới thiệu hướng dẫn chạy Python 5

5

Các biến số và biểu thức số học điều kiện

9

Danh sách các chuỗi đầu vào và đầu ra của tập tin

10

11 12

Bộ bộ đếm

7

14 15

Từ điển

16

Chức năng lặp và vòng lặp

17

18

Máy phát điện

19

Coroutines

20

Đối tượng và lớp Các mô -đun ngoại lệ

21

22 23

Tìm sự giúp đỡ

24

2 quy ước từ vựng và cú pháp 25 Cấu trúc dòng và thụt lề 25 định danh và các từ dành riêng.

26

26 27

29

Người vận hành, phân định và các biểu tượng đặc biệt Tài liệu Chuỗi trang trí

30

30

30

Mã mã nguồn

3 loại và thuật ngữ đối tượng 33

31

33

Nhận dạng đối tượng và loại

33

Đếm tài liệu tham khảo và thu thập rác tham chiếu và bản sao

34

35

F

H lib

fl

B

d

ff

Mục lục Giới thiệu

I: Ngôn ngữ Python 1 Giới thiệu hướng dẫn chạy Python 5

Các biến số và biểu thức số học điều kiện

36

Danh sách các chuỗi đầu vào và đầu ra của tập tin

11 12

38

Bộ bộ đếm

38

14 15

39

Từ điển

37

44

46

Chức năng lặp và vòng lặp

Máy phát điện

47

Coroutines

50

50

Đối tượng và lớp Các mô -đun ngoại lệ

22 23

52

Tìm sự giúp đỡ

52

2 quy ước từ vựng và cú pháp 25 Cấu trúc dòng và thụt lề 25 định danh và các từ dành riêng.

53

26 27

51

51

Người vận hành, phân định và các biểu tượng đặc biệt Tài liệu Chuỗi trang trí

53

Mã mã nguồn

54

54

55

3 loại và thuật ngữ đối tượng 33

56

57

Nhận dạng đối tượng và loại

57

Đếm tài liệu tham khảo và thu thập rác tham chiếu và bản sao

47

viii

59

Nội dung

60

62

Đối tượng hạng nhất

Các loại tích hợp để đại diện cho dữ liệu

Không có loại

67

70

Các loại số

Các loại trình tự

75

Các loại ánh xạ các loại đặt

75

F

H lib

fl

B

d

ff

I: Ngôn ngữ Python 1 Giới thiệu hướng dẫn chạy Python 5

Các biến số và biểu thức số học điều kiện

76

Danh sách các chuỗi đầu vào và đầu ra của tập tin

76

76

11 12

77

78

78

Bộ bộ đếm

79

14 15

81

81

Từ điển

82

84

Chức năng lặp và vòng lặp

86

Máy phát điện

88

Coroutines

Đối tượng và lớp Các mô -đun ngoại lệ

93

95

96

22 23

98

101

Tìm sự giúp đỡ

102

2 quy ước từ vựng và cú pháp 25 Cấu trúc dòng và thụt lề 25 định danh và các từ dành riêng.

104

26 27

106

Người vận hành, phân định và các biểu tượng đặc biệt Tài liệu Chuỗi trang trí

108

Mã mã nguồn

109

3 loại và thuật ngữ đối tượng 33

89

91

Nhận dạng đối tượng và loại

Đếm tài liệu tham khảo và thu thập rác tham chiếu và bản sao

110

112

112

viii

113

114

Nội dung

115

Đối tượng hạng nhất

Các loại tích hợp để đại diện cho dữ liệu

117

Không có loại

119

F

H lib

fl

B

d

ff

Mục lục Giới thiệu

I: Ngôn ngữ Python 1 Giới thiệu hướng dẫn chạy Python 5

Các biến số và biểu thức số học điều kiện

122

123

124

Danh sách các chuỗi đầu vào và đầu ra của tập tin

126

11 12

127

128

Bộ bộ đếm

14 15

132

Từ điển

133

Chức năng lặp và vòng lặp

131

134

136

138

Máy phát điện

141

Coroutines

146

147

Đối tượng và lớp Các mô -đun ngoại lệ

147

22 23

149

Tìm sự giúp đỡ

149

2 quy ước từ vựng và cú pháp 25 Cấu trúc dòng và thụt lề 25 định danh và các từ dành riêng.

26 27

158

Người vận hành, phân định và các biểu tượng đặc biệt Tài liệu Chuỗi trang trí

158

157

Mã mã nguồn

161

3 loại và thuật ngữ đối tượng 33

Nhận dạng đối tượng và loại

152

154

Đếm tài liệu tham khảo và thu thập rác tham chiếu và bản sao

163

164

viii

145

165

167

Mã hóa dữ liệu Unicode

168

Thuộc tính ký tự Unicode

170

Sự tồn tại đối tượng và mô -đun Pickle

171

F

H lib

fl

B

d

ff

Nội dung

10 Môi trường thực thi 173 Tùy chọn phiên dịch và Phiên tương tác môi trường

XI

173

175

Khởi chạy các tệp cấu hình trang web của ứng dụng Python

177

Gói trang web của người dùng

177

Cho phép chấm dứt chương trình tính năng trong tương lai

176

178

179

11 Kiểm tra, gỡ lỗi, lập hồ sơ và điều chỉnh 181 chuỗi tài liệu và mô -đun tài liệu thử nghiệm đơn vị 181 và mô -đun Unittest

183

Trình gỡ lỗi Python và mô -đun PDB

Lệnh gỡ lỗi

Gỡ lỗi từ dòng lệnh Định cấu hình chương trình trình gỡ lỗi định hình 190 điều chỉnh và tối ưu hóa

191

Tạo phép đo bộ nhớ

192

194

II: Thư viện Python

199

12 Chức năng và ngoại lệ tích hợp các chức năng và loại ngoại lệ tích hợp 201

201

212

Các lớp cơ sở ngoại lệ Các trường hợp ngoại lệ

212

212

Các lớp ngoại lệ được xác định trước Cảnh báo tích hợp 216

213

217

13 Dịch vụ thời gian chạy Python ATEXIT 219 Bản sao

191

193

Chiến lược điều chỉnh

Tương lai_builtins

189

190

Làm cho các phép đo thời gian tháo gỡ

186

187

219

219

Ghi chú

220

F

H lib

fl

B

d

ff

Nội dung

10 Môi trường thực thi 173 Tùy chọn phiên dịch và Phiên tương tác môi trường

XI

220

Khởi chạy các tệp cấu hình trang web của ứng dụng Python

226

Gói trang web của người dùng

226

226

Cho phép chấm dứt chương trình tính năng trong tương lai

11 Kiểm tra, gỡ lỗi, lập hồ sơ và điều chỉnh 181 chuỗi tài liệu và mô -đun tài liệu thử nghiệm đơn vị 181 và mô -đun Unittest

Trình gỡ lỗi Python và mô -đun PDB

229

Lệnh gỡ lỗi

Gỡ lỗi từ dòng lệnh Định cấu hình chương trình trình gỡ lỗi định hình 190 điều chỉnh và tối ưu hóa

237

Tạo phép đo bộ nhớ

II: Thư viện Python

12 Chức năng và ngoại lệ tích hợp các chức năng và loại ngoại lệ tích hợp 201

Các lớp cơ sở ngoại lệ Các trường hợp ngoại lệ

Các lớp ngoại lệ được xác định trước Cảnh báo tích hợp 216

13 Dịch vụ thời gian chạy Python ATEXIT 219 Bản sao

Chiến lược điều chỉnh

244

Tương lai_builtins

244

Làm cho các phép đo thời gian tháo gỡ

247

248

Ghi chú

251

Ghi chú

252

XII

252

GC

254

254

Ghi chú 222 Kiểm tra 222 Thống chế

254

Ghi chú Pickle

255

256

F

H lib

fl

B

d

ff

Nội dung

10 Môi trường thực thi 173 Tùy chọn phiên dịch và Phiên tương tác môi trường

XI

257

259

Khởi chạy các tệp cấu hình trang web của ứng dụng Python

262

Gói trang web của người dùng

262

263

Cho phép chấm dứt chương trình tính năng trong tương lai

265

11 Kiểm tra, gỡ lỗi, lập hồ sơ và điều chỉnh 181 chuỗi tài liệu và mô -đun tài liệu thử nghiệm đơn vị 181 và mô -đun Unittest

268

269

Trình gỡ lỗi Python và mô -đun PDB

270

Lệnh gỡ lỗi

Gỡ lỗi từ dòng lệnh Định cấu hình chương trình trình gỡ lỗi định hình 190 điều chỉnh và tối ưu hóa

Tạo phép đo bộ nhớ

277

II: Thư viện Python

279

12 Chức năng và ngoại lệ tích hợp các chức năng và loại ngoại lệ tích hợp 201

Các lớp cơ sở ngoại lệ Các trường hợp ngoại lệ

277

Các lớp ngoại lệ được xác định trước Cảnh báo tích hợp 216

280

13 Dịch vụ thời gian chạy Python ATEXIT 219 Bản sao

281

283

Chiến lược điều chỉnh

284

285

286

Tương lai_builtins

287

Làm cho các phép đo thời gian tháo gỡ

Ghi chú

XII

GC

290

291

F

H lib

fl

B

d

ff

Nội dung

Ghi chú 222 Kiểm tra 222 Thống chế

Ghi chú Pickle

291

Ghi chú 229 229

sys

Biến

297

297

298

Chức năng 233 235

300

301

Các loại TraceBack

302

Ghi chú cảnh báo

302

237 238

303

Ghi chú yếu

305

239 240

311

Ví dụ ghi chú

313

314

242 242

316

14 Toán học 243 thập phân 243 đối tượng thập phân

316

Đối tượng bối cảnh

Các chức năng và các ví dụ về hằng số

317

Ghi chú 249 Phân số 250 Toán học

319

số

322

Ghi chú 253 ngẫu nhiên 254 Hạt giống và khởi tạo số nguyên ngẫu nhiên

Trình tự ngẫu nhiên

F

H lib

fl

B

d

ff

Nội dung

Ghi chú phân phối ngẫu nhiên có giá trị thực

15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã ABC 257 mảng

331

332

XIII

332

Ghi chú 261 Bisect 261 Bộ sưu tập

332

334

Ghi chú

336

XII

336

GC

336

Ghi chú 222 Kiểm tra 222 Thống chế

338

Ghi chú Pickle

339

Ghi chú 229 229

340

sys

341

342

Biến

343

Chức năng 233 235

Các loại TraceBack

344

Ghi chú cảnh báo

237 238

Ghi chú yếu

346

349

350

239 240

351

353

Ví dụ ghi chú

354

242 242

354

14 Toán học 243 thập phân 243 đối tượng thập phân

Đối tượng bối cảnh

355

Các chức năng và các ví dụ về hằng số

355

Ghi chú 249 Phân số 250 Toán học

số

364

Ghi chú 253 ngẫu nhiên 254 Hạt giống và khởi tạo số nguyên ngẫu nhiên

366

Trình tự ngẫu nhiên

366

369

369

F

H lib

fl

B

d

ff

Ghi chú phân phối ngẫu nhiên có giá trị thực

Nội dung

15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã ABC 257 mảng

369

XIII

374

Ghi chú 261 Bisect 261 Bộ sưu tập

Deque và DefaultDict có tên Tuples

Các lớp cơ sở trừu tượng 267

379

bối cảnh functools Heapq

390

itertools

395

Ví dụ 273 273

381

386

396

nhà điều hành

399

16 chuỗi và xử lý văn bản codecs 277

401

Giao diện Codec cấp thấp giao diện các hàm liên quan đến I/O Hằng số hữu ích

404

Mã hóa tiêu chuẩn Re

Ghi chú 281

279 280

Hàm cú pháp mẫu

Ghi chú

411

XII

413

GC

Ghi chú 222 Kiểm tra 222 Thống chế

414

415

415

Ghi chú Pickle

417

424

Ghi chú 229 229

426

428

433

sys

434

Biến

435

luồng

Đối tượng của các đối tượng đối tượng

436 437 f

H lib

fl

B

d

ff

Nội dung

Khóa đối tượng rlock

xvii

438

438

Semaphore và các sự kiện Semaphore bị ràng buộc

439

440

Biến điều kiện

441

Làm việc với khóa

442

Chấm dứt chủ đề và các chức năng tiện ích đình chỉ

443

443

Lập trình khóa thông dịch toàn cầu với Chủ đề 444

444 444

Hàng đợi, hàng đợi

Ví dụ về hàng đợi với các chủ đề 445 Coroutines và Microthreading 446 21 Lập trình mạng và ổ đĩa Lập trình mạng cơ bản 449 Asynchat

452

không đồng bộ

455

449

Ví dụ 457 Chọn 459 tính năng mô -đun nâng cao

460

Ví dụ I/O không đồng bộ nâng cao

460

Khi nào nên xem xét ổ cắm mạng không đồng bộ 469 địa chỉ các loại ổ cắm về các chức năng giải quyết các chức năng

470

470 471

473

Ví dụ ngoại lệ

467

485 485

Ghi chú 486 SSL 486 Ví dụ

489

Máy chủ lưu trữ

489

Máy chủ xử lý

490 491

Xác định máy chủ tùy chỉnh

492

Tùy chỉnh máy chủ ứng dụng

494

F

H lib

fl

B

d

ff

Nội dung

Khóa đối tượng rlock

xvii

497

Semaphore và các sự kiện Semaphore bị ràng buộc

Biến điều kiện

Làm việc với khóa

502

Chấm dứt chủ đề và các chức năng tiện ích đình chỉ

511

Lập trình khóa thông dịch toàn cầu với Chủ đề 444

513

444 444

Hàng đợi, hàng đợi

Ví dụ về hàng đợi với các chủ đề 445 Coroutines và Microthreading 446 21 Lập trình mạng và ổ đĩa Lập trình mạng cơ bản 449 Asynchat

515

520

không đồng bộ

Ví dụ 457 Chọn 459 tính năng mô -đun nâng cao

523

Ví dụ I/O không đồng bộ nâng cao

524

Khi nào nên xem xét ổ cắm mạng không đồng bộ 469 địa chỉ các loại ổ cắm về các chức năng giải quyết các chức năng

531

470 471

537

Ví dụ ngoại lệ

485 485

Ghi chú 486 SSL 486 Ví dụ

540

Máy chủ lưu trữ

540

542

Máy chủ xử lý

490 491

545

547

548

Xác định máy chủ tùy chỉnh

551

Tùy chỉnh máy chủ ứng dụng

551

F

H lib

fl

B

d

ff

Nội dung

Khóa đối tượng rlock

xvii

552

Semaphore và các sự kiện Semaphore bị ràng buộc

552

Biến điều kiện

555

Làm việc với khóa

559

Tùy chỉnh máy chủ ứng dụng

F

xviii

22 Lập trình ứng dụng Internet FTPLIB 497 Ví dụ

562

500 500

Gói HTTP

566

567

http.client [httplib]

568

http.server [baseHttpserver, cgihttpserver, simpleHttpserver] 506 http.cookies [cookie]

http.cookiejar [cookielib] smtplib 513 ví dụ

569

514 514

580

Gói Urllib

583

Urllib.Request [Urllib2] Urllib.Response Urllib.Parse Urllib.error

586

520 523

585

586

587

Urllib.robotparser [Robotparser]

587

Ghi chú 524 XMLRPC Gói 524 XMLRPC.Client [XMLRPCLIB]

588

XMLRPC.Server [SimplexMLRPCServer, DOCXMLRPCServer] 527 23 Lập trình web CGI 533

589

Lời khuyên lập trình CGI

591

Ghi chú 538 539

593

CGITB

595

WSGIREF

596

Đặc tả WSGI Gói WSGiref 544

597

trình duyệt web

602

F

H lib

fl

B

d

ff

xviii

Nội dung

22 Lập trình ứng dụng Internet FTPLIB 497 Ví dụ

605

500 500

604

607

607

Gói HTTP

http.client [httplib]

608

http.server [baseHttpserver, cgihttpserver, simpleHttpserver] 506 http.cookies [cookie]

608

608

http.cookiejar [cookielib] smtplib 513 ví dụ

610

514 514

611

612

612

613

Gói Urllib

615

Urllib.Request [Urllib2] Urllib.Response Urllib.Parse Urllib.error

616

617

520 523

619

620

Urllib.robotparser [Robotparser]

621

622

Ghi chú 524 XMLRPC Gói 524 XMLRPC.Client [XMLRPCLIB]

608

622

622

XMLRPC.Server [SimplexMLRPCServer, DOCXMLRPCServer] 527 23 Lập trình web CGI 533

624

Lời khuyên lập trình CGI

625

Ghi chú 538 539

626

CGITB

626

WSGIREF

627

Đặc tả WSGI Gói WSGiref 544

623

624

trình duyệt web

24 Cơ sở xử lý và mã hóa dữ liệu Internet64 545 Binascii CSV

623

627

Phương ngữ

F

H lib

fl

B

d

ff

Nội dung

xviii

631

632

22 Lập trình ứng dụng Internet FTPLIB 497 Ví dụ

500 500

633

633

Gói HTTP

633

http.client [httplib]

633

634

http.server [baseHttpserver, cgihttpserver, simpleHttpserver] 506 http.cookies [cookie]

http.cookiejar [cookielib] smtplib 513 ví dụ

514 514

634

635

635

Gói Urllib

637

Urllib.Request [Urllib2] Urllib.Response Urllib.Parse Urllib.error

638

638

520 523

F

H lib

fl

B

d

ff

xviii

About the Technical Editor Noah Gift is the co-author of Python For UNIX and Linux System Administration [O’Reilly] and is also working on Google App Engine In Action [Manning]. He is an author, speaker, consultant, and community leader, writing for publications such as IBM developerWorks, Red Hat Magazine, O’Reilly, and MacTech. His consulting company’s website is //www.giftcs.com, and much of his writing can be found at //noahgift.com.You can also follow Noah on Twitter. Noah has a master’s degree in CIS from Cal State, Los Angeles, a B.S. in nutritional science from Cal Poly San Luis Obispo, is an Apple and LPI-certified SysAdmin, and has worked at companies such as Caltech, Disney Feature Animation, Sony Imageworks, and Turner Studios. He is currently working at Weta Digital in New Zealand. In his free time he enjoys spending time with his wife Leah and their son Liam, composing for the piano, running marathons, and exercising religiously.

F

h Lib

fL

B

d

ff

Acknowledgments This book would not be possible without the support of many people. First and foremost, I’d like to thank Noah Gift for jumping into the project and providing his amazing feedback on the fourth edition. Kurt Grandis also provided useful comments for many chapters. I’d also like to acknowledge past technical reviewers Timothy Boronczyk, Paul DuBois, Mats Wichmann, David Ascher, and Tim Bell for their valuable comments and advice that made earlier editions a success. Guido van Rossum, Jeremy Hylton, Fred Drake, Roger Masse, and Barry Warsaw also provided tremendous assistance with the first edition while hosting me for a few weeks back in the hot summer of 1999. Last, but not least, this book would not be possible without all of the feedback I received from readers.There are far too many people to list individually, but I have done my best to incorporate your suggestions for making the book even better. I’d also like to thank all the folks at Addison-Wesley and Pearson Education for their continued commitment to the project and assistance. Mark Taber, Michael Thurston, Seth Kerney, and Lisa Thibault all helped out to get this edition out the door in good shape. A special thanks is in order for Robin Drake, whose tremendous effort in editing previous editions made the third edition possible. Finally, I’d like to acknowledge my amazing wife and partner Paula Kamen for all of her encouragement, diabolical humor, and love.

F

h Lib

fL

B

d

ff

We Want to Hear from You! As the reader of this book, you are our most important critic and commentator.We value your opinion and want to know what we’re doing right, what we could do better, what areas you’d like to see us publish in, and any other words of wisdom you’re willing to pass our way. You can email or write me directly to let me know what you did or didn’t like about this book—as well as what we can do to make our books stronger. Please note that I cannot help you with technical problems related to the topic of this book, and that due to the high volume of mail I receive, I might not be able to reply to every message. When you write, please be sure to include this book’s title and author as well as your name and phone or email address. I will carefully review your comments and share them with the author and editors who worked on the book. Email: Mail:

[email protected] Mark Taber Associate Publisher Pearson Education 800 East 96th Street Indianapolis, IN 46240 USA

Reader Services Visit our website and register this book at informit.com/register for convenient access to any updates, downloads, or errata that might be available for this book.

F

h Lib

fL

B

d

ff

Introduction T

his book is intended to be a concise reference to the Python programming language. Although an experienced programmer will probably be able to learn Python from this book, it’s not intended to be an extended tutorial or a treatise on how to program. Rather, the goal is to present the core Python language, and the most essential parts of the Python library in a manner that’s accurate and concise.This book assumes that the reader has prior programming experience with Python or another language such as C or Java. In addition, a general familiarity with systems programming topics [for example, basic operating system concepts and network programming] may be useful in understanding certain parts of the library reference. Python is freely available for download at //www.python.org.Versions are available for almost every operating system, including UNIX,Windows, and Macintosh. In addition, the Python website includes links to documentation, how-to guides, and a wide assortment of third-party software. This edition of Python Essential Reference comes at a pivotal time in Python’s evolution. Python 2.6 and Python 3.0 are being released almost simultaneously.Yet, Python 3 is a release that breaks backwards compatibility with prior Python versions. As an author and programmer, I’m faced with a dilemma: do I simply jump forward to Python 3.0 or do I build upon the Python 2.x releases that are more familiar to most programmers? Years ago, as a C programmer I used to treat certain books as the ultimate authority on what programming language features should be used. For example, if you were using something that wasn’t documented in the K&R book, it probably wasn’t going to be portable and should be approached with caution.This approach served me very well as a programmer and it’s the approach I have decided to take in this edition of the Essential Reference. Namely, I have chosen to omit features of Python 2 that have been removed from Python 3. Likewise, I don’t focus on features of Python 3 that have not been back-ported [although such features are still covered in an appendix]. As a result, I hope this book can be a useful companion for Python programmers, regardless of what Python version is being used. The fourth edition of Python Essential Reference also includes some of the most exciting changes since its initial publication nearly ten years ago. Much of Python’s development throughout the last few years has focused on new programming language features—especially related to functional and meta programming. As a result, the chapters on functions and object-oriented programming have been greatly expanded to cover topics such as generators, iterators, coroutines, decorators, and metaclasses.The library chapters have been updated to focus on more modern modules. Examples and code fragments have also been updated throughout the book. I think most programmers will be quite pleased with the expanded coverage. Finally, it should be noted that Python already includes thousands of pages of useful documentation.The contents of this book are largely based on that documentation, but with a number of key differences. First, this reference presents information in a much more compact form, with different examples and alternative descriptions of many topics. Second, a significant number of topics in the library reference have been expanded

F

H lib

fl

B

d

ff

2

Giới thiệu

Để bao gồm các tài liệu tham khảo bên ngoài. Điều này đặc biệt đúng đối với các mô-đun mạng và hệ thống cấp thấp trong đó sử dụng hiệu quả một mô-đun thường dựa vào vô số các tùy chọn được liệt kê trong hướng dẫn và tham chiếu bên ngoài. Ngoài ra, để tạo ra một tài liệu tham khảo súc tích hơn, một số mô -đun thư viện không phản đối và tương đối mơ hồ đã bị bỏ qua. Khi viết cuốn sách này, mục tiêu của tôi là sản xuất một tài liệu tham khảo chứa hầu như mọi thứ tôi cần để sử dụng Python và bộ sưu tập lớn các mô -đun. Mặc dù điều này không có nghĩa là giới thiệu nhẹ nhàng về ngôn ngữ Python, tôi hy vọng rằng bạn tìm thấy nội dung của cuốn sách này là một bổ sung hữu ích cho thư viện tham khảo chương trình của bạn trong nhiều năm tới. Tôi hoan nghênh những góp ý của bạn. David Beazley Chicago, Illinois tháng 6 năm 2009

F

H lib

fl

B

d

ff

Giới thiệu

1

Để bao gồm các tài liệu tham khảo bên ngoài. Điều này đặc biệt đúng đối với các mô-đun mạng và hệ thống cấp thấp trong đó sử dụng hiệu quả một mô-đun thường dựa vào vô số các tùy chọn được liệt kê trong hướng dẫn và tham chiếu bên ngoài. Ngoài ra, để tạo ra một tài liệu tham khảo súc tích hơn, một số mô -đun thư viện không phản đối và tương đối mơ hồ đã bị bỏ qua. Khi viết cuốn sách này, mục tiêu của tôi là sản xuất một tài liệu tham khảo chứa hầu như mọi thứ tôi cần để sử dụng Python và bộ sưu tập lớn các mô -đun. Mặc dù điều này không có nghĩa là giới thiệu nhẹ nhàng về ngôn ngữ Python, tôi hy vọng rằng bạn tìm thấy nội dung của cuốn sách này là một bổ sung hữu ích cho thư viện tham khảo chương trình của bạn trong nhiều năm tới. Tôi hoan nghênh những góp ý của bạn. David Beazley Chicago, Illinois tháng 6 năm 2009

2

Tôi ngôn ngữ Python

3

Giới thiệu hướng dẫn

4

Các quy ước và cú pháp từ vựng

5

Các loại và đối tượng

6

Người vận hành và biểu thức

7

Cấu trúc chương trình và luồng điều khiển

8

Chức năng và lập trình chức năng

9

Các lớp và lập trình hướng đối tượng

10

Các mô -đun, gói và phân phối

11

Đầu vào và đầu ra

F

H lib

fl

B

d

ff

Giới thiệu

F

H lib

fl

B

d

ff

Giới thiệu

Để bao gồm các tài liệu tham khảo bên ngoài. Điều này đặc biệt đúng đối với các mô-đun mạng và hệ thống cấp thấp trong đó sử dụng hiệu quả một mô-đun thường dựa vào vô số các tùy chọn được liệt kê trong hướng dẫn và tham chiếu bên ngoài. Ngoài ra, để tạo ra một tài liệu tham khảo súc tích hơn, một số mô -đun thư viện không phản đối và tương đối mơ hồ đã bị bỏ qua. Khi viết cuốn sách này, mục tiêu của tôi là sản xuất một tài liệu tham khảo chứa hầu như mọi thứ tôi cần để sử dụng Python và bộ sưu tập lớn các mô -đun. Mặc dù điều này không có nghĩa là giới thiệu nhẹ nhàng về ngôn ngữ Python, tôi hy vọng rằng bạn tìm thấy nội dung của cuốn sách này là một bổ sung hữu ích cho thư viện tham khảo chương trình của bạn trong nhiều năm tới. Tôi hoan nghênh những góp ý của bạn. David Beazley Chicago, Illinois tháng 6 năm 2009

Tôi ngôn ngữ Python

F

H lib

fl

B

d

ff

Giới thiệu

6

Để bao gồm các tài liệu tham khảo bên ngoài. Điều này đặc biệt đúng đối với các mô-đun mạng và hệ thống cấp thấp trong đó sử dụng hiệu quả một mô-đun thường dựa vào vô số các tùy chọn được liệt kê trong hướng dẫn và tham chiếu bên ngoài. Ngoài ra, để tạo ra một tài liệu tham khảo súc tích hơn, một số mô -đun thư viện không phản đối và tương đối mơ hồ đã bị bỏ qua. Khi viết cuốn sách này, mục tiêu của tôi là sản xuất một tài liệu tham khảo chứa hầu như mọi thứ tôi cần để sử dụng Python và bộ sưu tập lớn các mô -đun. Mặc dù điều này không có nghĩa là giới thiệu nhẹ nhàng về ngôn ngữ Python, tôi hy vọng rằng bạn tìm thấy nội dung của cuốn sách này là một bổ sung hữu ích cho thư viện tham khảo chương trình của bạn trong nhiều năm tới. Tôi hoan nghênh những góp ý của bạn. David Beazley Chicago, Illinois tháng 6 năm 2009

Tôi ngôn ngữ Python

Giới thiệu hướng dẫn

Các quy ước và cú pháp từ vựng

Các loại và đối tượng

Các tệp nguồn Python là các tệp văn bản thông thường và thường có hậu tố .py. Ký tự # biểu thị một nhận xét mở rộng đến cuối dòng. Để thực thi tệp Helloworld.py, bạn cung cấp tên tệp cho trình thông dịch như sau: % Python HelloWorld.py Hello World %

Trên Windows, các chương trình Python có thể được bắt đầu bằng cách nhấp đúp vào tệp .py hoặc nhập tên của chương trình vào lệnh Run trên menu Windows Start. Điều này khởi chạy trình thông dịch và chạy chương trình trong cửa sổ bảng điều khiển. Tuy nhiên, hãy lưu ý rằng cửa sổ bảng điều khiển sẽ biến mất ngay sau khi chương trình hoàn thành việc thực hiện [thường trước khi bạn có thể đọc đầu ra của nó]. Để gỡ lỗi, tốt hơn là chạy chương trình trong một công cụ phát triển Python như nhàn rỗi. Trên Unix, bạn có thể sử dụng #! Trên dòng đầu tiên của chương trình, như thế này: #!/usr/bin/env Python in "Hello World"

F

H lib

fl

B

d

ff

Các biến và biểu thức số học

7

Trình thông dịch chạy các câu lệnh cho đến khi nó đi đến cuối tệp đầu vào. Nếu nó chạy tương tác, bạn có thể thoát khỏi trình thông dịch bằng cách nhập ký tự EOF [cuối tệp] hoặc bằng cách chọn thoát khỏi menu kéo xuống của một IDE Python. Trên Unix, EOF là Ctrl+D; Trên Windows, nó CTRL+Z. Một chương trình có thể yêu cầu thoát bằng cách tăng ngoại lệ hệ thống. >>> Nâng cao hệ thống

Các biến và biểu thức số học Chương trình trong liệt kê 1.1 cho thấy việc sử dụng các biến và biểu thức bằng cách thực hiện tính toán lợi ích hợp chất đơn giản. Liệt kê 1.1

Tính toán hợp chất đơn giản

Hiệu trưởng = 1000 # tỷ lệ = 0,05 # numyears = 5 # năm = 1 trong khi năm 8]: In "Tôi sẽ lấy nó!"

Lưu ý Viết các trường hợp thử nghiệm phức tạp thường dẫn đến các tuyên bố liên quan đến một dòng mã dài khó chịu. Để cải thiện khả năng đọc, bạn có thể tiếp tục bất kỳ câu lệnh nào cho dòng tiếp theo bằng cách sử dụng dấu gạch chéo ngược [\] ở cuối dòng như được hiển thị. Nếu bạn làm điều này, các quy tắc thụt bình thường don don áp dụng cho dòng tiếp theo, vì vậy bạn có thể tự do định dạng các dòng tiếp tục như bạn muốn.

Python không có công tắc đặc biệt hoặc câu lệnh CASE để kiểm tra các giá trị. Để xử lý các trường hợp nhiều thử nghiệm, hãy sử dụng câu lệnh ELIF, như thế này: Nếu hậu tố == ". .

Để biểu thị các giá trị sự thật, hãy sử dụng các giá trị boolean đúng và sai. Ở đây, một ví dụ: nếu 'spam' trong s: has_spam = true other: has_spam = false

All relational operators such as < and > return True or False as results.The in operator used in this example is commonly used to check whether a value is contained inside of another object such as a string, list, or dictionary. It also returns True or False, so the preceding example could be shortened to this: has_spam = 'spam' in s

F

H lib

fl

B

d

ff

10

Các biến và biểu thức số học

Trình thông dịch chạy các câu lệnh cho đến khi nó đi đến cuối tệp đầu vào. Nếu nó chạy tương tác, bạn có thể thoát khỏi trình thông dịch bằng cách nhập ký tự EOF [cuối tệp] hoặc bằng cách chọn thoát khỏi menu kéo xuống của một IDE Python. Trên Unix, EOF là Ctrl+D; Trên Windows, nó CTRL+Z. Một chương trình có thể yêu cầu thoát bằng cách tăng ngoại lệ hệ thống. >>> Nâng cao hệ thống

Các biến và biểu thức số học Chương trình trong liệt kê 1.1 cho thấy việc sử dụng các biến và biểu thức bằng cách thực hiện tính toán lợi ích hợp chất đơn giản. Liệt kê 1.1

Tính toán hợp chất đơn giản

Hiệu trưởng = 1000 # tỷ lệ = 0,05 # numyears = 5 # năm = 1 trong khi năm 8]: In "Tôi sẽ lấy nó!"

Lưu ý Viết các trường hợp thử nghiệm phức tạp thường dẫn đến các tuyên bố liên quan đến một dòng mã dài khó chịu. Để cải thiện khả năng đọc, bạn có thể tiếp tục bất kỳ câu lệnh nào cho dòng tiếp theo bằng cách sử dụng dấu gạch chéo ngược [\] ở cuối dòng như được hiển thị. Nếu bạn làm điều này, các quy tắc thụt bình thường don don áp dụng cho dòng tiếp theo, vì vậy bạn có thể tự do định dạng các dòng tiếp tục như bạn muốn.

Python không có công tắc đặc biệt hoặc câu lệnh CASE để kiểm tra các giá trị. Để xử lý các trường hợp nhiều thử nghiệm, hãy sử dụng câu lệnh ELIF, như thế này: Nếu hậu tố == ". .

Để biểu thị các giá trị sự thật, hãy sử dụng các giá trị boolean đúng và sai. Ở đây, một ví dụ: nếu 'spam' trong s: has_spam = true other: has_spam = false

Although these examples have worked with files, the same techniques apply to the standard output and input streams of the interpreter. For example, if you wanted to read user input interactively, you can read from the file sys.stdin. If you want to write data to the screen, you can write to sys.stdout, which is the same file used to output data produced by the print statement. For example: import sys sys.stdout.write["Enter your name :"] name = sys.stdin.readline[]

In Python 2, this code can also be shortened to the following: name = raw_input["Enter your name :"]

F

h Lib

fL

B

d

ff

Strings

11

In Python 3, the raw_input[] function is called input[], but it works in exactly the same manner.

Strings To create string literals, enclose them in single, double, or triple quotes as follows: a = "Hello World" b = 'Python is groovy' c = """Computer says 'No'"""

The same type of quote used to start a string must be used to terminate it.Triplequoted strings capture all the text that appears prior to the terminating triple quote, as opposed to single- and double-quoted strings, which must be specified on one logical line.Triple-quoted strings are useful when the contents of a string literal span multiple lines of text such as the following: print '''Content-type: text/html Hello World Click here. '''

Strings are stored as sequences of characters indexed by integers, starting at zero.To extract a single character, use the indexing operator s[i] like this: a = "Hello World" b = a[4]

# b = 'o'

To extract a substring, use the slicing operator s[i:j].This extracts all characters from s whose index k is in the range i >> x = 3.4 >>> str[x] '3.4' >>> repr[x] '3.3999999999999999' >>>

The inexact representation of 3.4 in the previous example is not a bug in Python. It is an artifact of double-precision floating-point numbers, which by their design can not exactly represent base-10 decimals on the underlying computer hardware. The format[] function is used to convert a value to a string with a specific formatting applied. For example: >>> format[x,"0.5f"] '3.40000' >>>

Lists Lists are sequences of arbitrary objects.You create a list by enclosing values in square brackets, as follows: names = [ "Dave", "Mark", "Ann", "Phil" ]

Lists are indexed by integers, starting with zero. Use the indexing operator to access and modify individual items of the list: a = names[2] names[0] = "Jeff"

# Returns the third item of the list, "Ann" # Changes the first item to "Jeff"

To append new items to the end of a list, use the append[] method: names.append["Paula"]

To insert an item into the middle of a list, use the insert[] method: names.insert[2, "Thomas"]

You can extract or reassign a portion of a list by using the slicing operator: b = names[0:2] c = names[2:] names[1] = 'Jeff' names[0:2] = ['Dave','Mark','Jeff']

# # # # #

Returns [ "Jeff", "Mark" ] Returns [ "Thomas", "Ann", "Phil", "Paula" ] Replace the 2nd item in names with 'Jeff' Replace the first two items of the list with the list on the right.

Use the plus [+] operator to concatenate lists: a = [1,2,3] + [4,5]

# Result is [1,2,3,4,5]

An empty list is created in one of two ways: names = [] names = list[]

# An empty list # An empty list

F

h Lib

fL

B

d

ff

Lists

13

Lists can contain any kind of Python object, including other lists, as in the following example: a = [1,"Dave",3.14, ["Mark", 7, 9, [100,101]], 10]

Items contained in nested lists are accessed by applying more than one indexing operation, as follows: a[1] a[3][2] a[3][3][1]

# Returns "Dave" # Returns 9 # Returns 101

The program in Listing 1.2 illustrates a few more advanced features of lists by reading a list of numbers from a file specified on the command line and outputting the minimum and maximum values. Listing 1.2

Advanced List Features

import sys # Load the sys module if len[sys.argv] != 2 # Check number of command line arguments : print "Please supply a filename" raise SystemExit[1] f = open[sys.argv[1]] # Filename on the command line lines = f.readlines[] # Read all lines into a list f.close[] # Convert all of the input values from strings to floats fvalues = [float[line] for line in lines] # Print min and max values print "The minimum value is ", min[fvalues] print "The maximum value is ", max[fvalues]

The first line of this program uses the import statement to load the sys module from the Python library.This module is being loaded in order to obtain command-line arguments. The open[] function uses a filename that has been supplied as a command-line option and placed in the list sys.argv.The readlines[] method reads all the input lines into a list of strings. The expression [float[line] for line in lines] constructs a new list by looping over all the strings in the list lines and applying the function float[] to each element.This particularly powerful method of constructing a list is known as a list comprehension. Because the lines in a file can also be read using a for loop, the program can be shortened by converting values using a single statement like this: fvalues = [float[line] for line in open[sys.argv[1]]]

Sau khi các dòng đầu vào đã được chuyển đổi thành một danh sách các số điểm nổi, các hàm min [] và tối đa [] tích hợp tính toán tính toán các giá trị tối thiểu và tối đa.

F

H lib

fl

B

d

ff

14

Chương 1

Giới thiệu hướng dẫn

Tuples Để tạo các cấu trúc dữ liệu đơn giản, bạn có thể đóng gói một tập hợp các giá trị với nhau thành một đối tượng bằng cách sử dụng một tuple. = ['www.python.org', 80] person = [first_name, last_name, điện thoại]

Python thường nhận ra rằng một tuple được dự định ngay cả khi dấu ngoặc đơn bị thiếu: stock = 'goog', 100, 490.10 Địa chỉ = 'www.python.org', 80 người = first_name, last_name, điện thoại

Để hoàn thiện, có thể xác định các bộ dữ liệu 0- và 1 phần tử, nhưng có cú pháp đặc biệt: a = [] b = [mục,] c = item,

# 0-TULE [trống Tuple] # 1-Tuple [Lưu ý dấu phẩy kéo dài] # 1-Tuple [Lưu ý dấu phẩy kéo dài]

Các giá trị trong một tuple có thể được trích xuất bằng chỉ mục số giống như một danh sách. Tuy nhiên, thông thường hơn là giải nén các bộ dữ

Mặc dù Tuples hỗ trợ hầu hết các hoạt động giống như danh sách [như lập chỉ mục, cắt và nối], nội dung của một tuple không thể được sửa đổi sau khi tạo [nghĩa là bạn không thể thay thế, xóa hoặc nối các yếu tố mới vào một bộ thuật hiện có] . Điều này phản ánh thực tế rằng một tuple được xem tốt nhất là một đối tượng duy nhất bao gồm một số phần, không phải là một tập hợp các đối tượng riêng biệt mà bạn có thể chèn hoặc loại bỏ các mục. Bởi vì có quá nhiều sự chồng chéo giữa các bộ dữ liệu và danh sách, một số lập trình viên có xu hướng bỏ qua các bộ dữ liệu hoàn toàn và chỉ cần sử dụng danh sách vì chúng có vẻ linh hoạt hơn. Mặc dù điều này hoạt động, nó lãng phí bộ nhớ nếu chương trình của bạn sẽ tạo ra một số lượng lớn danh sách nhỏ [nghĩa là mỗi danh sách chứa ít hơn một tá mục]. . Bởi vì các bộ dữ liệu là bất biến, chúng sử dụng một đại diện nhỏ gọn hơn khi không có thêm không gian. Tuples và danh sách thường được sử dụng cùng nhau để đại diện cho dữ liệu. Ví dụ: chương trình này cho thấy cách bạn có thể đọc một tệp bao gồm các cột dữ liệu khác nhau được phân tách bằng dấu phẩy: # Tệp chứa các dòng của biểu mẫu "Tên, Cổ phiếu, Giá" Tên = "Danh mục đầu tư.CSV" Danh mục đầu tư = [] Open [Tên tệp]: Field = line.split [","] # chia mỗi dòng thành một tên danh sách = trường [0] # Trích xuất và chuyển đổi các trường riêng lẻ chia sẻ = int [trường [1]] price = float [trường [2 ]] Stock = [Tên, Cổ phiếu, Giá] # Tạo Tuple [Tên, Cổ phiếu, Giá] Danh mục đầu tư

Phương thức chia [] của chuỗi chia một chuỗi thành một danh sách các trường được phân tách bằng ký tự phân cách đã cho. Cấu trúc dữ liệu danh mục đầu tư kết quả được tạo bởi chương trình này

F

H lib

fl

B

d

ff

Chương 1

15

Giới thiệu hướng dẫn

Tuples Để tạo các cấu trúc dữ liệu đơn giản, bạn có thể đóng gói một tập hợp các giá trị với nhau thành một đối tượng bằng cách sử dụng một tuple. = ['www.python.org', 80] person = [first_name, last_name, điện thoại]

Python thường nhận ra rằng một tuple được dự định ngay cả khi dấu ngoặc đơn bị thiếu: stock = 'goog', 100, 490.10 Địa chỉ = 'www.python.org', 80 người = first_name, last_name, điện thoại

Để hoàn thiện, có thể xác định các bộ dữ liệu 0- và 1 phần tử, nhưng có cú pháp đặc biệt: a = [] b = [mục,] c = item,

# 0-TULE [trống Tuple] # 1-Tuple [Lưu ý dấu phẩy kéo dài] # 1-Tuple [Lưu ý dấu phẩy kéo dài]

Các giá trị trong một tuple có thể được trích xuất bằng chỉ mục số giống như một danh sách. Tuy nhiên, thông thường hơn là giải nén các bộ dữ

Mặc dù Tuples hỗ trợ hầu hết các hoạt động giống như danh sách [như lập chỉ mục, cắt và nối], nội dung của một tuple không thể được sửa đổi sau khi tạo [nghĩa là bạn không thể thay thế, xóa hoặc nối các yếu tố mới vào một bộ thuật hiện có] . Điều này phản ánh thực tế rằng một tuple được xem tốt nhất là một đối tượng duy nhất bao gồm một số phần, không phải là một tập hợp các đối tượng riêng biệt mà bạn có thể chèn hoặc loại bỏ các mục. Bởi vì có quá nhiều sự chồng chéo giữa các bộ dữ liệu và danh sách, một số lập trình viên có xu hướng bỏ qua các bộ dữ liệu hoàn toàn và chỉ cần sử dụng danh sách vì chúng có vẻ linh hoạt hơn. Mặc dù điều này hoạt động, nó lãng phí bộ nhớ nếu chương trình của bạn sẽ tạo ra một số lượng lớn danh sách nhỏ [nghĩa là mỗi danh sách chứa ít hơn một tá mục]. . Bởi vì các bộ dữ liệu là bất biến, chúng sử dụng một đại diện nhỏ gọn hơn khi không có thêm không gian. Tuples và danh sách thường được sử dụng cùng nhau để đại diện cho dữ liệu. Ví dụ: chương trình này cho thấy cách bạn có thể đọc một tệp bao gồm các cột dữ liệu khác nhau được phân tách bằng dấu phẩy: # Tệp chứa các dòng của biểu mẫu "Tên, Cổ phiếu, Giá" Tên = "Danh mục đầu tư.CSV" Danh mục đầu tư = [] Open [Tên tệp]: Field = line.split [","] # chia mỗi dòng thành một tên danh sách = trường [0] # Trích xuất và chuyển đổi các trường riêng lẻ chia sẻ = int [trường [1]] price = float [trường [2 ]] Stock = [Tên, Cổ phiếu, Giá] # Tạo Tuple [Tên, Cổ phiếu, Giá] Danh mục đầu tư

Phương thức chia [] của chuỗi chia một chuỗi thành một danh sách các trường được phân tách bằng ký tự phân cách đã cho. Cấu trúc dữ liệu danh mục đầu tư kết quả được tạo bởi chương trình này

Bộ

Trông giống như một mảng hai chiều của các hàng và cột. Mỗi hàng được biểu thị bằng một tuple và có thể được truy cập như sau: >>> Danh mục đầu tư [0] ['Goog', 100, 490.10] >>> Danh mục đầu tư [1] ['MSFT', 50, 54.23] >>>

Các mục dữ liệu riêng lẻ có thể được truy cập như thế này: >>> Danh mục đầu tư [1] [1] 50 >>> Danh mục đầu tư [1] [2] 54.23 >>>

Ở đây, một cách dễ dàng để lặp qua tất cả các hồ sơ và mở rộng các trường thành một tập hợp các biến: tổng số = 0,0 cho tên, cổ phiếu, giá trong danh mục đầu tư: Total += cổ phiếu * Giá cả

Đặt một tập hợp được sử dụng để chứa một bộ sưu tập các đối tượng không được đặt hàng. Để tạo một tập hợp, sử dụng hàm set [] và cung cấp một chuỗi các mục như sau: s = set [[3,5,9,10]] t = t = Đặt ["Xin chào"]

# Tạo một bộ số # Tạo một tập hợp các ký tự độc đáo

Không giống như danh sách và bộ dữ liệu, các bộ không được đặt hàng và không thể được lập chỉ mục bởi các số. Hơn nữa, các yếu tố của một bộ không bao giờ được nhân đôi. Ví dụ: nếu bạn kiểm tra giá trị của t từ mã trước, bạn sẽ nhận được như sau: >>> t set [['H', 'e', ​​'l', 'o']]]

Lưu ý rằng chỉ có một 'L' xuất hiện. Bộ hỗ trợ một bộ sưu tập các hoạt động tiêu chuẩn, bao gồm liên minh, giao lộ, sự khác biệt và sự khác biệt đối xứng. Đây là một ví dụ: A B C D

F

H lib

fl

B

d

ff

16

Chương 1

Giới thiệu hướng dẫn

Tuples Để tạo các cấu trúc dữ liệu đơn giản, bạn có thể đóng gói một tập hợp các giá trị với nhau thành một đối tượng bằng cách sử dụng một tuple. = ['www.python.org', 80] person = [first_name, last_name, điện thoại]

Để truy cập các thành viên của từ điển, hãy sử dụng toán tử chỉ số khóa như sau: name = stock ["name"] value = stock ["cổ phiếu"] * chia sẻ ["Giá"]

Chèn hoặc sửa đổi các đối tượng hoạt động như thế này: Stock ["Cổ phiếu"] = 75 cổ phiếu ["Ngày"] = "Ngày 7 tháng 6 năm 2007"

Mặc dù các chuỗi là loại khóa phổ biến nhất, bạn có thể sử dụng nhiều đối tượng Python khác, bao gồm cả số và bộ dữ liệu. Một số đối tượng, bao gồm danh sách và từ điển, không thể được sử dụng làm khóa vì nội dung của chúng có thể thay đổi. Từ điển là một cách hữu ích để xác định một đối tượng bao gồm các trường được đặt tên như được hiển thị trước đó. Tuy nhiên, từ điển cũng được sử dụng như một thùng chứa để thực hiện tra cứu nhanh trên dữ liệu chưa được đặt hàng. Ví dụ: ở đây, một từ điển giá cổ phiếu: Giá = {"GOOG" "AAPL" "IBM" "MSFT"}

:::

490.10, 123,50, 91,50, 52.13

Một từ điển trống được tạo theo một trong hai cách: giá = {} # một giá trị trống rỗng = dict [] # một dict trống rỗng

Tư cách thành viên từ điển được kiểm tra với toán tử trong, như trong ví dụ sau: Nếu "SCOX" về giá: p = giá ["SCOX"] khác: p = 0,0

Chuỗi các bước cụ thể này cũng có thể được thực hiện nhỏ gọn hơn như sau: p = price.get ["scox", 0,0]

Để có được danh sách các khóa từ điển, hãy chuyển đổi từ điển thành danh sách: syms = danh sách [giá]

# syms = ["aapl", "msft", "ibm", "goog"]]

Sử dụng câu lệnh DEL để xóa một phần tử của từ điển: giá DEL ["MSFT"]

Từ điển có lẽ là loại dữ liệu được điều chỉnh tốt nhất trong trình thông dịch Python. Vì vậy, nếu bạn chỉ đang cố gắng lưu trữ và làm việc với dữ liệu trong chương trình của mình, bạn hầu như luôn luôn sử dụng từ điển hơn là cố gắng tự mình đưa ra một số loại cấu trúc dữ liệu tùy chỉnh.

F

H lib

fl

B

d

ff

Lặp lại và vòng lặp

17

Lặp lại và lặp lại cấu trúc vòng lặp được sử dụng rộng rãi nhất là cho câu lệnh, được sử dụng để lặp lại một bộ sưu tập các mục. Lặp lại là một trong những tính năng phong phú nhất của Python. Tuy nhiên, hình thức lặp lại phổ biến nhất là chỉ cần lặp qua tất cả các thành viên của một chuỗi như chuỗi, danh sách hoặc tuple. Ở đây, một ví dụ: Đối với N trong [1,2,3,4,5,6,7,8,8]: In "2 đến %D Power là %d" %[n, 2 ** n]

Trong ví dụ này, biến N sẽ được chỉ định các mục liên tiếp từ danh sách [1,2,3,4,, 9] trên mỗi lần lặp. Bởi vì việc lặp qua các phạm vi số nguyên là khá phổ biến, các phím tắt sau đây thường được sử dụng cho mục đích đó: với n trong phạm vi [1,10]: in "2 đến %d công suất là %d" %[n, 2 ** n ]

Hàm Phạm vi [I, J [, Stride]] tạo ra một đối tượng đại diện cho một phạm vi số nguyên có giá trị I đến J-1. Nếu giá trị bắt đầu bị bỏ qua, nó sẽ được coi là bằng không. Một sải chân tùy chọn cũng có thể được đưa ra như một đối số thứ ba. Đây là một ví dụ: A B C D

= = = =

Phạm vi [5] Phạm vi [1,8] Phạm vi [0,14,3] Phạm vi [8,1, -1]

# # # #

A B C D

= = = =

Phạm vi [5] Phạm vi [1,8] Phạm vi [0,14,3] Phạm vi [8,1, -1]

# # # #

A B C D

0,1,2,3,4 1,2,3,4,5,6,7 0,3,6,9,12 8,7,6,5,4,3,2

F

H lib

fl

B

d

ff

18

Lặp lại và vòng lặp

Lặp lại và lặp lại cấu trúc vòng lặp được sử dụng rộng rãi nhất là cho câu lệnh, được sử dụng để lặp lại một bộ sưu tập các mục. Lặp lại là một trong những tính năng phong phú nhất của Python. Tuy nhiên, hình thức lặp lại phổ biến nhất là chỉ cần lặp qua tất cả các thành viên của một chuỗi như chuỗi, danh sách hoặc tuple. Ở đây, một ví dụ: Đối với N trong [1,2,3,4,5,6,7,8,8]: In "2 đến %D Power là %d" %[n, 2 ** n]

Trong ví dụ này, biến N sẽ được chỉ định các mục liên tiếp từ danh sách [1,2,3,4,, 9] trên mỗi lần lặp. Bởi vì việc lặp qua các phạm vi số nguyên là khá phổ biến, các phím tắt sau đây thường được sử dụng cho mục đích đó: với n trong phạm vi [1,10]: in "2 đến %d công suất là %d" %[n, 2 ** n ]

Hàm Phạm vi [I, J [, Stride]] tạo ra một đối tượng đại diện cho một phạm vi số nguyên có giá trị I đến J-1. Nếu giá trị bắt đầu bị bỏ qua, nó sẽ được coi là bằng không. Một sải chân tùy chọn cũng có thể được đưa ra như một đối số thứ ba. Đây là một ví dụ: A B C D

= = = =

# // đang cắt ngắn sự phân chia.

Để gọi một hàm, chỉ cần sử dụng tên của hàm theo sau là các đối số của nó được đặt trong ngoặc đơn, chẳng hạn như kết quả = phần còn lại [37,15]. Bạn có thể sử dụng một tuple để trả về nhiều giá trị từ một hàm, như được hiển thị ở đây: def Divide [a, b]: q = a // b r = a - q*b return [q, r]

# Nếu A và B là số nguyên, q là số nguyên

Khi trả lại nhiều giá trị trong một tuple, bạn có thể dễ dàng giải quyết kết quả thành các biến riêng biệt như thế này: thương số, phần còn lại = chia [1456,33]

Để gán giá trị mặc định cho tham số hàm, sử dụng gán: def Connect [tên máy chủ, cổng, thời gian chờ = 300]: # cơ thể chức năng

Khi các giá trị mặc định được đưa ra trong một định nghĩa hàm, chúng có thể được bỏ qua từ các cuộc gọi hàm tiếp theo. Khi bị bỏ qua, đối số sẽ chỉ đơn giản là có giá trị mặc định. Ở đây, một ví dụ: Kết nối ['www.python.org', 80]

Bạn cũng có thể gọi các chức năng bằng cách sử dụng các đối số từ khóa và cung cấp các đối số theo thứ tự tùy ý. Tuy nhiên, điều này đòi hỏi bạn phải biết tên của các đối số trong định nghĩa hàm. Ở đây, một ví dụ: Kết nối [cổng = 80, tên máy chủ = "www.python.org"]

Khi các biến được tạo hoặc gán bên trong một hàm, phạm vi của chúng là cục bộ. Đó là, biến chỉ được xác định bên trong phần thân của hàm và bị phá hủy khi hàm trả về. Để sửa đổi giá trị của biến toàn cầu từ bên trong hàm, Sử dụng câu lệnh toàn cầu như sau: Count = 0 ... def foo []: Số đếm toàn cầu += 1

# Thay đổi số lượng biến toàn cầu

F

H lib

fl

B

d

ff

Máy phát điện

19

Trình tạo thay vì trả về một giá trị duy nhất, một hàm có thể tạo ra toàn bộ chuỗi kết quả nếu nó sử dụng câu lệnh năng suất. Ví dụ: Def Countdown [n]: In "Đếm xuống!" Trong khi n> 0: năng suất n # tạo ra một giá trị [n] n -= 1

Bất kỳ chức năng nào sử dụng năng suất đều được gọi là máy phát. Gọi hàm Trình tạo tạo một đối tượng tạo chuỗi kết quả thông qua các cuộc gọi liên tiếp đến phương thức tiếp theo [] [hoặc _ _Next_ _ [] trong Python 3]. Ví dụ: >>> c = đếm ngược [5] >>> c.next [] đếm ngược! 5 >>> c.next [] 4 >>> c.next [] 3 >>>

Cuộc gọi tiếp theo [] làm cho một hàm máy phát chạy cho đến khi nó đạt đến câu lệnh NETENT SENID. Tại thời điểm này, giá trị được truyền cho năng suất được trả về bởi tiếp theo [] và hàm đình chỉ thực thi. Hàm tiếp tục thực thi trên câu lệnh sau khi sản lượng khi tiếp theo [] được gọi lại. Quá trình này tiếp tục cho đến khi hàm trở lại. Thông thường bạn sẽ không gọi thủ công tiếp theo [] như được hiển thị. Thay vào đó, bạn kết nối nó lên một vòng lặp như thế này: >>> Đối với tôi trong đếm ngược [5]: ... in tôi, đếm ngược! 5 4 3 2 1 >>>

Máy phát điện là một cách cực kỳ mạnh mẽ để viết các chương trình dựa trên các đường ống xử lý, luồng hoặc luồng dữ liệu. Ví dụ: hàm máy phát sau bắt chước hành vi của lệnh unix đuôi -f thường được sử dụng để theo dõi các tệp nhật ký: # đuôi một tệp [như đuôi -f] nhập thời gian def đuôi [f]: f.seek [0,2 ] # Di chuyển đến EOF trong khi đúng: line = f.Readline [] # Hãy thử đọc một dòng văn bản mới nếu không dòng: # Nếu không có gì, ngủ ngắn gọn và thử lại thời gian

Ở đây, một trình tạo tìm kiếm một chuỗi con cụ thể trong một chuỗi các dòng: def grep [dòng, searchText]: Đối với dòng trong dòng: Nếu searchtext trong dòng: dòng năng suất

F

H lib

fl

B

d

ff

20

Máy phát điện

Trình tạo thay vì trả về một giá trị duy nhất, một hàm có thể tạo ra toàn bộ chuỗi kết quả nếu nó sử dụng câu lệnh năng suất. Ví dụ: Def Countdown [n]: In "Đếm xuống!" Trong khi n> 0: năng suất n # tạo ra một giá trị [n] n -= 1

Bất kỳ chức năng nào sử dụng năng suất đều được gọi là máy phát. Gọi hàm Trình tạo tạo một đối tượng tạo chuỗi kết quả thông qua các cuộc gọi liên tiếp đến phương thức tiếp theo [] [hoặc _ _Next_ _ [] trong Python 3]. Ví dụ: >>> c = đếm ngược [5] >>> c.next [] đếm ngược! 5 >>> c.next [] 4 >>> c.next [] 3 >>>

Cuộc gọi tiếp theo [] làm cho một hàm máy phát chạy cho đến khi nó đạt đến câu lệnh NETENT SENID. Tại thời điểm này, giá trị được truyền cho năng suất được trả về bởi tiếp theo [] và hàm đình chỉ thực thi. Hàm tiếp tục thực thi trên câu lệnh sau khi sản lượng khi tiếp theo [] được gọi lại. Quá trình này tiếp tục cho đến khi hàm trở lại. Thông thường bạn sẽ không gọi thủ công tiếp theo [] như được hiển thị. Thay vào đó, bạn kết nối nó lên một vòng lặp như thế này: >>> Đối với tôi trong đếm ngược [5]: ... in tôi, đếm ngược! 5 4 3 2 1 >>>

Máy phát điện là một cách cực kỳ mạnh mẽ để viết các chương trình dựa trên các đường ống xử lý, luồng hoặc luồng dữ liệu. Ví dụ: hàm máy phát sau bắt chước hành vi của lệnh unix đuôi -f thường được sử dụng để theo dõi các tệp nhật ký: # đuôi một tệp [như đuôi -f] nhập thời gian def đuôi [f]: f.seek [0,2 ] # Di chuyển đến EOF trong khi đúng: line = f.Readline [] # Hãy thử đọc một dòng văn bản mới nếu không dòng: # Nếu không có gì, ngủ ngắn gọn và thử lại thời gian

Ở đây, một trình tạo tìm kiếm một chuỗi con cụ thể trong một chuỗi các dòng: def grep [dòng, searchText]: Đối với dòng trong dòng: Nếu searchtext trong dòng: dòng năng suất

Một coroutine bị đình chỉ cho đến khi một giá trị được gửi đến nó bằng cách sử dụng Send []. Khi điều này xảy ra, giá trị đó được trả về bởi biểu thức [năng suất] bên trong coroutine và được xử lý bởi các câu lệnh theo sau. Việc xử lý tiếp tục cho đến khi biểu thức tiếp theo [năng suất] gặp phải tại điểm chỉ định chức năng. Điều này tiếp tục cho đến khi hàm coroutine trở lại hoặc đóng [] được gọi trên nó như trong ví dụ trước. Coroutines rất hữu ích khi viết các chương trình đồng thời dựa trên các vấn đề sản xuất trong đó một phần của chương trình đang tạo ra dữ liệu được tiêu thụ bởi một phần khác của chương trình. Trong mô hình này, một coroutine đại diện cho người tiêu dùng dữ liệu. Dưới đây là một ví dụ về việc sử dụng các trình tạo và coroutines cùng nhau: # một bộ các trình chỉnh sửa coroutines của Matcher = [print_matches ["python"], print_matches ["guido"], print_matches ["jython"]]

F

H lib

fl

B

d

ff

Đối tượng và các lớp

21

# Chuẩn bị tất cả các trình chỉnh sửa bằng cách gọi Next [] cho m trong Matchers: m.next [] # Feed một tệp nhật ký hoạt động vào tất cả các trình kết hợp. Lưu ý cho việc này hoạt động, # một máy chủ web phải được tích cực ghi dữ liệu vào nhật ký. wwwlog = đuôi [mở ["access-log"]]] cho dòng trong wwwlog: for m in matchers: m.send [dòng] # Gửi dữ liệu vào mỗi coroutine của người khớp

Thông tin chi tiết về coroutines có thể được tìm thấy trong Chương 6.

Đối tượng và các lớp Tất cả các giá trị được sử dụng trong một chương trình là các đối tượng. Một đối tượng bao gồm dữ liệu nội bộ và các phương thức thực hiện các loại hoạt động khác nhau liên quan đến dữ liệu đó. Bạn đã sử dụng các đối tượng và phương thức khi làm việc với các loại tích hợp như chuỗi và danh sách. Ví dụ: các mục = [37, 42] các mục.append [73]

# Tạo đối tượng Danh sách # Gọi phương thức append []

Hàm Dir [] liệt kê các phương thức có sẵn trên một đối tượng và là một công cụ hữu ích để thử nghiệm tương tác. Ví dụ: >>> Các mục = [37, 42] >>> DIR [Mục] ['_ _ADD_ _', '_ _CLASS_ _', ' , ... 'Phụ lục', 'đếm', 'mở rộng', 'index', 'chèn', 'pop', 'xóa', 'đảo ngược', 'sort']

Khi kiểm tra các đối tượng, bạn sẽ thấy các phương thức quen thuộc như append [] và chèn [] được liệt kê. Tuy nhiên, bạn cũng sẽ thấy các phương pháp đặc biệt luôn bắt đầu và kết thúc bằng một dấu gạch dưới kép. Các phương pháp này thực hiện các hoạt động ngôn ngữ khác nhau. Ví dụ: phương thức _ _add_ _ [] thực hiện toán tử +: >>> items._ _add_ _ [[73,101]] [37, 42, 73, 101] >>>>

Tuyên bố lớp được sử dụng để xác định các loại đối tượng mới và cho lập trình hướng đối tượng. Ví dụ: lớp sau xác định một ngăn xếp đơn giản với các thao tác PUSP [], POP [] và LEGN [] đối tượng]: self.stack.append [object] def pop [self]: return self.stack.pop [] def length [self]: return len [self.stack]

# Khởi tạo ngăn xếp

Trong dòng đầu tiên của định nghĩa lớp, ngăn xếp lớp câu lệnh [đối tượng] tuyên bố ngăn xếp là một đối tượng. Việc sử dụng dấu ngoặc đơn là cách Python chỉ định kế thừa trong trường hợp này, xếp chồng kế thừa từ đối tượng, là gốc của tất cả các loại Python . Bên trong định nghĩa lớp, các phương thức được xác định bằng cách sử dụng câu lệnh DEF. Đối số đầu tiên trong mỗi đối số

F

H lib

fl

B

d

ff

22

Đối tượng và các lớp

# Chuẩn bị tất cả các trình chỉnh sửa bằng cách gọi Next [] cho m trong Matchers: m.next [] # Feed một tệp nhật ký hoạt động vào tất cả các trình kết hợp. Lưu ý cho việc này hoạt động, # một máy chủ web phải được tích cực ghi dữ liệu vào nhật ký. wwwlog = đuôi [mở ["access-log"]]] cho dòng trong wwwlog: for m in matchers: m.send [dòng] # Gửi dữ liệu vào mỗi coroutine của người khớp

Thông tin chi tiết về coroutines có thể được tìm thấy trong Chương 6.

Đối tượng và các lớp Tất cả các giá trị được sử dụng trong một chương trình là các đối tượng. Một đối tượng bao gồm dữ liệu nội bộ và các phương thức thực hiện các loại hoạt động khác nhau liên quan đến dữ liệu đó. Bạn đã sử dụng các đối tượng và phương thức khi làm việc với các loại tích hợp như chuỗi và danh sách. Ví dụ: các mục = [37, 42] các mục.append [73]

# Tạo đối tượng Danh sách # Gọi phương thức append []

Hàm Dir [] liệt kê các phương thức có sẵn trên một đối tượng và là một công cụ hữu ích để thử nghiệm tương tác. Ví dụ: >>> Các mục = [37, 42] >>> DIR [Mục] ['_ _ADD_ _', '_ _CLASS_ _', ' , ... 'Phụ lục', 'đếm', 'mở rộng', 'index', 'chèn', 'pop', 'xóa', 'đảo ngược', 'sort']

Khi kiểm tra các đối tượng, bạn sẽ thấy các phương thức quen thuộc như append [] và chèn [] được liệt kê. Tuy nhiên, bạn cũng sẽ thấy các phương pháp đặc biệt luôn bắt đầu và kết thúc bằng một dấu gạch dưới kép. Các phương pháp này thực hiện các hoạt động ngôn ngữ khác nhau. Ví dụ: phương thức _ _add_ _ [] thực hiện toán tử +: >>> items._ _add_ _ [[73,101]] [37, 42, 73, 101] >>>>

Tuyên bố lớp được sử dụng để xác định các loại đối tượng mới và cho lập trình hướng đối tượng. Ví dụ: lớp sau xác định một ngăn xếp đơn giản với các thao tác PUSP [], POP [] và LEGN [] đối tượng]: self.stack.append [object] def pop [self]: return self.stack.pop [] def length [self]: return len [self.stack]

In this case, @staticmethod declares the method that follows to be a static method. @staticmethod is an example of using an a decorator, a topic that is discussed further in Chapter 6.

Exceptions If an error occurs in your program, an exception is raised and a traceback message such as the following appears: Traceback [most recent call last]: File "foo.py", line 12, in IOError: [Errno 2] No such file or directory: 'file.txt'

The traceback message indicates the type of error that occurred, along with its location. Normally, errors cause a program to terminate. However, you can catch and handle exceptions using try and except statements, like this: try: f = open["file.txt","r"] except IOError as e: print e

F

h Lib

fL

B

d

ff

Modules

23

If an IOError occurs, details concerning the cause of the error are placed in e and control passes to the code in the except block. If some other kind of exception is raised, it’s passed to the enclosing code block [if any]. If no errors occur, the code in the except block is ignored.When an exception is handled, program execution resumes with the statement that immediately follows the last except block.The program does not return to the location where the exception occurred. The raise statement is used to signal an exception.When raising an exception, you can use one of the built-in exceptions, like this: raise RuntimeError["Computer says no"]

Or you can create your own exceptions, as described in the section “Defining New Exceptions” in Chapter 5, “ Program Structure and Control Flow.” Proper management of system resources such as locks, files, and network connections is often a tricky problem when combined with exception handling.To simplify such programming, you can use the with statement with certain kinds of objects. Here is an example of writing code that uses a mutex lock: import threading message_lock = threading.Lock[] ... with message_lock: messages.add[newmessage]

In this example, the message_lock object is automatically acquired when the with statement executes.When execution leaves the context of the with block, the lock is automatically released.This management takes place regardless of what happens inside the with block. For example, if an exception occurs, the lock is released when control leaves the context of the block. The with statement is normally only compatible with objects related to system resources or the execution environment such as files, connections, and locks. However, user-defined objects can define their own custom processing.This is covered in more detail in the “Context Management Protocol” section of Chapter 3, “Types and Objects.”

Modules As your programs grow in size, you will want to break them into multiple files for easier maintenance.To do this, Python allows you to put definitions in a file and use them as a module that can be imported into other programs and scripts.To create a module, put the relevant statements and definitions into a file that has the same name as the module. [Note that the file must have a .py suffix.] Here’s an example: # file : div.py def divide[a,b]: q = a/b r = a - q*b return [q,r]

# If a and b are integers, q is an integer

To use your module in other programs, you can use the import statement: import div a, b = div.divide[2305, 29]

F

h Lib

fL

B

d

ff

24

Chapter 1

A Tutorial Introduction

The import statement creates a new namespace and executes all the statements in the associated .py file within that namespace.To access the contents of the namespace after import, simply use the name of the module as a prefix, as in div.divide[] in the preceding example. If you want to import a module using a different name, supply the import statement with an optional as qualifier, as follows: import div as foo a,b = foo.divide[2305,29]

To import specific definitions into the current namespace, use the from statement: from div import divide a,b = divide[2305,29]

# No longer need the div prefix

To load all of a module’s contents into the current namespace, you can also use the following: from div import *

As with objects, the dir[] function lists the contents of a module and is a useful tool for interactive experimentation: >>> import string >>> dir[string] ['_ _builtins_ _', '_ _doc_ _', '_ _file_ _', '_ _name_ _', '_idmap', '_idmapL', '_lower', '_swapcase', '_upper', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find', ... >>>

Getting Help When working with Python, you have several sources of quickly available information. First, when Python is running in interactive mode, you can use the help[] command to get information about built-in modules and other aspects of Python. Simply type help[] by itself for general information or help['modulename'] for information about a specific module.The help[] command can also be used to return information about specific functions if you supply a function name. Most Python functions have documentation strings that describe their usage.To print the doc string, simply print the _ _doc_ _ attribute. Here’s an example: >>> print issubclass._ _doc_ _ issubclass[C, B] -> bool Return whether class C is a subclass [i.e., a derived class] of class B. When using a tuple as the second argument issubclass[X, [A, B, ...]], is a shortcut for issubclass[X, A] or issubclass[X, B] or ... [etc.]. >>>

Cuối cùng, nhưng không kém phần quan trọng, hầu hết các cài đặt Python cũng bao gồm PYDOC lệnh, có thể được sử dụng để trả về tài liệu về các mô -đun Python. Đơn giản chỉ cần gõ chủ đề PYDOC tại dấu nhắc lệnh hệ thống.

F

H lib

fl

B

d

ff

2 quy ước từ vựng và cú pháp t

Chương của ông mô tả các quy ước cú pháp và từ vựng của một chương trình Python. Các chủ đề bao gồm cấu trúc dòng, nhóm các câu lệnh, từ dành riêng, nghĩa đen, toán tử, mã thông báo và mã hóa mã nguồn.

Cấu trúc dòng và thụt lề Mỗi câu lệnh trong một chương trình được chấm dứt với một dòng mới. Các câu lệnh dài có thể trải dài nhiều dòng bằng cách sử dụng ký tự liên tục dòng [\], như được hiển thị trong ví dụ sau: a = math.cos [3 * [x - n]] + \ math.sin [3 * [y - n ]]

Bạn không cần ký tự tiếp tục dòng khi định nghĩa của chuỗi ba chuỗi, danh sách, tuple hoặc từ điển được trích xuất ba dòng. Tổng quát hơn, bất kỳ phần nào của chương trình được đặt trong ngoặc đơn [...], dấu ngoặc [...], niềng ni Sự khởi đầu và kết thúc của một định nghĩa. Thắng được sử dụng để biểu thị các khối mã khác nhau, chẳng hạn như các cơ thể của các hàm, điều kiện, vòng lặp và các lớp. Số lượng thụt được sử dụng cho câu lệnh đầu tiên của một khối là tùy ý, nhưng sự thụt của toàn bộ khối phải nhất quán. Đây

# Thắng nhất quán

# Thụt không nhất quán [lỗi]

Nếu phần thân của một hàm, điều kiện, vòng lặp hoặc lớp ngắn và chỉ chứa một câu lệnh, nó có thể được đặt trên cùng một dòng, như thế này: nếu A: khác:

Tuyên bố1 tuyên bố2

Để biểu thị một thân hoặc khối trống, hãy sử dụng câu lệnh PASS. Đây là một ví dụ: Nếu A: Truyền khác: Báo cáo

F

H lib

fl

B

d

ff

26

2 quy ước từ vựng và cú pháp t

Chương của ông mô tả các quy ước cú pháp và từ vựng của một chương trình Python. Các chủ đề bao gồm cấu trúc dòng, nhóm các câu lệnh, từ dành riêng, nghĩa đen, toán tử, mã thông báo và mã hóa mã nguồn.

Cấu trúc dòng và thụt lề Mỗi câu lệnh trong một chương trình được chấm dứt với một dòng mới. Các câu lệnh dài có thể trải dài nhiều dòng bằng cách sử dụng ký tự liên tục dòng [\], như được hiển thị trong ví dụ sau: a = math.cos [3 * [x - n]] + \ math.sin [3 * [y - n ]]

Bạn không cần ký tự tiếp tục dòng khi định nghĩa của chuỗi ba chuỗi, danh sách, tuple hoặc từ điển được trích xuất ba dòng. Tổng quát hơn, bất kỳ phần nào của chương trình được đặt trong ngoặc đơn [...], dấu ngoặc [...], niềng ni Sự khởi đầu và kết thúc của một định nghĩa. Thắng được sử dụng để biểu thị các khối mã khác nhau, chẳng hạn như các cơ thể của các hàm, điều kiện, vòng lặp và các lớp. Số lượng thụt được sử dụng cho câu lệnh đầu tiên của một khối là tùy ý, nhưng sự thụt của toàn bộ khối phải nhất quán. Đây

# Thắng nhất quán

# Thụt không nhất quán [lỗi]

Nếu phần thân của một hàm, điều kiện, vòng lặp hoặc lớp ngắn và chỉ chứa một câu lệnh, nó có thể được đặt trên cùng một dòng, như thế này: nếu A: khác:

Tuyên bố1 tuyên bố2

Để biểu thị một thân hoặc khối trống, hãy sử dụng câu lệnh PASS. Đây là một ví dụ: Nếu A: Truyền khác: Báo cáo

F

H lib

fl

B

d

ff

2 quy ước từ vựng và cú pháp t

Chương của ông mô tả các quy ước cú pháp và từ vựng của một chương trình Python. Các chủ đề bao gồm cấu trúc dòng, nhóm các câu lệnh, từ dành riêng, nghĩa đen, toán tử, mã thông báo và mã hóa mã nguồn.

27

Cấu trúc dòng và thụt lề Mỗi câu lệnh trong một chương trình được chấm dứt với một dòng mới. Các câu lệnh dài có thể trải dài nhiều dòng bằng cách sử dụng ký tự liên tục dòng [\], như được hiển thị trong ví dụ sau: a = math.cos [3 * [x - n]] + \ math.sin [3 * [y - n ]]

The identifiers True and False are interpreted as Boolean values with the integer values of 1 and 0, respectively. A number such as 1234 is interpreted as a decimal integer. To specify an integer using octal, hexadecimal, or binary notation, precede the value with 0, 0x, or 0b, respectively [for example, 0644, 0x100fea8, or 0b11101010]. Integers in Python can have an arbitrary number of digits, so if you want to specify a really large integer, just write out all of the digits, as in 12345678901234567890. However, when inspecting values and looking at old Python code, you might see large numbers written with a trailing l [lowercase L] or L character, as in 12345678901234567890L.This trailing L is related to the fact that Python internally represents integers as either a fixed-precision machine integer or an arbitrary precision long integer type depending on the magnitude of the value. In older versions of Python, you could explicitly choose to use either type and would add the trailing L to explicitly indicate the long type.Today, this distinction is unnecessary and is actively discouraged. So, if you want a large integer value, just write it without the L. Numbers such as 123.34 and 1.2334e+02 are interpreted as floating-point numbers. An integer or floating-point number with a trailing j or J, such as 12.34J, is an imaginary number.You can create complex numbers with real and imaginary parts by adding a real number and an imaginary number, as in 1.2 + 12.34J.

String Literals String literals are used to specify a sequence of characters and are defined by enclosing text in single ['], double ["], or triple [''' or """] quotes.There is no semantic difference between quoting styles other than the requirement that you use the same type of quote to start and terminate a string. Single- and double-quoted strings must be defined on a single line, whereas triple-quoted strings can span multiple lines and include all of the enclosed formatting [that is, newlines, tabs, spaces, and so on]. Adjacent strings [separated by white space, newline, or a line-continuation character] such as "hello" 'world' are concatenated to form a single string "helloworld". Within string literals, the backslash [\] character is used to escape special characters such as newlines, the backslash itself, quotes, and nonprinting characters.Table 2.1 shows the accepted escape codes. Unrecognized escape sequences are left in the string unmodified and include the leading backslash. Table 2.1

Standard Character Escape Codes

Character

Description

\

Newline continuation Backslash Single quote Double quote Bell Backspace Escape Null

\\ \' \" \a \b \e \0

F

h Lib

fL

B

d

ff

Chapter 2 Lexical Conventions and Syntax

28

Table 2.1

Continued

Character

Description

\n \v \t

Line feed Vertical tab Horizontal tab Carriage return Form feed Octal value [\000 to \377] Unicode character [\u0000 to \uffff] Unicode character [\U00000000 to \Uffffffff] Unicode character name Hexadecimal value [\x00 to \xff]

\r \f \OOO \uxxxx \Uxxxxxxxx \N{charname} \xhh

The escape codes \OOO and \x are used to embed characters into a string literal that can’t be easily typed [that is, control codes, nonprinting characters, symbols, international characters, and so on]. For these escape codes, you have to specify an integer value corresponding to a character value. For example, if you wanted to write a string literal for the word “Jalapeño”, you might write it as "Jalape\xf1o" where \xf1 is the character code for ñ. In Python 2 string literals correspond to 8-bit character or byte-oriented data. A serious limitation of these strings is that they do not fully support international character sets and Unicode.To address this limitation, Python 2 uses a separate string type for Unicode data.To write a Unicode string literal, you prefix the first quote with the letter “u”. For example: s = u"Jalape\u00f1o"

In Python 3, this prefix character is unnecessary [and is actually a syntax error] as all strings are already Unicode. Python 2 will emulate this behavior if you run the interpreter with the -U option [in which case all string literals will be treated as Unicode and the u prefix can be omitted]. Regardless of which Python version you are using, the escape codes of \u, \U, and \N in Table 2.1 are used to insert arbitrary characters into a Unicode literal. Every Unicode character has an assigned code point, which is typically denoted in Unicode charts as U+XXXX where XXXX is a sequence of four or more hexadecimal digits. [Note that this notation is not Python syntax but is often used by authors when describing Unicode characters.] For example, the character ñ has a code point of U+00F1.The \u escape code is used to insert Unicode characters with code points in the range U+0000 to U+FFFF [for example, \u00f1].The \U escape code is used to insert characters in the range U+10000 and above [for example, \U00012345]. One subtle caution concerning the \U escape code is that Unicode characters with code points above U+10000 usually get decomposed into a pair of characters known as a surrogate pair.This has to do with the internal representation of Unicode strings and is covered in more detail in Chapter 3, “Types and Objects.” Unicode characters also have a descriptive name. If you know the name, you can use the \N{character name} escape sequence. For example: s = u"Jalape\N{LATIN SMALL LETTER N WITH TILDE}o"

F

h Lib

fL

B

d

ff

Containers

29

For an authoritative reference on code points and character names, consult //www.unicode.org/charts. Optionally, you can precede a string literal with an r or R, such as in r'\d'.These strings are known as raw strings because all their backslash characters are left intact—that is, the string literally contains the enclosed text, including the backslashes.The main use of raw strings is to specify literals where the backslash character has some significance. Examples might include the specification of regular expression patterns with the re module or specifying a filename on a Windows machine [for example, r'c:\newdata\tests']. Raw strings cannot end in a single backslash, such as r"\".Within raw strings, \uXXXX escape sequences are still interpreted as Unicode characters, provided that the number of preceding \ characters is odd. For instance, ur"\u1234" defines a raw Unicode string with the single character U+1234, whereas ur"\\u1234" defines a seven-character string in which the first two characters are slashes and the remaining five characters are the literal "u1234". Also, in Python 2.2, the r must appear after the u in raw Unicode strings as shown. In Python 3.0, the u prefix is unnecessary. String literals should not be defined using a sequence of raw bytes that correspond to a data encoding such as UTF-8 or UTF-16. For example, directly writing a raw UTF-8 encoded string such as 'Jalape\xc3\xb1o' simply produces a nine-character string U+004A, U+0061, U+006C, U+0061, U+0070, U+0065, U+00C3, U+00B1, U+006F, which is probably not what you intended.This is because in UTF-8, the multibyte sequence \xc3\xb1 is supposed to represent the single character U+00F1, not the two characters U+00C3 and U+00B1.To specify an encoded byte string as a literal, prefix the first quote with a "b" as in b"Jalape\xc3\xb1o".When defined, this literally creates a string of single bytes. From this representation, it is possible to create a normal string by decoding the value of the byte literal with its decode[] method. More details about this are covered in Chapter 3 and Chapter 4, “Operators and Expressions.” The use of byte literals is quite rare in most programs because this syntax did not appear until Python 2.6, and in that version there is no difference between a byte literal and a normal string. In Python 3, however, byte literals are mapped to a new bytes datatype that behaves differently than a normal string [see Appendix A, “Python 3”].

Containers Values enclosed in square brackets [...], parentheses [...], and braces {...} denote a collection of objects contained in a list, tuple, and dictionary, respectively, as in the following example: a = [ 1, 3.4, 'hello' ] b = [ 10, 20, 30 ] c = { 'a': 3, 'b': 42 }

# A list # A tuple # A dictionary

List, tuple, and dictionary literals can span multiple lines without using the linecontinuation character [\]. In addition, a trailing comma is allowed on the last item. For example: a = [ 1, 3.4, 'hello', ]

F

h Lib

fL

B

d

ff

Chapter 2 Lexical Conventions and Syntax

30

Operators, Delimiters, and Special Symbols The following operators are recognized: + ^ -=

-

~

*=

* < /=

** > //=

/ = **=

% == &=

>

^=

& += >>=

| >> factorial[6] 120 >>> """ if n >> help[factorial] Help on function call in module _ _main_ _: call[*args, **kwargs] [END] >>>

F

h Lib

fL

B

d

ff

114

Chapter 6 Functions and Functional Programming

To fix this, write decorator functions so that they propagate the function name and documentation string. For example: def wrap[func]: call[*args,**kwargs]: return func[*args,**kwargs] call._ _doc_ _ = func._ _doc_ _ call._ _name_ _ = func._ _name_ _ return call

Because this is a common problem, the functools module provides a function wraps that can automatically copy these attributes. Not surprisingly, it is also a decorator: from functools import wraps def wrap[func]: @wraps[func] call[*args,**kwargs]: return func[*args,**kwargs] return call

The @wraps[func] decorator, defined in functools, propagates attributes from func to the wrapper function that is being defined.

Function Attributes Functions can have arbitrary attributes attached to them. Here’s an example: def foo[]: statements foo.secure = 1 foo.private = 1

Function attributes are stored in a dictionary that is available as the __dict__ attribute of a function. The primary use of function attributes is in highly specialized applications such as parser generators and application frameworks that would like to attach additional information to function objects. As with documentation strings, care should be given if mixing function attributes with decorators. If a function is wrapped by a decorator, access to the attributes will actually take place on the decorator function, not the original implementation.This may or may not be what you want depending on the application.To propagate already defined function attributes to a decorator function, use the following template or the functools.wraps[] decorator as shown in the previous section: def wrap[func]: call[*args,**kwargs]: return func[*args,**kwargs] call._ _doc_ _ = func._ _doc_ _ call._ _name_ _ = func._ _name_ _ call._ _dict_ _.update[func._ _dict_ _] return call

F

h Lib

fL

B

d

ff

eval[], exec[], and compile[]

eval[], exec[],

115

and compile[]

The eval[str [,globals [,locals]]] function executes an expression string and returns the result. Here’s an example: a = eval['3*math.sin[3.5+x] + 7.2']

Similarly, the exec[str [, globals [, locals]]] function executes a string containing arbitrary Python code.The code supplied to exec[] is executed as if the code actually appeared in place of the exec operation. Here’s an example: a = [3, 5, 10, 13] exec["for i in a: print[i]"]

One caution with exec is that in Python 2, exec is actually defined as a statement. Thus, in legacy code, you might see statements invoking exec without the surrounding parentheses, such as exec "for i in a: print i". Although this still works in Python 2.6, it breaks in Python 3. Modern programs should use exec[] as a function. Both of these functions execute within the namespace of the caller [which is used to resolve any symbols that appear within a string or file]. Optionally, eval[] and exec[] can accept one or two mapping objects that serve as the global and local namespaces for the code to be executed, respectively. Here’s an example: globals = {'x': 7, 'y': 10, 'birds': ['Parrot', 'Swallow', 'Albatross'] } locals = { } # Execute using the above dictionaries as the global and local namespace a = eval["3 * x + 4 * y", globals, locals] exec["for b in birds: print[b]", globals, locals]

If you omit one or both namespaces, the current values of the global and local namespaces are used. Also, due to issues related to nested scopes, the use of exec[] inside of a function body may result in a SyntaxError exception if that function also contains nested function definitions or uses the lambda operator. When a string is passed to exec[] or eval[] the parser first compiles it into bytecode. Because this process is expensive, it may be better to precompile the code and reuse the bytecode on subsequent calls if the code will be executed multiple times. The compile[str,filename,kind] function compiles a string into bytecode in which str is a string containing the code to be compiled and filename is the file in which the string is defined [for use in traceback generation].The kind argument specifies the type of code being compiled—'single' for a single statement, 'exec' for a set of statements, or 'eval' for an expression.The code object returned by the compile[] function can also be passed to the eval[] function and exec[] statement. Here’s an example: s = "for i in range[0,10]: print[i]" c = compile[s,'','exec'] # Compile into a code object exec[c] # Execute it s2 = "3 * x + 4 * y" c2 = compile[s2, '', 'eval'] result = eval[c2]

# Compile into an expression # Execute it

F

h Lib

fL

B

d

ff

This page intentionally left blank

F

h Lib

fL

B

d

ff

7 Classes and Object-Oriented Programming C

lasses are the mechanism used to create new kinds of objects.This chapter covers the details of classes, but is not intended to be an in-depth reference on object-oriented programming and design. It’s assumed that the reader has some prior experience with data structures and object-oriented programming in other languages such as C or Java. [Chapter 3, “Types and Objects,” contains additional information about the terminology and internal implementation of objects.]

The class Statement A class defines a set of attributes that are associated with, and shared by, a collection of objects known as instances. A class is most commonly a collection of functions [known as methods], variables [which are known as class variables], and computed attributes [which are known as properties]. A class is defined using the class statement.The body of a class contains a series of statements that execute during class definition. Here’s an example: class Account[object]: num_accounts = 0 def _ _init_ _[self,name,balance]: self.name = name self.balance = balance Account.num_accounts += 1 def _ _del_ _[self]: Account.num_accounts -= 1 def deposit[self,amt]: self.balance = self.balance + amt def withdraw[self,amt]: self.balance = self.balance - amt def inquiry[self]: return self.balance

The values created during the execution of the class body are placed into a class object that serves as a namespace much like a module. For example, the members of the Account class are accessed as follows: Account.num_accounts Account._ _init_ _ Account._ _del_ _ Account.deposit Account.withdraw Account.inquiry

F

h Lib

fL

B

d

ff

118

Chapter 7 Classes and Object-Oriented Programming

It’s important to note that a class statement by itself doesn’t create any instances of the class [for example, no accounts are actually created in the preceding example]. Rather, a class merely sets up the attributes that will be common to all the instances that will be created later. In this sense, you might think of it as a blueprint. The functions defined inside a class are known as instance methods. An instance method is a function that operates on an instance of the class, which is passed as the first argument. By convention, this argument is called self, although any legal identifier name can be used. In the preceding example, deposit[], withdraw[], and inquiry[] are examples of instance methods. Class variables such as num_accounts are values that are shared among all instances of a class [that is, they’re not individually assigned to each instance]. In this case, it’s a variable that’s keeping track of how many Account instances are in existence.

Các phiên bản lớp của một lớp được tạo bằng cách gọi một đối tượng lớp là hàm. Điều này tạo ra một thể hiện mới sau đó được chuyển sang phương thức _ _init_ _ [] của lớp. Các đối số đến _ _init_ _ [] bao gồm đã tạo trường hợp tự cùng với các đối số được cung cấp khi gọi đối tượng lớp. Ví dụ: # Tạo một vài tài khoản a = tài khoản ["guido", 1000.00] b = tài khoản ["Bill", 10,00]

# Gọi tài khoản._ _init_ _ [a, "guido", 1000.00]

Bên trong _ _init_ _ [], các thuộc tính được lưu trong trường hợp bằng cách gán cho bản thân. Ví dụ: self.name = name đang lưu thuộc tính tên trong trường hợp. Khi phiên bản mới được tạo đã được trả lại cho người dùng, các thuộc tính này cũng như các thuộc tính của lớp được truy cập bằng toán tử DOT [.]

# CALK ACCORS.DEPOSIT [A, 100.00] # CALK

Toán tử DOT [.] Chịu trách nhiệm liên kết thuộc tính. Khi bạn truy cập một thuộc tính, giá trị kết quả có thể đến từ một số nơi khác nhau. Ví dụ: A.Name trong ví dụ trước trả về thuộc tính tên của thể hiện a. Tuy nhiên, a.deposit trả về thuộc tính tiền gửi [một phương thức] của lớp tài khoản. Khi bạn truy cập một thuộc tính, trường hợp được kiểm tra trước và nếu không có gì được biết mà một lớp chia sẻ các thuộc tính của nó với tất cả các trường hợp của nó.

Các quy tắc phạm vi Mặc dù các lớp xác định không gian tên, các lớp không tạo phạm vi cho các tên được sử dụng bên trong các cơ thể của các phương thức. Do đó, khi bạn thực hiện một lớp, các tham chiếu đến các thuộc tính và phương thức phải có đủ điều kiện. Ví dụ, trong các phương thức, bạn luôn tham khảo các thuộc tính của trường hợp thông qua bản thân. Do đó, trong ví dụ bạn sử dụng bản thân. Điều này cũng áp dụng nếu bạn muốn gọi một phương thức từ một phương thức khác, như được hiển thị trong ví dụ sau:

F

H lib

fl

B

d

ff

Di sản

119

lớp foo [đối tượng]: def Bar [self]: in ["thanh!"] def spam [self]: bar [self] # không chính xác! 'Bar' tạo ra một nameerror self.bar [] # cái này hoạt động foo.bar [self] # Điều này cũng hoạt động

Việc thiếu phạm vi trong các lớp là một khu vực mà Python khác với C ++ hoặc Java. Nếu bạn đã sử dụng các ngôn ngữ đó, tham số tự trong Python giống như con trỏ này. Việc sử dụng bản thân rõ ràng là do Python không cung cấp phương tiện để khai báo rõ ràng y trong c]. Nếu không có điều này, không có cách nào để biết liệu một nhiệm vụ cho một biến trong một phương thức được cho là một biến cục bộ hay nếu nó được cho là được lưu dưới dạng thuộc tính thể hiện. Việc sử dụng rõ ràng bản thân sửa lỗi này, tất cả các giá trị được lưu trữ trên bản thân là một phần của trường hợp và tất cả các bài tập khác chỉ là các biến cục bộ.

Kế thừa kế thừa là một cơ chế để tạo ra một lớp mới chuyên hoặc sửa đổi hành vi của một lớp hiện có. Lớp gốc được gọi là lớp cơ sở hoặc một lớp siêu. Thông qua kế thừa, nó đã thừa hưởng các thuộc tính được xác định bởi các lớp cơ sở của nó. Tuy nhiên, một lớp dẫn xuất có thể xác định lại bất kỳ thuộc tính nào trong số này và thêm các thuộc tính mới của riêng nó. Kế thừa được chỉ định với một danh sách được phân tách bằng dấu phẩy các tên lớp cơ sở trong tuyên bố lớp. Nếu không có lớp cơ sở logic, một lớp kế thừa từ đối tượng, như đã được hiển thị trong các ví dụ trước. Đối tượng là một lớp là gốc của tất cả các đối tượng Python và cung cấp việc triển khai mặc định của một số phương pháp phổ biến như _ _str_ _ [], tạo ra một chuỗi để sử dụng trong in. Kế thừa thường được sử dụng để xác định lại hành vi của các phương pháp hiện có. Ví dụ, đây là phiên bản chuyên dụng của tài khoản xác định lại phương thức điều tra [] để định kỳ quá mức cân bằng hiện tại với hy vọng ai đó không chú ý sẽ vượt qua tài khoản của mình và phải chịu một hình phạt lớn khi thanh toán cho thế chấp dưới chuẩn của họ: Nhập Random Class EvilAccount [tài khoản]: Def Thắc mắc [tự]: Nếu ngẫu nhiên.randint [0,4] == 1: return self.balance * 1.10 khác: return self.

# Lưu ý: Ý tưởng đang chờ cấp bằng sáng chế

C = EvilAccount ["George", 1000.00] C.Deposit [10.0]

Trong ví dụ này, các trường hợp của EvilAccount giống hệt với các trường hợp của tài khoản ngoại trừ phương thức điều tra được xác định lại []. Kế thừa được thực hiện chỉ với một sự tăng cường nhỏ của toán tử DOT [.]. Cụ thể, nếu việc tìm kiếm một thuộc tính không tìm thấy một trận đấu trong trường hợp hoặc lớp thể hiện, thì tìm kiếm sẽ chuyển sang lớp cơ sở. Quá trình này tiếp tục cho đến khi không có thêm các lớp cơ sở để tìm kiếm. Trong ví dụ trước, điều này giải thích lý do tại sao c.deposit [] gọi việc triển khai tiền gửi [] được xác định trong lớp tài khoản.

F

H lib

fl

B

d

ff

120

Chương 7 Các lớp và lập trình hướng đối tượng

Một lớp con có thể thêm các thuộc tính mới vào các phiên bản bằng cách xác định phiên bản riêng của _ _init_ _ []. Ví dụ: phiên bản này của EvilAccount thêm một thuộc tính mới EvilFactor: Class EvilAccount [tài khoản]: def _ _init_ _ [self, name, alancefactor]: account._ _init_ _ [tự, tên, cân bằng] # tự khởi tạo tài khoản. EvilFactor = EvilFactor def Thắc mắc [tự]: Nếu ngẫu nhiên.randint [0,4] == 1: return self.balance * self.evilfactor khác: return self.balance

Khi một lớp dẫn xuất định nghĩa _ _init_ _ [], các phương thức _ _init_ _ [] của các lớp cơ sở không được tự động gọi. ] Phương pháp. Trong ví dụ trước, điều này được hiển thị trong câu lệnh gọi tài khoản._ _init_ _ []. Nếu một lớp cơ sở không xác định _ _init_ _ [], bước này có thể được bỏ qua. Nếu bạn không biết liệu lớp cơ sở có định nghĩa _ _init_ _ [] hay không, thì luôn luôn an toàn khi gọi nó mà không có bất kỳ đối số nào vì luôn có một triển khai mặc định đơn giản là không làm gì. Thỉnh thoảng, một lớp dẫn xuất sẽ tái tạo phương thức nhưng cũng muốn gọi triển khai ban đầu. Để thực hiện điều này, một phương thức có thể gọi rõ ràng phương thức ban đầu trong lớp cơ sở, chuyển thể hiện bản thân là tham số đầu tiên như được hiển thị ở đây: Lớp MoreEvilArcount [ EvilAccount]: Tiền gửi def [tự, số tiền]: self.withDraw [5,00] # trừ phí "tiện lợi" EvilAccount.deposit [tự, số tiền] # Bây giờ, gửi tiền gửi

Một sự tinh tế trong ví dụ này là lớp EvilAccount không thực sự thực hiện phương thức tiền gửi []. Thay vào đó, nó được thực hiện trong lớp tài khoản. Mặc dù mã này hoạt động, có thể gây nhầm lẫn cho ai đó đọc mã [ví dụ: EvilAccount được cho là để thực hiện tiền gửi []?] Def Tiền gửi [tự, số tiền]: self.WithDraw [5,00] # Trừ phí tiện lợi

Super [CLS, ví dụ] trả về một đối tượng đặc biệt cho phép bạn thực hiện tra cứu thuộc tính trên các lớp cơ sở. Nếu bạn sử dụng điều này, Python sẽ tìm kiếm một thuộc tính bằng cách sử dụng các quy tắc tìm kiếm thông thường sẽ được sử dụng trên các lớp cơ sở. muốn gọi cho việc triển khai trước mà không quan tâm đến lớp cơ sở định nghĩa nó]. Thật không may, cú pháp của Super [] để lại nhiều điều mong muốn. Nếu bạn đang sử dụng Python 3, bạn có thể sử dụng Super []. Tiền gửi [số tiền] đơn giản hóa để thực hiện tính toán được hiển thị trong ví dụ. Tuy nhiên, trong Python 2, bạn phải sử dụng phiên bản dài dòng hơn. Python hỗ trợ nhiều kế thừa. Điều này được chỉ định bằng cách có một danh sách lớp nhiều lớp cơ sở. Ví dụ, đây là một tập hợp các lớp:

F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

121

Một lớp con có thể thêm các thuộc tính mới vào các phiên bản bằng cách xác định phiên bản riêng của _ _init_ _ []. Ví dụ: phiên bản này của EvilAccount thêm một thuộc tính mới EvilFactor: Class EvilAccount [tài khoản]: def _ _init_ _ [self, name, alancefactor]: account._ _init_ _ [tự, tên, cân bằng] # tự khởi tạo tài khoản. EvilFactor = EvilFactor def Thắc mắc [tự]: Nếu ngẫu nhiên.randint [0,4] == 1: return self.balance * self.evilfactor khác: return self.balance

Khi một lớp dẫn xuất định nghĩa _ _init_ _ [], các phương thức _ _init_ _ [] của các lớp cơ sở không được tự động gọi. ] Phương pháp. Trong ví dụ trước, điều này được hiển thị trong câu lệnh gọi tài khoản._ _init_ _ []. Nếu một lớp cơ sở không xác định _ _init_ _ [], bước này có thể được bỏ qua. Nếu bạn không biết liệu lớp cơ sở có định nghĩa _ _init_ _ [] hay không, thì luôn luôn an toàn khi gọi nó mà không có bất kỳ đối số nào vì luôn có một triển khai mặc định đơn giản là không làm gì. Thỉnh thoảng, một lớp dẫn xuất sẽ tái tạo phương thức nhưng cũng muốn gọi triển khai ban đầu. Để thực hiện điều này, một phương thức có thể gọi rõ ràng phương thức ban đầu trong lớp cơ sở, chuyển thể hiện bản thân là tham số đầu tiên như được hiển thị ở đây: Lớp MoreEvilArcount [ EvilAccount]: Tiền gửi def [tự, số tiền]: self.withDraw [5,00] # trừ phí "tiện lợi" EvilAccount.deposit [tự, số tiền] # Bây giờ, gửi tiền gửi

Một sự tinh tế trong ví dụ này là lớp EvilAccount không thực sự thực hiện phương thức tiền gửi []. Thay vào đó, nó được thực hiện trong lớp tài khoản. Mặc dù mã này hoạt động, có thể gây nhầm lẫn cho ai đó đọc mã [ví dụ: EvilAccount được cho là để thực hiện tiền gửi []?] Def Tiền gửi [tự, số tiền]: self.WithDraw [5,00] # Trừ phí tiện lợi

Trong hầu hết các trường hợp, danh sách này dựa trên các quy tắc mà có ý nghĩa. Đó là, một lớp dẫn xuất luôn được kiểm tra trước các lớp cơ sở của nó và nếu một lớp có nhiều phụ huynh, cha mẹ luôn được kiểm tra theo cùng thứ tự như được liệt kê Trong định nghĩa lớp. Tuy nhiên, thứ tự chính xác của các lớp cơ sở thực sự khá phức tạp và không dựa trên bất kỳ loại thuật toán đơn giản nào của đơn giản, chẳng hạn như tìm kiếm chiều sâu đầu tiên hoặc đầu tiên. Thay vào đó, thứ tự được xác định theo thuật toán tuyến tính hóa C3, được mô tả trong bài báo Một tuyến tính siêu lớp đơn điệu cho Dylan, [K. Barrett, et al, được trình bày tại

F

H lib

fl

B

d

ff

122

Chương 7 Các lớp và lập trình hướng đối tượng

Oopsla hè96]. Một khía cạnh tinh tế của thuật toán này là một số phân cấp lớp nhất định sẽ bị Python từ chối với một kiểu mẫu. Ở đây, một ví dụ: Lớp X [Đối tượng]: Pass Class Y [x]: Pass Class Z [X, Y]: Pass # typeerror. # Không thể tạo ra phân giải phương thức nhất quán thứ tự_ _

Trong trường hợp này, thuật toán độ phân giải phương thức từ chối lớp Z vì nó có thể xác định một thứ tự của các lớp cơ sở có ý nghĩa. Ví dụ: lớp X xuất hiện trước lớp Y trong danh sách kế thừa, do đó phải được kiểm tra trước. Tuy nhiên, lớp Y chuyên biệt hơn vì nó kế thừa từ X.HEREfrese, nếu X được kiểm tra trước, bạn sẽ không thể giải quyết các phương pháp chuyên dụng trong Y. trong thực tế, những vấn đề này hiếm khi phát sinh và nếu chúng làm Một vấn đề thiết kế nghiêm trọng hơn với một chương trình. Theo nguyên tắc chung, nhiều kế thừa là điều tốt nhất tránh được trong hầu hết các chương trình. Tuy nhiên, đôi khi nó được sử dụng để xác định những gì được gọi là các lớp mixin. Một lớp mixin thường xác định một tập hợp các phương thức có nghĩa là được trộn lẫn trong các lớp khác để thêm chức năng bổ sung [gần giống như một macro]. xây dựng dựa trên chúng. Các lớp tiền gửi và rút tiền trong ví dụ trước đó minh họa điều này. Các lớp này thêm các phương thức mới như story_fee [] vào các lớp bao gồm chúng là một trong các lớp cơ sở. Tuy nhiên, bạn sẽ không bao giờ tự khởi tạo tiền gửi. Trên thực tế, nếu bạn đã làm, nó sẽ tạo ra một thể hiện có thể được sử dụng cho bất cứ điều gì hữu ích [nghĩa là một phương thức được xác định sẽ không thực hiện chính xác]. Chỉ là một lưu ý cuối cùng, nếu bạn muốn sửa các tham chiếu có vấn đề về phí trong ví dụ này, việc triển khai story_fee [] và reking_fee [] nên được thay đổi để tham khảo thuộc tính trực tiếp bằng tên lớp thay vì bản thân [ví dụ: Tiền gửi.fee].

Liên kết động đa hình và liên kết động gõ vịt [đôi khi cũng được gọi là đa hình khi được sử dụng trong bối cảnh kế thừa] là khả năng sử dụng một thể hiện mà không liên quan đến loại của nó. Nó được xử lý hoàn toàn thông qua quá trình tra cứu thuộc tính được mô tả để kế thừa trong phần trước. Bất cứ khi nào một thuộc tính được truy cập là obj.attr, attr được đặt bằng cách tìm kiếm trong trường hợp, định nghĩa lớp của trường hợp và sau đó là các lớp cơ sở, theo thứ tự đó . Trận đấu đầu tiên được tìm thấy được trả lại. Một khía cạnh quan trọng của quá trình ràng buộc này là nó độc lập với loại đối tượng obj là gì. Vì vậy, nếu bạn thực hiện một tra cứu như obj.name, nó sẽ hoạt động trên bất kỳ OBJ nào có thuộc tính tên. Đôi khi được gọi là gõ vịt liên quan đến câu ngạn ngữ nếu nó trông giống như, những kẻ thích, và đi bộ như một con vịt, thì đó là một con vịt. Các lập trình viên Python thường viết các chương trình dựa vào hành vi này. Ví dụ: nếu bạn muốn tạo một phiên bản tùy chỉnh của một đối tượng hiện có, bạn có thể kế thừa từ nó hoặc bạn có thể chỉ cần tạo một đối tượng hoàn toàn mới trông và hoạt động như nó nhưng không liên quan. Cách tiếp cận sau này thường được sử dụng để duy trì Một khớp nối lỏng lẻo của các thành phần chương trình. Ví dụ: mã có thể được viết để hoạt động với bất kỳ loại đối tượng nào miễn là nó có một tập hợp các phương thức nhất định. Một trong những ví dụ phổ biến nhất là với các đối tượng giống như tệp khác nhau được xác định trong thư viện tiêu chuẩn. Mặc dù các đối tượng này hoạt động như các tệp, nhưng chúng không kế thừa từ đối tượng tệp tích hợp. F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

123

Oopsla hè96]. Một khía cạnh tinh tế của thuật toán này là một số phân cấp lớp nhất định sẽ bị Python từ chối với một kiểu mẫu. Ở đây, một ví dụ: Lớp X [Đối tượng]: Pass Class Y [x]: Pass Class Z [X, Y]: Pass # typeerror. # Không thể tạo ra phân giải phương thức nhất quán thứ tự_ _

To call a static method, you just prefix it by the class name.You do not pass it any additional information. For example: x = Foo.add[3,4]

# x

= 7

A common use of static methods is in writing classes where you might have many different ways to create new instances. Because there can only be one _ _init_ _[] function, alternative creation functions are often defined as shown here: class Date[object]: def _ _init_ _[self,year,month,day]: self.year = year self.month = month self.day = day @staticmethod def now[]: t = time.localtime[] return Date[t.tm_year, t.tm_mon, t.tm_day] @staticmethod def tomorrow[]: t = time.localtime[time.time[]+86400] return Date[t.tm_year, t.tm_mon, t.tm_day] # a b c

Example of creating some dates = Date[1967, 4, 9] = Date.now[] # Calls static method now[] = Date.tomorrow[] # Calls static method tomorrow[]

Class methods are methods that operate on the class itself as an object. Defined using the @classmethod decorator, a class method is different than an instance method in that the class is passed as the first argument which is named cls by convention. For example: class Times[object]: factor = 1 @classmethod def mul[cls,x]: return cls.factor*x class TwoTimes[Times]: factor = 2 x = TwoTimes.mul[4]

# Calls Times.mul[TwoTimes, 4] -> 8

F

h Lib

fL

B

d

ff

124

Chapter 7 Classes and Object-Oriented Programming

In this example, notice how the class TwoTimes is passed to mul[] as an object. Although this example is esoteric, there are practical, but subtle, uses of class methods. As an example, suppose that you defined a class that inherited from the Date class shown previously and customized it slightly: class EuroDate[Date]: # Modify string conversion to use European dates def _ _str_ _[self]: return "%02d/%02d/%4d" % [self.day, self.month, self.year]

Because the class inherits from Date, it has all of the same features. However, the now[] and tomorrow[] methods are slightly broken. For example, if someone calls EuroDate.now[], a Date object is returned instead of a EuroDate object. A class method can fix this: class Date[object]: ... @classmethod def now[cls]: t = time.localtime[] # Create an object of the appropriate type return cls[t.tm_year, t.tm_month, t.tm_day] class EuroDate[Date]: ... a = Date.now[] b = EuroDate.now[]

# Calls Date.now[Date] and returns a Date # Calls Date.now[EuroDate] and returns a EuroDate

One caution about static and class methods is that Python does not manage these methods in a separate namespace than the instance methods. As a result, they can be invoked on an instance. For example: a = Date[1967,4,9] b = d.now[]

# Calls Date.now[Date]

This is potentially quite confusing because a call to d.now[] doesn’t really have anything to do with the instance d.This behavior is one area where the Python object system differs from that found in other OO languages such as Smalltalk and Ruby. In those languages, class methods are strictly separate from instance methods.

Properties Normally, when you access an attribute of an instance or a class, the associated value that is stored is returned. A property is a special kind of attribute that computes its value when accessed. Here is a simple example: class Circle[object]: def _ _init_ _[self,radius]: self.radius = radius # Some additional properties of Circles @property def area[self]: return math.pi*self.radius**2 @property def perimeter[self]: return 2*math.pi*self.radius

F

h Lib

fL

B

d

ff

Properties

125

The resulting Circle object behaves as follows: >>> c = Circle[4.0] >>> c.radius 4.0 >>> c.area 50.26548245743669 >>> c.perimeter 25.132741228718345 >>> c.area = 2 Traceback [most recent call last]: File "", line 1, in AttributeError: can't set attribute >>>

In this example, Circle instances have an instance variable c.radius that is stored. c.area and c.perimeter are simply computed from that value.The @property decorator makes it possible for the method that follows to be accessed as a simple attribute, without the extra [] that you would normally have to add to call the method.To the user of the object, there is no obvious indication that an attribute is being computed other than the fact that an error message is generated if an attempt is made to redefine the attribute [as shown in the AttributeError exception above]. Using properties in this way is related to something known as the Uniform Access Principle. Essentially, if you’re defining a class, it is always a good idea to make the programming interface to it as uniform as possible.Without properties, certain attributes of an object would be accessed as a simple attribute such as c.radius whereas other attributes would be accessed as methods such as c.area[]. Keeping track of when to add the extra [] adds unnecessary confusion. A property can fix this. Python programmers don’t often realize that methods themselves are implicitly handled as a kind of property. Consider this class: class Foo[object]: def _ _init_ _[self,name]: self.name = name def spam[self,x]: print["%s, %s" % [self.name, x]

Khi người dùng tạo một thể hiện như f = foo ["guido"] và sau đó truy cập f.spam, spam đối tượng hàm gốc không được trả về. Thay vào đó, bạn nhận được một cái gì đó được gọi là một phương thức ràng buộc, đó là một đối tượng đại diện cho cuộc gọi phương thức sẽ thực thi khi toán tử [] được gọi trên nó. Một phương thức ràng buộc giống như một hàm được đánh giá một phần trong đó tham số tự được điền vào, nhưng các đối số bổ sung vẫn cần được cung cấp bởi bạn khi bạn gọi nó bằng cách sử dụng []. Việc tạo đối tượng phương thức ràng buộc này được xử lý âm thầm thông qua Chức năng thuộc tính thực thi phía sau hậu trường. Khi bạn xác định các phương thức tĩnh và lớp bằng cách sử dụng @staticmethod và @ClassMethod, bạn thực sự chỉ định việc sử dụng một hàm thuộc tính khác sẽ xử lý quyền truy cập vào các phương thức đó theo một cách khác. Ví dụ: @staticmethod chỉ cần trả lại chức năng phương thức trở lại như là mà không có bất kỳ gói hoặc xử lý đặc biệt nào. Các thuộc tính cũng có thể chặn các hoạt động để đặt và xóa một thuộc tính. Điều này được thực hiện bằng cách đính kèm các phương thức setter và deleter bổ sung vào một thuộc tính. Đây là một ví dụ:

F

H lib

fl

B

d

ff

126

Chương 7 Các lớp và lập trình hướng đối tượng

lớp foo [đối tượng]: def _ _init_ _ [self, name]: self._ _name = name @property def name [self]: return self. . "] n = f.name f.name =" monty "f.name = 45 del f.name

# # # #

cuộc gọi cuộc gọi cuộc gọi

f.name [] -Nhận hàm setter tên [f, "monty"] tên setter [f, 45] -> typeerror deleter name [f] -> typeerror

Trong ví dụ này, tên thuộc tính lần đầu tiên được xác định là thuộc tính chỉ đọc bằng cách sử dụng trình trang trí @property và phương thức liên kết. thuộc tính tên. Tên của các phương thức này phải khớp chính xác với tên của thuộc tính gốc. Trong các phương thức này, lưu ý rằng giá trị thực của tên được lưu trữ trong một thuộc tính _ _name. Tên của thuộc tính được lưu trữ không phải tuân theo bất kỳ quy ước nào, nhưng nó phải khác với thuộc tính để phân biệt nó với tên của chính tài sản. Trong mã cũ hơn, bạn sẽ thường thấy các thuộc tính được xác định bằng thuộc tính [getf = none, setf = none, delf = none, doc = none] với một tập hợp các phương thức được đặt tên duy nhất để thực hiện từng thao tác. Ví dụ: Lớp foo [Object]: def getName [self]: return self._ _name def setName [self, value]: nếu không isInstance [giá trị, str]: tăng loại interror ["phải là một chuỗi!"] Tự. _ _name = value def delname [self]: nâng TypeError ["Không thể xóa tên"] name = property [getName, setName, delname]

Cách tiếp cận cũ này vẫn được hỗ trợ, nhưng phiên bản trang trí có xu hướng dẫn đến các lớp học được đánh bóng hơn một chút. Ví dụ: nếu bạn sử dụng các trình trang trí, các chức năng GET, SET và XÓA cũng có thể nhìn thấy như các phương pháp.

Các mô tả với các thuộc tính, quyền truy cập vào một thuộc tính được kiểm soát bởi một loạt các hàm GE, đặt và xóa do người dùng xác định. Đây là loại điều khiển thuộc tính này có thể được khái quát hóa thêm thông qua việc sử dụng đối tượng mô tả. Một mô tả chỉ đơn giản là một đối tượng đại diện cho giá trị của một thuộc tính. Bằng cách triển khai một hoặc nhiều phương thức đặc biệt _ _get_ _ [], _ _set_ _ [] và _ _delete_ _ [], nó có thể nối vào cơ chế truy cập thuộc tính và có thể tùy chỉnh các hoạt động đó. Đây là một ví dụ:

F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

127

lớp foo [đối tượng]: def _ _init_ _ [self, name]: self._ _name = name @property def name [self]: return self. . "] n = f.name f.name =" monty "f.name = 45 del f.name

# # # #

cuộc gọi cuộc gọi cuộc gọi

Mô tả chỉ có thể được khởi tạo ở cấp lớp. Việc tạo các mô tả trên cơ sở trên cơ sở trên cơ sở bằng cách tạo các đối tượng mô tả bên trong _ _init_ _ [] và các phương thức khác. Ngoài ra, tên thuộc tính được sử dụng bởi lớp để giữ một mô tả được ưu tiên hơn các thuộc tính được lưu trữ trên các trường hợp. Trong ví dụ trước, đây là lý do tại sao đối tượng mô tả lấy tham số tên và tại sao tên được thay đổi một chút bằng cách chèn một dấu gạch dưới hàng đầu. Để người mô tả lưu trữ một giá trị trên ví dụ, nó phải chọn một cái tên khác với bản mô tả được sử dụng bởi chính mô tả.

Đóng gói dữ liệu và các thuộc tính riêng tư theo mặc định, tất cả các thuộc tính và phương thức của một lớp là công khai. Điều này có nghĩa là tất cả chúng đều có thể truy cập mà không có bất kỳ hạn chế nào. Nó cũng ngụ ý rằng mọi thứ được xác định trong một lớp cơ sở đều được kế thừa và có thể truy cập trong một lớp dẫn xuất. Hành vi này thường không mong muốn trong các ứng dụng hướng đối tượng vì nó phơi bày việc thực hiện nội bộ của một đối tượng và có thể dẫn đến xung đột không gian tên giữa lớp và những người được xác định trong một lớp cơ sở. Để khắc phục sự cố này, tất cả các tên trong một lớp bắt đầu bằng một dấu gạch dưới kép, chẳng hạn như _ _foo, tự động bị xáo trộn để tạo thành một tên mới của biểu mẫu _ClassName_ _foo. Điều này có hiệu quả cung cấp một cách để một lớp có các thuộc tính và phương thức riêng tư vì các tên riêng được sử dụng trong một lớp dẫn xuất won va chạm với cùng tên riêng được sử dụng trong một lớp cơ sở. Ở đây, một ví dụ: Lớp A [đối tượng]: def _ _init_ _ [self]: self._ _x = 3 def _ _spam [self]: pass def Bar [self]: self._ _spam []

# Mangled to self._a_ _x # Mangled to _a_ _spam []

# Chỉ gọi A._ _Spam []

F

H lib

fl

B

d

ff

128

Chương 7 Các lớp và lập trình hướng đối tượng

Lớp B [a]: def _ _init_ _ [self]: a._ _init_ _ [self] self._ _x = 37 def _ _spam [self]: Pass Pass

# Mangled to self._b_ _x # Mangled to _b_ _spam []

Mặc dù sơ đồ này cung cấp ảo tưởng về việc ẩn dữ liệu, nhưng không có cơ chế nghiêm ngặt nào để thực sự ngăn chặn quyền truy cập vào các thuộc tính riêng tư của một lớp. Cụ thể, nếu tên của lớp và thuộc tính riêng tương ứng được biết đến, chúng có thể được truy cập bằng cách sử dụng tên bị hỏng. Một lớp có thể làm cho các thuộc tính này ít được nhìn thấy bằng cách xác định lại phương thức _ _DIR_ _ [], cung cấp danh sách các tên được trả về bởi hàm Dir [] mà sử dụng để kiểm tra các đối tượng. Mặc dù tên này có thể trông giống như một bước xử lý bổ sung, quá trình xáo trộn thực sự chỉ xảy ra một lần tại thời điểm một lớp được xác định. Nó không xảy ra trong quá trình thực hiện các phương thức, cũng không thêm chi phí để thực hiện chương trình. Ngoài ra, hãy lưu ý rằng tên xáo trộn không xảy ra trong các hàm như getAttr [], hasAttr [], setAttr [] hoặc delattr [] trong đó tên thuộc tính được chỉ định là chuỗi. Đối với các chức năng này, bạn cần sử dụng rõ ràng tên được xử lý như _ClassName_ _Name để truy cập thuộc tính. Chúng tôi nên sử dụng các thuộc tính riêng tư khi xác định các thuộc tính có thể thay đổi thông qua các thuộc tính. Bằng cách làm như vậy, bạn sẽ khuyến khích người dùng sử dụng tên thuộc tính thay vì truy cập trực tiếp vào dữ liệu phiên bản cơ bản [có lẽ không phải là những gì bạn dự định nếu bạn gói nó bằng một thuộc tính để bắt đầu]. Một ví dụ về điều này xuất hiện trong phần trước. Đặt một phương pháp một tên riêng là một kỹ thuật mà một siêu lớp có thể sử dụng để ngăn chặn một lớp có nguồn gốc xác định lại và thay đổi việc thực hiện một phương thức. Ví dụ: phương thức a.bar [] trong ví dụ chỉ gọi a._ _spam [], bất kể loại bản thân hoặc sự hiện diện của phương thức _ _spam [] khác trong một lớp dẫn xuất. Cuối cùng, don lồng nhầm lẫn việc đặt tên của các thuộc tính lớp tư nhân với việc đặt tên của các định nghĩa riêng tư trong một mô -đun. Một sai lầm phổ biến là xác định một lớp trong đó một dấu gạch dưới hàng đầu được sử dụng trên các tên thuộc tính trong nỗ lực ẩn các giá trị của chúng [ví dụ: _NAME]. Trong các mô -đun, quy ước đặt tên này ngăn chặn các tên được xuất bởi câu lệnh nhập từ mô -đun *. Tuy nhiên, trong các lớp, quy ước đặt tên này không che giấu thuộc tính cũng như không ngăn chặn các cuộc đụng độ tên phát sinh nếu ai đó kế thừa từ lớp và định nghĩa một thuộc tính hoặc phương thức mới có cùng tên.

Quản lý bộ nhớ đối tượng Khi một lớp được xác định, lớp kết quả là một nhà máy để tạo các trường hợp mới. Ví dụ: Lớp Circle [Object]: def _ _init_ _ [self, RADIUS]: self.radius = RADIUS # Tạo một số phiên bản vòng tròn C = Circle [4.0] D = Circle [5.0]

F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

129

The creation of an instance is carried out in two steps using the special method _ _new_ _[], which creates a new instance, and _ _init_ _[], which initializes it. For example, the operation c = Circle[4.0] performs these steps: c = Circle._ _new_ _[Circle, 4.0] if isinstance[c,Circle]: Circle._ _init_ _[c,4.0]

The _ _new_ _[] method of a class is something that is rarely defined by user code. If it is defined, it is typically written with the prototype _ _new_ _[cls, *args, **kwargs] where args and kwargs are the same arguments that will be passed to _ _init_ _[]. _ _new_ _[] is always a class method that receives the class object as the first parameter. Although _ _new_ _[] creates an instance, it does not automatically call _ _init_ _[]. If you see _ _new_ _[] defined in a class, it usually means the class is doing one of two things. First, the class might be inheriting from a base class whose instances are immutable.This is common if defining objects that inherit from an immutable built-in type such as an integer, string, or tuple because _ _new_ _[] is the only method that executes prior to the instance being created and is the only place where the value could be modified [in _ _init_ _[], it would be too late]. For example: class Upperstr[str]: def _ _new_ _[cls,value=""]: return str._ _new_ _[cls, value.upper[]] u = Upperstr["hello"]

# value is "HELLO"

The other major use of _ _new_ _[] is when defining metaclasses.This is described at the end of this chapter. Once created, instances are managed by reference counting. If the reference count reaches zero, the instance is immediately destroyed.When the instance is about to be destroyed, the interpreter first looks for a _ _del_ _[] method associated with the object and calls it. In practice, it’s rarely necessary for a class to define a _ _del_ _[] method.The only exception is when the destruction of an object requires a cleanup action such as closing a file, shutting down a network connection, or releasing other system resources. Even in these cases, it’s dangerous to rely on _ _del_ _[] for a clean shutdown because there’s no guarantee that this method will be called when the interpreter exits. A better approach may be to define a method such as close[] that a program can use to explicitly perform a shutdown. Occasionally, a program will use the del statement to delete a reference to an object. If this causes the reference count of the object to reach zero, the _ _del_ _[] method is called. However, in general, the del statement doesn’t directly call _ _del_ _[]. A subtle danger involving object destruction is that instances for which _ _del_ _[] is defined cannot be collected by Python’s cyclic garbage collector [which is a strong reason not to define _ _del_ _ unless you need to]. Programmers coming from languages without automatic garbage collection [e.g., C++] should take care not to adopt a programming style where _ _del_ _[] is unnecessarily defined. Although it is rare to break the garbage collector by defining _ _del_ _[], there are certain types of programming patterns, especially those involving parent-child relationships or graphs, where this

F

h Lib

fL

B

d

ff

130

Chapter 7 Classes and Object-Oriented Programming

can be a problem. For example, suppose you had an object that was implementing a variant of the “Observer Pattern.” class Account[object]: def _ _init_ _[self,name,balance]: self.name = name self.balance = balance self.observers = set[] def _ _del_ _[self]: for ob in self.observers: ob.close[] del self.observers def register[self,observer]: self.observers.add[observer] def unregister[self,observer]: self.observers.remove[observer] def notify[self]: for ob in self.observers: ob.update[] def withdraw[self,amt]: self.balance -= amt self.notify[] class AccountObserver[object]: def _ _init_ _[self, theaccount]: self.theaccount = theaccount theaccount.register[self] def _ _del_ _[self]: self.theaccount.unregister[self] del self.theaccount def update[self]: print["Balance is %0.2f" % self.theaccount.balance] def close[self]: print["Account no longer in use"] # Example setup a = Account['Dave',1000.00] a_ob = AccountObserver[a]

In this code, the Account class allows a set of AccountObserver objects to monitor an Account instance by receiving an update whenever the balance changes.To do this, each Account keeps a set of the observers and each AccountObserver keeps a reference back to the account. Each class has defined _ _del_ _[] in an attempt to provide some sort of cleanup [such as unregistering and so on]. However, it just doesn’t work. Instead, the classes have created a reference cycle in which the reference count never drops to 0 and there is no cleanup. Not only that, the garbage collector [the gc module] won’t even clean it up, resulting in a permanent memory leak. One way to fix the problem shown in this example is for one of the classes to create a weak reference to the other using the weakref module. A weak reference is a way of creating a reference to an object without increasing its reference count.To work with a weak reference, you have to add an extra bit of functionality to check whether the object being referred to still exists. Here is an example of a modified observer class: import weakref class AccountObserver[object]: def _ _init_ _[self, theaccount]: self.accountref = weakref.ref[theaccount] theaccount.register[self]

# Tạo một yếu

F

H lib

fl

B

d

ff

Biểu diễn đối tượng và ràng buộc thuộc tính

131

def _ _del_ _ [self]: acc = self.AccountRef [] # Nhận tài khoản nếu ACC: # ungister nếu vẫn tồn tại acc.unregister [self] def update [self]: in ["Số dư là % 0,2f" % self. accountref []. Cân bằng] def Close [self]: in ["tài khoản không còn sử dụng"] # Ví dụ Cài đặt A = tài khoản ['Dave', 1000.00] A_OB = AccountObserver [A]

Trong ví dụ này, một Accountref tham chiếu yếu được tạo. Để truy cập vào tài khoản cơ bản, bạn gọi nó giống như một hàm. Điều này hoặc trả về tài khoản hoặc không có nếu nó không còn xung quanh nữa. Với sửa đổi này, không còn một chu kỳ tham chiếu nữa. Nếu đối tượng tài khoản bị phá hủy, phương thức _ _del_ _ của nó sẽ chạy và các nhà quan sát nhận được thông báo. Mô -đun GC cũng hoạt động đúng. Thông tin thêm về mô -đun yếu có thể được tìm thấy trong Chương 13, Dịch vụ thời gian chạy của Python.

Biểu diễn đối tượng và ràng buộc thuộc tính bên trong, các trường hợp được triển khai bằng cách sử dụng từ điển có thể truy cập được như là phiên bản __DICT__ thuộc tính. Từ điển này chứa dữ liệu mà duy nhất cho mỗi trường hợp. Ở đây, một ví dụ: >>> a = tài khoản ['guido', 1100.0] >>> a._ _dict_ _ {'aland': 1100.0, 'name': 'guido'}

Các thuộc tính mới có thể được thêm vào một ví dụ bất cứ lúc nào, như thế này: A.Number = 123456

# Thêm thuộc tính 'Số' vào A._ _DICT_ _

Các sửa đổi cho một thể hiện luôn được phản ánh trong thuộc tính _ _dict_ _ cục bộ. Tương tự như vậy, nếu bạn thực hiện các sửa đổi thành _ _dict_ _ trực tiếp, những sửa đổi đó được phản ánh trong các thuộc tính. Các trường hợp được liên kết trở lại lớp của họ bởi một thuộc tính đặc biệt _ _Class_ _. Bản thân lớp cũng chỉ là một lớp mỏng trên một từ điển có thể được tìm thấy trong thuộc tính _ _dict_ _ của chính nó. Từ điển lớp là nơi bạn tìm thấy các phương thức. Ví dụ: >>> A._ _Class_ _

>>> tài khoản._ _dict_ _.Keys [] ['_ _dict_ _', '_ _module_ _', 'yêu cầu', 'tiền gửi', 'rút', '_ _del_ _', 'num_accounts', '_ _ _ ',' _ _doc_ _ ',' _ _init_ _ '] >>>>

Cuối cùng, các lớp được liên kết với các lớp cơ sở của chúng trong một thuộc tính đặc biệt _ _Base_ _, đây là một bộ thuật của các lớp cơ sở. Cấu trúc cơ bản này là cơ sở cho tất cả các hoạt động có được, đặt và xóa các thuộc tính của các đối tượng. Bất cứ khi nào một thuộc tính được đặt bằng obj.name = value, phương thức đặc biệt obj._ _setAttr_ _ ["name", value] được gọi. Nếu một thuộc tính bị xóa bằng del obj.name, phương thức đặc biệt obj._ _delattr_ _ ["name"] sẽ được gọi. thuộc tính xảy ra tương ứng với một thuộc tính hoặc mô tả. Trong

F

H lib

fl

B

d

ff

132

Biểu diễn đối tượng và ràng buộc thuộc tính

def _ _del_ _ [self]: acc = self.AccountRef [] # Nhận tài khoản nếu ACC: # ungister nếu vẫn tồn tại acc.unregister [self] def update [self]: in ["Số dư là % 0,2f" % self. accountref []. Cân bằng] def Close [self]: in ["tài khoản không còn sử dụng"] # Ví dụ Cài đặt A = tài khoản ['Dave', 1000.00] A_OB = AccountObserver [A]

Trong ví dụ này, một Accountref tham chiếu yếu được tạo. Để truy cập vào tài khoản cơ bản, bạn gọi nó giống như một hàm. Điều này hoặc trả về tài khoản hoặc không có nếu nó không còn xung quanh nữa. Với sửa đổi này, không còn một chu kỳ tham chiếu nữa. Nếu đối tượng tài khoản bị phá hủy, phương thức _ _del_ _ của nó sẽ chạy và các nhà quan sát nhận được thông báo. Mô -đun GC cũng hoạt động đúng. Thông tin thêm về mô -đun yếu có thể được tìm thấy trong Chương 13, Dịch vụ thời gian chạy của Python.

_ _SLOTS_ _ Một lớp có thể hạn chế tập hợp các tên thuộc tính thể hiện pháp lý bằng cách xác định một biến đặc biệt gọi là _ _slots_ _. Ở đây, một ví dụ: Tài khoản lớp [đối tượng]: _ _SLOTS_ _ = ['tên', 'cân bằng'] ...

Khi _ _Slots_ _ được xác định, các tên thuộc tính có thể được gán trên các trường hợp được giới hạn trong các tên được chỉ định. Nếu không, một ngoại lệ thuộc tính được nâng lên. Hạn chế này ngăn ai đó thêm các thuộc tính mới vào các trường hợp hiện có và giải quyết vấn đề phát sinh nếu ai đó gán giá trị cho một thuộc tính mà họ có thể đánh vần chính xác. Trong thực tế, _ _Slots_ _ không bao giờ được triển khai để trở thành một tính năng an toàn. Thay vào đó, nó thực sự là một tối ưu hóa hiệu suất cho cả bộ nhớ và tốc độ thực hiện. Các thể hiện của một lớp sử dụng _ _SLOTS_ _ không còn sử dụng từ điển để lưu trữ dữ liệu thể hiện. Thay vào đó, một cấu trúc dữ liệu nhỏ gọn hơn nhiều dựa trên một mảng được sử dụng. Trong các chương trình mà

F

H lib

fl

B

d

ff

Quá tải người vận hành

133

Tạo một số lượng lớn các đối tượng, sử dụng _ _Slots_ _ có thể dẫn đến việc giảm đáng kể thời gian sử dụng và thực hiện bộ nhớ. Xin lưu ý rằng việc sử dụng _ _slots_ _ có tương tác khó khăn với kế thừa. Nếu một lớp kế thừa từ một lớp cơ sở sử dụng _ _slots_ _, thì nó cũng cần xác định _ _SLOTS_ _ để lưu trữ các thuộc tính của chính mình [ngay cả khi nó không thêm bất kỳ] để tận dụng lợi ích _ _SLOTS_ _ cung cấp. Nếu bạn quên điều này, lớp dẫn xuất sẽ chạy chậm hơn và sử dụng nhiều bộ nhớ hơn so với những gì đã được sử dụng nếu _ _slots_ _ chưa được sử dụng trên bất kỳ lớp nào! Việc sử dụng _ _Slots_ _ cũng có thể phá vỡ mã dự kiến ​​các trường hợp sẽ có thuộc tính _ _dict_ _ bên dưới. Mặc dù điều này thường không áp dụng cho mã người dùng, các thư viện tiện ích và các công cụ khác để hỗ trợ các đối tượng có thể được lập trình để xem _ _dict_ _ để gỡ lỗi, tuần tự hóa các đối tượng và các hoạt động khác. Cuối cùng, sự hiện diện của _ _Slots_ _ không có tác dụng đối với việc gọi các phương thức như _ _getAttribution_ _ [], _ _getAttr_ _ [] và _ _setAttr_ _ [] nếu chúng được xác định lại trong một lớp. Tuy nhiên, hành vi mặc định của các phương thức này sẽ tính đến _ _SLOTS_ _. Ngoài ra, cần nhấn mạnh rằng không cần thiết phải thêm tên phương thức hoặc thuộc tính vào _ _Slots_ _, vì chúng được lưu trữ trong lớp, không phải trên cơ sở trên cơ sở.

Nhà điều hành quá tải các đối tượng do người dùng xác định có thể được thực hiện để hoạt động với tất cả các toán tử tích hợp Python, bằng cách thêm các phương thức đặc biệt được mô tả trong Chương 3 vào một lớp. Ví dụ: nếu bạn muốn thêm một loại số mới vào Python, bạn có thể xác định một lớp trong đó các phương pháp đặc biệt như _ _add_ _ [] được xác định để làm cho các trường hợp hoạt động với các toán tử toán học tiêu chuẩn. Ví dụ sau đây cho thấy cách thức này hoạt động bằng cách xác định một lớp thực hiện các số phức tạp với một số toán tử toán học tiêu chuẩn. Lưu ý Vì Python đã cung cấp một loại số phức, lớp này chỉ được cung cấp cho mục đích minh họa.

lớp phức tạp [đối tượng]: def _ _init_ _ [self, real, hình ảnh = 0]: self.real = float [real] self.imag = float [hình ảnh] def _ _repr_ _ [self]: return "phức tạp [%s ,%s] "%[self.real, self.imag] def _ _str_ _ [self]: return" [%g +%gj] "%[self.real, self.imag] # self + other def _ _add_ _ . self.imag - other.imag]

Trong ví dụ, phương thức _ _REPR_ _ [] tạo ra một chuỗi có thể được đánh giá để tạo lại đối tượng [nghĩa là "phức tạp [thực, hình ảnh]"]. Công ước này nên được tuân theo cho tất cả các đối tượng do người dùng xác định nếu có. Mặt khác, phương thức _ _str_ _ []

F

H lib

fl

B

d

ff

134

Quá tải người vận hành

Tạo một số lượng lớn các đối tượng, sử dụng _ _Slots_ _ có thể dẫn đến việc giảm đáng kể thời gian sử dụng và thực hiện bộ nhớ. Xin lưu ý rằng việc sử dụng _ _slots_ _ có tương tác khó khăn với kế thừa. Nếu một lớp kế thừa từ một lớp cơ sở sử dụng _ _slots_ _, thì nó cũng cần xác định _ _SLOTS_ _ để lưu trữ các thuộc tính của chính mình [ngay cả khi nó không thêm bất kỳ] để tận dụng lợi ích _ _SLOTS_ _ cung cấp. Nếu bạn quên điều này, lớp dẫn xuất sẽ chạy chậm hơn và sử dụng nhiều bộ nhớ hơn so với những gì đã được sử dụng nếu _ _slots_ _ chưa được sử dụng trên bất kỳ lớp nào! Việc sử dụng _ _Slots_ _ cũng có thể phá vỡ mã dự kiến ​​các trường hợp sẽ có thuộc tính _ _dict_ _ bên dưới. Mặc dù điều này thường không áp dụng cho mã người dùng, các thư viện tiện ích và các công cụ khác để hỗ trợ các đối tượng có thể được lập trình để xem _ _dict_ _ để gỡ lỗi, tuần tự hóa các đối tượng và các hoạt động khác. Cuối cùng, sự hiện diện của _ _Slots_ _ không có tác dụng đối với việc gọi các phương thức như _ _getAttribution_ _ [], _ _getAttr_ _ [] và _ _setAttr_ _ [] nếu chúng được xác định lại trong một lớp. Tuy nhiên, hành vi mặc định của các phương thức này sẽ tính đến _ _SLOTS_ _. Ngoài ra, cần nhấn mạnh rằng không cần thiết phải thêm tên phương thức hoặc thuộc tính vào _ _Slots_ _, vì chúng được lưu trữ trong lớp, không phải trên cơ sở trên cơ sở.

Hoạt động C + 4.0 hoạt động một phần do tai nạn. Tất cả các số tích hợp Python đã có các thuộc tính .real và .imag, vì vậy chúng đã được sử dụng trong tính toán. Nếu đối tượng khác không có các thuộc tính này, việc triển khai sẽ bị phá vỡ. Nếu bạn muốn việc triển khai phức tạp của mình hoạt động với các đối tượng thiếu các thuộc tính này, bạn phải thêm mã chuyển đổi bổ sung để trích xuất thông tin cần thiết [có thể phụ thuộc vào loại đối tượng khác]. Hoạt động 4.0 + C hoàn toàn không hoạt động vì loại điểm nổi tích hợp không biết gì về lớp phức tạp. Để khắc phục điều này, bạn có thể thêm các phương thức đảo ngược vào phức tạp: phức hợp lớp [đối tượng]: ... def _ _radd_ _ [self, other]: return phức tạp [khác. .Imag - self.img] ...

Những phương pháp này phục vụ như một dự phòng. Nếu hoạt động 4.0 + C không thành công, Python sẽ cố gắng thực thi c._ _radd_ _ [4.0] trước khi phát hành một kiểu. Các phiên bản cũ của Python đã thử các cách tiếp cận khác nhau để ép buộc trong các hoạt động hỗn hợp. Ví dụ: bạn có thể gặp các lớp Python kế thừa thực hiện phương thức _ _Coerce_ _ []. Điều này không còn được sử dụng bởi Python 2.6 hoặc Python 3. Ngoài ra, đừng bị đánh lừa bằng các phương pháp đặc biệt như _ _int_ _ [], _ _FLOAT_ _ [] hoặc _ _complex_ _ []. Mặc dù các phương pháp này được gọi bằng các chuyển đổi rõ ràng như int [x] hoặc float [x], chúng không bao giờ được gọi là ngầm để thực hiện chuyển đổi loại trong số học loại hỗn hợp. Vì vậy, nếu bạn đang viết các lớp trong đó các nhà khai thác phải làm việc với các loại hỗn hợp, bạn phải xử lý rõ ràng việc chuyển đổi loại trong việc thực hiện từng toán tử.

Các loại và các bài kiểm tra thành viên lớp Khi bạn tạo một thể hiện của một lớp, loại phiên bản đó là bản thân lớp. Để kiểm tra thành viên trong một lớp, sử dụng chức năng tích hợp isInstance [obj, cname].

F

H lib

fl

B

d

ff

Các loại và bài kiểm tra thành viên của lớp

135

Hàm trả về true nếu một đối tượng, obj, thuộc về lớp cname hoặc bất kỳ lớp nào có nguồn gốc từ cname. Ở đây, một ví dụ: Lớp A [đối tượng]: Pass Class B [a]: Pass Class C [Object]: Pass A = A [] B = B [] C = C []

# Phiên bản của 'A' # phiên bản của 'B' # của 'C'

loại [a] isinstance [a, a] isinstance [b, a] isinstance [b, c]

# # # #

Trả về trả về trả về

đối tượng lớp là sự thật, b có nguồn gốc từ sai, c không xuất phát từ

Tương tự, chức năng tích hợp ISSUBCLASS [A, B] Trả về true nếu lớp A là một lớp con của lớp B. Ở đây, một ví dụ: ISSUBCLASS [B, A] ISSUBCLASS [C, A]

# Trả về đúng # trả về sai

Một vấn đề tinh tế với việc kiểm tra loại đối tượng là các lập trình viên thường bỏ qua sự kế thừa và chỉ cần tạo các đối tượng bắt chước hành vi của một đối tượng khác. Ví dụ, hãy xem xét hai lớp sau: Class foo [Object]: Def Spam [self, a, b]: pass fooproxy [object]: def _ _init_ _ [self, f]: self.f = f def spam [ tự, a, b]: return self.f.spam [a, b]

Trong ví dụ này, Fooproxy có chức năng giống hệt với FOO. Nó thực hiện các phương thức tương tự, và nó thậm chí còn sử dụng foo bên dưới vỏ. Ví dụ: f = foo [] g = fooproxy [f] isinstance [g, foo]

# Tạo foo # Tạo fooproxy # trả về sai

Nếu một chương trình đã được viết để kiểm tra rõ ràng một foo sử dụng isinstance [], thì nó chắc chắn đã giành được công việc với một đối tượng fooproxy. Tuy nhiên, mức độ nghiêm ngặt này thường không chính xác những gì bạn muốn. Thay vào đó, có thể có ý nghĩa hơn khi khẳng định rằng một đối tượng có thể được sử dụng đơn giản là foo vì nó có cùng giao diện. Để làm điều này, có thể xác định một đối tượng xác định lại hành vi của isInstance [] và phát hành class [] cho Mục đích của việc nhóm các đối tượng lại với nhau và kiểm tra loại. Đây là một ví dụ: lớp iclass [đối tượng]: def _ _init_ _ [self]: self.implementors = set [] def register [self, c]: self. ]: return self

F

H lib

fl

B

d

ff

136

Các loại và bài kiểm tra thành viên của lớp

Hàm trả về true nếu một đối tượng, obj, thuộc về lớp cname hoặc bất kỳ lớp nào có nguồn gốc từ cname. Ở đây, một ví dụ: Lớp A [đối tượng]: Pass Class B [a]: Pass Class C [Object]: Pass A = A [] B = B [] C = C []

# Phiên bản của 'A' # phiên bản của 'B' # của 'C'

a Foo a FooProxy Returns True Returns True Returns True

In this example, it’s important to emphasize that no strong type-checking is occurring. The IFoo object has overloaded the instance checking operations in a way that allows a you to assert that a class belongs to a group. It doesn’t assert any information on the actual programming interface, and no other verification actually occurs. In fact, you can simply register any collection of objects you want to group together without regard to how those classes are related to each other.Typically, the grouping of classes is based on some criteria such as all classes implementing the same programming interface. However, no such meaning should be inferred when overloading _ _instancecheck_ _[] or _ _subclasscheck_ _[].The actual interpretation is left up to the application. Python provides a more formal mechanism for grouping objects, defining interfaces, and type-checking.This is done by defining an abstract base class, which is defined in the next section.

Abstract Base Classes In the last section, it was shown that the isinstance[] and issubclass[] operations can be overloaded.This can be used to create objects that group similar classes together and to perform various forms of type-checking. Abstract base classes build upon this concept and provide a means for organizing objects into a hierarchy, making assertions about required methods, and so forth. To define an abstract base class, you use the abc module.This module defines a metaclass [ABCMeta] and a set of decorators [@abstractmethod and @abstractproperty] that are used as follows: from abc import ABCMeta, abstractmethod, abstractproperty class Foo: # In Python 3, you use the syntax _ _metaclass_ _ = ABCMeta # class Foo[metaclass=ABCMeta] @abstractmethod def spam[self,a,b]: pass @abstractproperty

F

h Lib

fL

B

d

ff

Abstract Base Classes

137

def name[self]: pass

The definition of an abstract class needs to set its metaclass to ABCMeta as shown [also, be aware that the syntax differs between Python 2 and 3].This is required because the implementation of abstract classes relies on a metaclass [described in the next section]. Within the abstract class, the @abstractmethod and @abstractproperty decorators specify that a method or property must be implemented by subclasses of Foo. An abstract class is not meant to be instantiated directly. If you try to create a Foo for the previous class, you will get the following error: >>> f = Foo[] Traceback [most recent call last]: File "", line 1, in TypeError: Can't instantiate abstract class Foo with abstract methods spam >>>

This restriction carries over to derived classes as well. For instance, if you have a class Bar that inherits from Foo but it doesn’t implement one or more of the abstract methods, attempts to create a Bar will fail with a similar error. Because of this added checking, abstract classes are useful to programmers who want to make assertions on the methods and properties that must be implemented on subclasses. Although an abstract class enforces rules about methods and properties that must be implemented, it does not perform conformance checking on arguments or return values.Thus, an abstract class will not check a subclass to see whether a method has used the same arguments as an abstract method. Likewise, an abstract class that requires the definition of a property does not check to see whether the property in a subclass supports the same set of operations [get, set, and delete] of the property specified in a base. Although an abstract class can not be instantiated, it can define methods and properties for use in subclasses. Moreover, an abstract method in the base can still be called from a subclass. For example, calling Foo.spam[a,b] from the subclass is allowed. Abstract base classes allow preexisting classes to be registered as belonging to that base.This is done using the register[] method as follows: class Grok[object]: def spam[self,a,b]: print["Grok.spam"] Foo.register[Grok]

# Register with Foo abstract base class

When a class is registered with an abstract base, type-checking operations involving the abstract base [such as isinstance[] and issubclass[]] will return True for instances of the registered class.When a class is registered with an abstract class, no checks are made to see whether the class actually implements any of the abstract methods or properties.This registration process only affects type-checking. It does not add extra error checking to the class that is registered. Unlike many other object-oriented languages, Python’s built-in types are organized into a relatively flat hierarchy. For example, if you look at the built-in types such as int or float, they directly inherit from object, the root of all objects, instead of an intermediate base class representing numbers.This makes it clumsy to write programs that want to inspect and manipulate objects based on a generic category such as simply being an instance of a number.

F

H lib

fl

B

d

ff

138

Chương 7 Các lớp và lập trình hướng đối tượng

Cơ chế lớp trừu tượng giải quyết vấn đề này bằng cách cho phép các đối tượng có sẵn được tổ chức thành các phân cấp loại có thể xác định người dùng. Ngoài ra, một số mô-đun thư viện nhằm mục đích tổ chức các loại tích hợp theo các khả năng khác nhau mà chúng sở hữu. Mô-đun bộ sưu tập chứa các lớp cơ sở trừu tượng cho các loại hoạt động liên quan đến trình tự, bộ và từ điển. Mô-đun số chứa các lớp cơ sở trừu tượng liên quan đến tổ chức một hệ thống phân cấp số. Thông tin chi tiết có thể được tìm thấy trong Chương 14, Toán học, Hồi và Chương 15, cấu trúc dữ liệu, thuật toán và tiện ích.

Metaclasses Khi bạn xác định một lớp trong Python, bản thân định nghĩa lớp trở thành một đối tượng. Ở đây, một ví dụ: Lớp foo [đối tượng]: Pass isinstance [foo, object]

# Trả về đúng

Nếu bạn nghĩ về điều này đủ lâu, bạn sẽ nhận ra rằng một cái gì đó phải tạo ra đối tượng foo. Sự tạo ra đối tượng lớp này được điều khiển bởi một loại đối tượng đặc biệt được gọi là metaclass. Nói một cách đơn giản, một Metaclass là một đối tượng biết cách tạo và quản lý các lớp. Trong ví dụ trước, metaclass đang kiểm soát việc tạo FOO là một lớp được gọi là loại. Trên thực tế, nếu bạn hiển thị loại foo, bạn sẽ phát hiện ra rằng đó là một loại: >>> loại [foo]

Khi một lớp mới được xác định với câu lệnh lớp, một số điều xảy ra. Đầu tiên, phần thân của lớp được thực thi dưới dạng một loạt các câu trong từ điển riêng của nó. Việc thực hiện các câu lệnh giống hệt như trong mã thông thường với việc bổ sung tên xảy ra trên các thành viên riêng [tên bắt đầu bằng _ _]. Cuối cùng, tên của lớp, danh sách các lớp cơ sở và từ điển được chuyển cho hàm tạo của một metaclass để tạo đối tượng lớp tương ứng. Đây là một ví dụ về cách nó hoạt động: class_name = "foo" # tên của class_parents = [object,] # cơ sở class_body = "" " # class body def _ _init_ _ [self, x]: self.x = x def blah [self]: print ["hello world"] "" "class_dict = {} # thực thi cơ thể trong từ điển cục bộ class_dict exec [class_body, globals [], class_dict] , class_parents, class_dict]

Bước cuối cùng của việc tạo lớp trong đó loại metaclass [] được gọi có thể được tùy chỉnh. Sự lựa chọn về những gì xảy ra trong bước cuối cùng của định nghĩa lớp được kiểm soát trong

F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

139

Cơ chế lớp trừu tượng giải quyết vấn đề này bằng cách cho phép các đối tượng có sẵn được tổ chức thành các phân cấp loại có thể xác định người dùng. Ngoài ra, một số mô-đun thư viện nhằm mục đích tổ chức các loại tích hợp theo các khả năng khác nhau mà chúng sở hữu. Mô-đun bộ sưu tập chứa các lớp cơ sở trừu tượng cho các loại hoạt động liên quan đến trình tự, bộ và từ điển. Mô-đun số chứa các lớp cơ sở trừu tượng liên quan đến tổ chức một hệ thống phân cấp số. Thông tin chi tiết có thể được tìm thấy trong Chương 14, Toán học, Hồi và Chương 15, cấu trúc dữ liệu, thuật toán và tiện ích.

Metaclasses Khi bạn xác định một lớp trong Python, bản thân định nghĩa lớp trở thành một đối tượng. Ở đây, một ví dụ: Lớp foo [đối tượng]: Pass isinstance [foo, object]

# Trả về đúng

Nếu bạn nghĩ về điều này đủ lâu, bạn sẽ nhận ra rằng một cái gì đó phải tạo ra đối tượng foo. Sự tạo ra đối tượng lớp này được điều khiển bởi một loại đối tượng đặc biệt được gọi là metaclass. Nói một cách đơn giản, một Metaclass là một đối tượng biết cách tạo và quản lý các lớp. Trong ví dụ trước, metaclass đang kiểm soát việc tạo FOO là một lớp được gọi là loại. Trên thực tế, nếu bạn hiển thị loại foo, bạn sẽ phát hiện ra rằng đó là một loại: >>> loại [foo]

Khi một lớp mới được xác định với câu lệnh lớp, một số điều xảy ra. Đầu tiên, phần thân của lớp được thực thi dưới dạng một loạt các câu trong từ điển riêng của nó. Việc thực hiện các câu lệnh giống hệt như trong mã thông thường với việc bổ sung tên xảy ra trên các thành viên riêng [tên bắt đầu bằng _ _]. Cuối cùng, tên của lớp, danh sách các lớp cơ sở và từ điển được chuyển cho hàm tạo của một metaclass để tạo đối tượng lớp tương ứng. Đây là một ví dụ về cách nó hoạt động: class_name = "foo" # tên của class_parents = [object,] # cơ sở class_body = "" " # class body def _ _init_ _ [self, x]: self.x = x def blah [self]: print ["hello world"] "" "class_dict = {} # thực thi cơ thể trong từ điển cục bộ class_dict exec [class_body, globals [], class_dict] , class_parents, class_dict]

Bước cuối cùng của việc tạo lớp trong đó loại metaclass [] được gọi có thể được tùy chỉnh. Sự lựa chọn về những gì xảy ra trong bước cuối cùng của định nghĩa lớp được kiểm soát trong

Trong metaclass này, phương thức _ _init_ _ [] đã được viết để kiểm tra nội dung của từ điển lớp. Nó quét từ điển tìm kiếm các phương thức và kiểm tra xem liệu tất cả chúng có có chuỗi tài liệu hay không. Nếu không, một ngoại lệ loại được tạo ra. Mặt khác, việc triển khai mặc định của loại._ _init_ _ [] được gọi để khởi tạo lớp. Để sử dụng metaclass này, một lớp cần chọn rõ ràng nó. Kỹ thuật phổ biến nhất để thực hiện điều này là trước tiên để xác định một lớp cơ sở, chẳng hạn như sau: Lớp được ghi lại: _ _Metaclass_ _ = DocMeta

# Trong Python 3, hãy sử dụng Cú pháp # Lớp được ghi lại [metaclass = DocMeta]

F

H lib

fl

B

d

ff

140

Chương 7 Các lớp và lập trình hướng đối tượng

Lớp cơ sở này sau đó được sử dụng làm cha mẹ cho tất cả các đối tượng sẽ được ghi lại. Ví dụ: Lớp FOO [tài liệu]: Spam [tự, A, B]: "Spam làm gì đó" vượt qua

Ví dụ này minh họa một trong những cách sử dụng chính của các metaclass, đó là kiểm tra và thu thập thông tin về các định nghĩa của lớp. Metaclass không thay đổi bất cứ điều gì về lớp thực sự được tạo nhưng chỉ đơn thuần là thêm một số kiểm tra bổ sung. Trong các ứng dụng Metaclass nâng cao hơn, một Metaclass có thể kiểm tra và thay đổi nội dung của định nghĩa lớp trước khi tạo lớp. Nếu các thay đổi sẽ được thực hiện, bạn nên xác định lại phương thức _ _New_ _ [] chạy trước khi tạo bản thân lớp. Kỹ thuật này thường được kết hợp với các kỹ thuật bao bọc các thuộc tính với các mô tả hoặc thuộc tính vì đó là một cách để nắm bắt Các tên đang được sử dụng trong lớp. Ví dụ, đây là phiên bản sửa đổi của bộ mô tả typedproperty đã được sử dụng trong phần Mô tả của Cameron type = type if default: self.default = mặc định khác: self.default = type [] def _ _get_ _ [self, fory, cls]: return getAttr [instance, self.name, self.default] def _ _set_ _ [ bản thân, ví dụ, giá trị]: Nếu không phải là isInstance [value, self.type]: tăng loại horror ["phải là % s" % self.type] setAttr [ví dụ, self.name, value] def _ _delete_ _ [self, phiên bản]: Raise ApertyError ["Không thể xóa thuộc tính"]

Trong ví dụ này, thuộc tính tên của bộ mô tả chỉ đơn giản được đặt thành none. Để điền vào điều này, chúng tôi sẽ dựa vào một lớp meta. Ví dụ: Lớp typedmeta [loại]: def _ _New_ _ [cls, tên, cơ sở, dict]: slots = [] cho khóa, giá trị trong dict.items []: if isInstance [value, typedproperty]: value.name = "_" + các khe khóa.Append [value.name] Dict : # Trong Python 3, sử dụng cú pháp _ _Metaclass_ _ = typedmeta # class gõ [metaclass = typedmeta]

Trong ví dụ này, Metaclass quét từ điển lớp và tìm kiếm các trường hợp của typedproperty. Nếu tìm thấy, nó đặt thuộc tính tên và xây dựng một danh sách các tên trong các khe. Sau khi thực hiện điều này, thuộc tính _ _SLOTS_ _ được thêm vào từ điển lớp và lớp được xây dựng bằng cách gọi phương thức _ _New_ _ [] của loại [] metaclass. Dưới đây là một ví dụ về việc sử dụng metaclass mới này: class foo [gõ]: name = typedproperty [str] num = typedproperty [int, 42]

F

H lib

fl

B

d

ff

Chương 7 Các lớp và lập trình hướng đối tượng

141

Lớp cơ sở này sau đó được sử dụng làm cha mẹ cho tất cả các đối tượng sẽ được ghi lại. Ví dụ: Lớp FOO [tài liệu]: Spam [tự, A, B]: "Spam làm gì đó" vượt qua

Ví dụ này minh họa một trong những cách sử dụng chính của các metaclass, đó là kiểm tra và thu thập thông tin về các định nghĩa của lớp. Metaclass không thay đổi bất cứ điều gì về lớp thực sự được tạo nhưng chỉ đơn thuần là thêm một số kiểm tra bổ sung. Trong các ứng dụng Metaclass nâng cao hơn, một Metaclass có thể kiểm tra và thay đổi nội dung của định nghĩa lớp trước khi tạo lớp. Nếu các thay đổi sẽ được thực hiện, bạn nên xác định lại phương thức _ _New_ _ [] chạy trước khi tạo bản thân lớp. Kỹ thuật này thường được kết hợp với các kỹ thuật bao bọc các thuộc tính với các mô tả hoặc thuộc tính vì đó là một cách để nắm bắt Các tên đang được sử dụng trong lớp. Ví dụ, đây là phiên bản sửa đổi của bộ mô tả typedproperty đã được sử dụng trong phần Mô tả của Cameron type = type if default: self.default = mặc định khác: self.default = type [] def _ _get_ _ [self, fory, cls]: return getAttr [instance, self.name, self.default] def _ _set_ _ [ bản thân, ví dụ, giá trị]: Nếu không phải là isInstance [value, self.type]: tăng loại horror ["phải là % s" % self.type] setAttr [ví dụ, self.name, value] def _ _delete_ _ [self, phiên bản]: Raise ApertyError ["Không thể xóa thuộc tính"]

Trong ví dụ này, thuộc tính tên của bộ mô tả chỉ đơn giản được đặt thành none. Để điền vào điều này, chúng tôi sẽ dựa vào một lớp meta. Ví dụ: Lớp typedmeta [loại]: def _ _New_ _ [cls, tên, cơ sở, dict]: slots = [] cho khóa, giá trị trong dict.items []: if isInstance [value, typedproperty]: value.name = "_" + các khe khóa.Append [value.name] Dict : # Trong Python 3, sử dụng cú pháp _ _Metaclass_ _ = typedmeta # class gõ [metaclass = typedmeta]

Ở đây, việc sử dụng cú pháp trang trí chủ yếu là một trong những tiện lợi. Một cách khác để thực hiện điều tương tự sẽ là thế này: lớp foo [đối tượng]: _ _clsid_ _ = "

Mặc dù nó có thể nghĩ về những điều độc ác vô tận mà người ta có thể làm với một lớp trong chức năng trang trí lớp, nhưng có lẽ tốt nhất là tránh ma thuật quá mức như đặt một trình bao bọc xung quanh lớp hoặc viết lại nội dung của lớp.

F

H lib

fl

B

d

ff

Trang này cố ý để trống

F

H lib

fl

B

d

ff

Trang này cố ý để trống

8 mô -đun, gói và phân phối l

Các chương trình Arge Python được tổ chức thành các mô -đun và gói. Ngoài ra, một số lượng lớn các mô -đun được bao gồm trong thư viện tiêu chuẩn Python. Chương này mô tả hệ thống mô -đun và gói chi tiết hơn. Ngoài ra, nó cung cấp thông tin về cách cài đặt các mô-đun bên thứ ba và phân phối mã nguồn.

Các mô -đun và câu lệnh nhập bất kỳ tệp nguồn Python nào cũng có thể được sử dụng làm mô -đun. Ví dụ: xem xét mã sau: # spam.py a = 37 def foo []: in ["Tôi là foo và A là % s" % a] def Bar []: in ["Tôi là thanh và tôi 'm Calling foo "] foo [] Class Spam [Object]: def Grok [self]: in [" Tôi là spam.grok "]

Để tải mã này làm mô -đun, hãy sử dụng statems stop stop. Nhập lần đầu được sử dụng để tải mô -đun, nó thực hiện ba điều: 1. Nó tạo một không gian tên mới đóng vai trò là một thùng chứa cho tất cả các đối tượng được xác định trong Tệp nguồn. Đây là không gian tên được truy cập khi các chức năng và phương thức được xác định trong mô -đun Sử dụng câu lệnh toàn cầu. 2. Nó thực thi mã có trong mô -đun trong không gian tên mới được tạo. 3. Nó tạo một tên trong trình gọi đề cập đến không gian tên mô -đun. Tên này khớp với tên của mô -đun và được sử dụng như sau: Nhập spam x = spam.a spam.foo [] s = spam.spam [] s .cảm nhận[] ...

# # # #

F

H lib

fl

B

d

ff

144

Trang này cố ý để trống

8 mô -đun, gói và phân phối l

Các chương trình Arge Python được tổ chức thành các mô -đun và gói. Ngoài ra, một số lượng lớn các mô -đun được bao gồm trong thư viện tiêu chuẩn Python. Chương này mô tả hệ thống mô -đun và gói chi tiết hơn. Ngoài ra, nó cung cấp thông tin về cách cài đặt các mô-đun bên thứ ba và phân phối mã nguồn.

Các mô -đun và câu lệnh nhập bất kỳ tệp nguồn Python nào cũng có thể được sử dụng làm mô -đun. Ví dụ: xem xét mã sau: # spam.py a = 37 def foo []: in ["Tôi là foo và A là % s" % a] def Bar []: in ["Tôi là thanh và tôi 'm Calling foo "] foo [] Class Spam [Object]: def Grok [self]: in [" Tôi là spam.grok "]

Để tải mã này làm mô -đun, hãy sử dụng statems stop stop. Nhập lần đầu được sử dụng để tải mô -đun, nó thực hiện ba điều: 1. Nó tạo một không gian tên mới đóng vai trò là một thùng chứa cho tất cả các đối tượng được xác định trong Tệp nguồn. Đây là không gian tên được truy cập khi các chức năng và phương thức được xác định trong mô -đun Sử dụng câu lệnh toàn cầu. 2. Nó thực thi mã có trong mô -đun trong không gian tên mới được tạo. 3. Nó tạo một tên trong trình gọi đề cập đến không gian tên mô -đun. Tên này khớp với tên của mô -đun và được sử dụng như sau: Nhập spam x = spam.a spam.foo [] s = spam.spam [] s .cảm nhận[] ...

F

h Lib

fL

B

d

ff

Importing Selected Symbols from a Module

145

Importing Selected Symbols from a Module The from statement is used to load specific definitions within a module into the current namespace.The from statement is identical to import except that instead of creating a name referring to the newly created module namespace, it places references to one or more of the objects defined in the module into the current namespace: from spam import foo foo[] spam.foo[]

# Imports spam and puts 'foo' in current namespace # Calls spam.foo[] # NameError: spam

The from statement also accepts a comma-separated list of object names. For example: from spam import foo, bar

If you have a very long list of names to import, the names can be enclosed in parentheses.This makes it easier to break the import statement across multiple lines. Here’s an example: from spam import [foo, bar, Spam]

In addition, the as qualifier can be used to rename specific objects imported with from. Here’s an example: from spam import Spam as Sp s = Sp[]

The asterisk [*] wildcard character can also be used to load all the definitions in a module, except those that start with an underscore. Here’s an example: from spam import *

# Load all definitions into current namespace

The from module import * statement may only be used at the top level of a module. In particular, it is illegal to use this form of import inside function bodies due to the way in which it interacts with function scoping rules [e.g., when functions are compiled into internal bytecode, all of the symbols used within the function need to be fully specified]. Modules can more precisely control the set of names imported by from module import * by defining the list _ _all_ _. Here’s an example: # module: spam.py _ _all_ _ = [ 'bar', 'Spam' ]

# Names I will export with from spam import *

Importing definitions with the from form of import does not change their scoping rules. For example, consider this code: from spam import foo a = 42 foo[] # Prints "I'm foo and a is 37"

In this example, the definition of foo[] in spam.py refers to a global variable a.When a reference to foo is placed into a different namespace, it doesn’t change the binding rules for variables within that function.Thus, the global namespace for a function is always the module in which the function was defined, not the namespace into which a function is imported and called.This also applies to function calls. For example, in the

F

h Lib

fL

B

d

ff

146

Chapter 8 Modules, Packages, and Distribution

following code, the call to bar[] results in a call to spam.foo[], not the redefined foo[] that appears in the previous code example: from spam import bar def foo[]: print["I'm a different foo"] bar[] # When bar calls foo[], it calls spam.foo[], not # the definition of foo[] above

Another common confusion with the from form of import concerns the behavior of global variables. For example, consider this code: from spam import a, foo a = 42 foo[] print[a]

# # # #

Import Modify Prints Prints

a global variable the variable "I'm foo and a is 37" "42"

Here, it is important to understand that variable assignment in Python is not a storage operation.That is, the assignment to a in the earlier example is not storing a new value in a, overwriting the previous value. Instead, a new object containing the value 42 is created and the name a is made to refer to it. At this point, a is no longer bound to the value in the imported module but to some other object. Because of this behavior, it is not possible to use the from statement in a way that makes variables behave similarly as global variables or common blocks in languages such as C or Fortran. If you want to have mutable global program parameters in your program, put them in a module and use the module name explicitly using the import statement [that is, use spam.a explicitly].

Execution as the Main Program There are two ways in which a Python source file can execute.The import statement executes code in its own namespace as a library module. However, code might also execute as the main program or script.This occurs when you supply the program as the script name to the interpreter: % python spam.py

Each module defines a variable, _ _name_ _, that contains the module name. Programs can examine this variable to determine the module in which they’re executing.The top-level module of the interpreter is named _ _main_ _. Programs specified on the command line or entered interactively run inside the _ _main_ _ module. Sometimes a program may alter its behavior, depending on whether it has been imported as a module or is running in _ _main_ _. For example, a module may include some testing code that is executed if the module is used as the main program but which is not executed if the module is simply imported by another module.This can be done as follows: # Check if running as a program if _ _name_ _ == '_ _main_ _': # Yes statements else: # No, I must have been imported as a module statements

It is common practice for source files intended for use as libraries to use this technique for including optional testing or example code. For example, if you’re developing a

F

h Lib

fL

B

d

ff

Module Loading and Compilation

147

module, you can put code for testing the features of your library inside an if statement as shown and simply run Python on your module as the main program to run it.That code won’t run for users who import your library.

The Module Search Path When loading modules, the interpreter searches the list of directories in sys.path.The first entry in sys.path is typically an empty string '', which refers to the current working directory. Other entries in sys.path may consist of directory names, .zip archive files, and .egg files.The order in which entries are listed in sys.path determines the search order used when modules are loaded.To add new entries to the search path, simply add them to this list. Although the path usually contains directory names, zip archive files containing Python modules can also be added to the search path.This can be a convenient way to package a collection of modules as a single file. For example, suppose you created two modules, foo.py and bar.py, and placed them in a zip file called mymodules.zip.The file could be added to the Python search path as follows: import sys sys.path.append["mymodules.zip"] import foo, bar

Specific locations within the directory structure of a zip file can also be used. In addition, zip files can be mixed with regular pathname components. Here’s an example: sys.path.append["/tmp/modules.zip/lib/python"]

In addition to .zip files, you can also add .egg files to the search path. .egg files are packages created by the setuptools library.This is a common format encountered when installing third-party Python libraries and extensions. An .egg file is actually just a .zip file with some extra metadata [e.g., version number, dependencies, etc.] added to it.Thus, you can examine and extract data from an .egg file using standard tools for working with .zip files. Despite support for zip file imports, there are some restrictions to be aware of. First, it is only possible import .py, .pyw, .pyc, and .pyo files from an archive. Shared libraries and extension modules written in C cannot be loaded directly from archives, although packaging systems such as setuptools are sometimes able to provide a workaround [typically by extracting C extensions to a temporary directory and loading modules from it]. Moreover, Python will not create .pyc and .pyo files when .py files are loaded from an archive [described next].Thus, it is important to make sure these files are created in advance and placed in the archive in order to avoid poor performance when loading modules.

Module Loading and Compilation So far, this chapter has presented modules as files containing pure Python code. However, modules loaded with import really fall into four general categories: n Code written in Python [.py files] n C or C++ extensions that have been compiled into shared libraries or DLLs

F

h Lib

fL

B

d

ff

Chapter 8 Modules, Packages, and Distribution

148

n n

Packages containing a collection of modules Built-in modules written in C and linked into the Python interpreter

When looking for a module [for example, foo], the interpreter searches each of the directories in sys.path for the following files [listed in search order]: 1. A directory, foo, defining a package 2. foo.pyd, foo.so, foomodule.so, or foomodule.dll [compiled extensions] 3. foo.pyo [only if the -O or -OO option has been used] 4. foo.pyc 5. foo.py [on Windows, Python also checks for .pyw files.] Packages are described shortly; compiled extensions are described in Chapter 26, “Extending and Embedding Python.” For .py files, when a module is first imported, it’s compiled into bytecode and written back to disk as a .pyc file. On subsequent imports, the interpreter loads this precompiled bytecode unless the modification date of the .py file is more recent [in which case, the .pyc file is regenerated]. .pyo files are used in conjunction with the interpreter’s -O option.These files contain bytecode stripped of line numbers, assertions, and other debugging information. As a result, they’re somewhat smaller and allow the interpreter to run slightly faster. If the -OO option is specified instead of -O, documentation strings are also stripped from the file.This removal of documentation strings occurs only when .pyo files are created—not when they’re loaded. If none of these files exists in any of the directories in sys.path, the interpreter checks whether the name corresponds to a built-in module name. If no match exists, an ImportError exception is raised. The automatic compilation of files into .pyc and .pyo files occurs only in conjunction with the import statement. Programs specified on the command line or standard input don’t produce such files. In addition, these files aren’t created if the directory containing a module’s .py file doesn’t allow writing [e.g., either due to insufficient permission or if it’s part of a zip archive].The -B option to the interpreter also disables the generation of these files. If .pyc and .pyo files are available, it is not necessary for a corresponding .py file to exist.Thus, if you are packaging code and don’t wish to include source, you can merely bundle a set of .pyc files together. However, be aware that Python has extensive support for introspection and disassembly. Knowledgeable users will still be able to inspect and find out a lot of details about your program even if the source hasn’t been provided. Also, be aware that .pyc files tend to be version-specific.Thus, a .pyc file generated for one version of Python might not work in a future release. When import searches for files, it matches filenames in a case-sensitive manner— even on machines where the underlying file system is case-insensitive, such as on Windows and OS X [such systems are case-preserving, however].Therefore, import foo will only import the file foo.py and not the file FOO.PY. However, as a general rule, you should avoid the use of module names that differ in case only.

F

H lib

fl

B

d

ff

Gói

149

Mô -đun tải lại và dỡ hàng Python không cung cấp hỗ trợ thực sự để tải lại hoặc dỡ tải các mô -đun đã nhập trước đó. Mặc dù bạn có thể xóa một mô -đun khỏi sys.modules, nhưng điều này thường không tải mô -đun từ bộ nhớ. Đây là do các tham chiếu đến đối tượng mô -đun vẫn có thể tồn tại trong các thành phần chương trình khác sử dụng nhập để tải mô -đun đó. Hơn nữa, nếu có các trường hợp của các lớp được xác định trong mô -đun, các trường hợp đó chứa các tài liệu tham khảo trở lại đối tượng lớp của họ, từ đó giữ các tham chiếu đến mô -đun mà nó được xác định. Thực tế là các tham chiếu mô -đun tồn tại ở nhiều nơi làm cho việc tải lại một mô -đun thường không thực tế sau khi thực hiện các thay đổi đối với việc thực hiện nó. Ví dụ: nếu bạn xóa một mô -đun khỏi sys.modules và sử dụng nhập để tải lại, điều này sẽ không thay đổi tất cả các tài liệu tham khảo trước đó cho mô -đun được sử dụng trong một chương trình. Thay vào đó, bạn sẽ có một tham chiếu đến mô -đun mới được tạo bởi câu lệnh nhập gần đây nhất và một bộ tham chiếu đến mô -đun cũ được tạo bởi các phần nhập trong các phần khác của mã. Điều này hiếm khi bạn muốn và không bao giờ an toàn để sử dụng Bất kỳ loại mã sản xuất lành mạnh nào trừ khi bạn có thể kiểm soát cẩn thận toàn bộ môi trường thực thi. Các phiên bản cũ hơn của Python đã cung cấp hàm tải lại [] để tải lại mô -đun. Tuy nhiên, việc sử dụng chức năng này không bao giờ thực sự an toàn [vì tất cả các lý do đã nói ở trên], và việc sử dụng nó đã được khuyến khích tích cực trừ khi là một hỗ trợ gỡ lỗi có thể. Python 3 loại bỏ hoàn toàn tính năng này. Vì vậy, nó tốt nhất không dựa vào nó. Cuối cùng, cần lưu ý rằng các tiện ích mở rộng C/C ++ cho Python không thể được tải hoặc tải lại một cách an toàn theo bất kỳ cách nào. Không có sự hỗ trợ nào được cung cấp cho điều này, và hệ điều hành cơ bản có thể cấm nó dù sao đi nữa, cách duy nhất của bạn là khởi động lại quy trình phiên dịch Python.

Các gói gói cho phép một bộ sưu tập các mô -đun được nhóm theo tên gói chung. Kỹ thuật này giúp giải quyết xung đột không gian tên giữa các tên mô -đun được sử dụng trong các ứng dụng khác nhau. Một gói được xác định bằng cách tạo một thư mục có cùng tên với gói và tạo tệp _ _init_ _.py trong thư mục đó. Bạn có thể đặt thêm các tệp nguồn, biên dịch các phần mở rộng và thanh toán con trong thư mục này, khi cần. Ví dụ: một gói có thể được tổ chức như sau: đồ họa/ _ _init_ _.py nguyên thủy/ _ _init_ _.py lines.py fill.py text.py ... graph2d/ _ _init_ _.py plot2d.py ... Graph3d/ _ _init_ _.py plot3d.py ... định dạng/ _ _init_ _.py gif.py

F

H lib

fl

B

d

ff

Gói

150

Mô -đun tải lại và dỡ hàng Python không cung cấp hỗ trợ thực sự để tải lại hoặc dỡ tải các mô -đun đã nhập trước đó. Mặc dù bạn có thể xóa một mô -đun khỏi sys.modules, nhưng điều này thường không tải mô -đun từ bộ nhớ. Đây là do các tham chiếu đến đối tượng mô -đun vẫn có thể tồn tại trong các thành phần chương trình khác sử dụng nhập để tải mô -đun đó. Hơn nữa, nếu có các trường hợp của các lớp được xác định trong mô -đun, các trường hợp đó chứa các tài liệu tham khảo trở lại đối tượng lớp của họ, từ đó giữ các tham chiếu đến mô -đun mà nó được xác định. Thực tế là các tham chiếu mô -đun tồn tại ở nhiều nơi làm cho việc tải lại một mô -đun thường không thực tế sau khi thực hiện các thay đổi đối với việc thực hiện nó. Ví dụ: nếu bạn xóa một mô -đun khỏi sys.modules và sử dụng nhập để tải lại, điều này sẽ không thay đổi tất cả các tài liệu tham khảo trước đó cho mô -đun được sử dụng trong một chương trình. Thay vào đó, bạn sẽ có một tham chiếu đến mô -đun mới được tạo bởi câu lệnh nhập gần đây nhất và một bộ tham chiếu đến mô -đun cũ được tạo bởi các phần nhập trong các phần khác của mã. Điều này hiếm khi bạn muốn và không bao giờ an toàn để sử dụng Bất kỳ loại mã sản xuất lành mạnh nào trừ khi bạn có thể kiểm soát cẩn thận toàn bộ môi trường thực thi. Các phiên bản cũ hơn của Python đã cung cấp hàm tải lại [] để tải lại mô -đun. Tuy nhiên, việc sử dụng chức năng này không bao giờ thực sự an toàn [vì tất cả các lý do đã nói ở trên], và việc sử dụng nó đã được khuyến khích tích cực trừ khi là một hỗ trợ gỡ lỗi có thể. Python 3 loại bỏ hoàn toàn tính năng này. Vì vậy, nó tốt nhất không dựa vào nó. Cuối cùng, cần lưu ý rằng các tiện ích mở rộng C/C ++ cho Python không thể được tải hoặc tải lại một cách an toàn theo bất kỳ cách nào. Không có sự hỗ trợ nào được cung cấp cho điều này, và hệ điều hành cơ bản có thể cấm nó dù sao đi nữa, cách duy nhất của bạn là khởi động lại quy trình phiên dịch Python.

Các gói gói cho phép một bộ sưu tập các mô -đun được nhóm theo tên gói chung. Kỹ thuật này giúp giải quyết xung đột không gian tên giữa các tên mô -đun được sử dụng trong các ứng dụng khác nhau. Một gói được xác định bằng cách tạo một thư mục có cùng tên với gói và tạo tệp _ _init_ _.py trong thư mục đó. Bạn có thể đặt thêm các tệp nguồn, biên dịch các phần mở rộng và thanh toán con trong thư mục này, khi cần. Ví dụ: một gói có thể được tổ chức như sau: đồ họa/ _ _init_ _.py nguyên thủy/ _ _init_ _.py lines.py fill.py text.py ... graph2d/ _ _init_ _.py plot2d.py ... Graph3d/ _ _init_ _.py plot3d.py ... định dạng/ _ _init_ _.py gif.py

Chương 8 Mô -đun, Gói và Phân phối

png.py tiff.py jpeg.py

Câu lệnh nhập được sử dụng để tải các mô -đun từ một gói theo một số cách: n

Nhập đồ họa.primitive.fill

Điều này tải đồ họa mô hình con. N

từ đồ họa. Nhập khẩu điền vào

Điều này tải trọng điền vào mô hình con nhưng làm cho nó có sẵn mà không có tiền tố gói; Ví dụ: fill.floodfill [img, x, y, màu]. N

Bây giờ khi người dùng phát hành một câu lệnh nhập khẩu đồ họa. Một vấn đề tinh tế khác với các gói liên quan đến các mô hình con muốn nhập các mô hình con khác trong cùng một gói. Ví dụ: giả sử mô -đun đồ họa.primitive. Như thế này: # fill.py từ. Nhập dòng

Trong ví dụ này,. được sử dụng trong tuyên bố từ. Nhập các dòng đề cập đến cùng một thư mục của mô -đun gọi. Vì vậy, câu lệnh này tìm kiếm một dòng mô -đun trong

F

H lib

fl

B

d

ff

Gói

151

cùng thư mục với tệp fill.py. Cần cẩn thận để tránh sử dụng một câu lệnh như nhập mô -đun để nhập mô hình con gói. Trong các phiên bản cũ của Python, không rõ liệu câu lệnh MODULE nhập khẩu có đề cập đến một mô -đun thư viện tiêu chuẩn hay mô hình con của gói hay không. Các phiên bản cũ hơn của Python trước tiên sẽ cố gắng tải mô -đun từ cùng một thư mục gói với mô hình con trong đó câu lệnh nhập xuất hiện và sau đó chuyển sang các mô -đun thư viện tiêu chuẩn nếu không tìm thấy khớp. Tuy nhiên, trong Python 3, nhập giả định một đường dẫn tuyệt đối và chỉ đơn giản là cố gắng tải mô -đun từ thư viện tiêu chuẩn. Nhập khẩu tương đối rõ ràng hơn ý định của bạn. Nhập khẩu tương đối cũng có thể được sử dụng để tải các mô hình con có trong các thư mục khác nhau của cùng một gói. Ví dụ: nếu mô -đun đồ họa.graph2d.plot2d muốn nhập graphics.primitives.lines, nó có thể sử dụng một câu như thế này: # Plot2D.Py từ .. PRIMITIVES Dòng nhập nhập

Ở đây, .. chuyển ra một cấp độ thư mục và nguyên thủy rơi xuống một thư mục gói khác. Nhập khẩu tương đối chỉ có thể được chỉ định bằng mẫu biểu tượng nhập từ mô -đun của câu lệnh nhập. Vì vậy, các câu lệnh như nhập ..primitives.lines hoặc nhập .lines là lỗi cú pháp. Ngoài ra, biểu tượng phải là một định danh hợp lệ. Vì vậy, một tuyên bố như từ .. nhập khẩu nguyên thủy.lines cũng là bất hợp pháp. Cuối cùng, nhập khẩu tương đối chỉ có thể được sử dụng trong một gói; Việc sử dụng nhập khẩu tương đối là bất hợp pháp để chỉ các mô -đun đơn giản nằm trong một thư mục khác trên hệ thống tập tin. Nhập tên gói một mình không nhập tất cả các mô hình con có trong gói. Ví dụ: mã sau đây không hoạt động: Nhập đồ họa đồ họa.primitive.fill.floodfill [img, x, y, color]

# Thất bại!

Tuy nhiên, vì câu lệnh Đồ họa nhập thực thi tệp _ _init_ _.py trong thư mục đồ họa, có thể tự động nhập tất cả các mô hình con, như sau: # Graphics/_ _init_ _.py từ. Nhập nguyên thủy, Graph2D, Graph3d # Graphics/Primitive/_ _init_ _.py từ. Nhập dòng, điền, văn bản, ...

Bây giờ câu lệnh Đồ họa nhập nhập khẩu tất cả các mô hình con và cung cấp chúng có sẵn bằng cách sử dụng tên đủ điều kiện của chúng. Một lần nữa, điều quan trọng là nhấn mạnh rằng một gói nhập khẩu tương đối nên được sử dụng như được hiển thị. Nếu bạn sử dụng một câu lệnh đơn giản như mô -đun nhập, các mô -đun thư viện tiêu chuẩn có thể được tải thay thế. Cuối cùng, khi Python nhập gói, nó định nghĩa một biến đặc biệt, _ _Path_ _, chứa danh sách các thư mục được tìm kiếm khi tìm kiếm các mô hình con gói [_ _path_ _ là phiên bản cụ thể của biến số của sys.path]. _ _Path_ _ có thể truy cập được vào mã có trong các tệp _ _init_ _.py và ban đầu chứa một mục duy nhất với tên thư mục của gói. Nếu cần thiết, một gói có thể cung cấp các thư mục bổ sung cho danh sách _ _path_ _ để thay đổi đường dẫn tìm kiếm được sử dụng để tìm các mô hình con. Điều này có thể hữu ích nếu tổ chức của một gói trên hệ thống tệp rất phức tạp và không phù hợp với hệ thống phân cấp gói.

F

H lib

fl

B

d

ff

152

Gói

cùng thư mục với tệp fill.py. Cần cẩn thận để tránh sử dụng một câu lệnh như nhập mô -đun để nhập mô hình con gói. Trong các phiên bản cũ của Python, không rõ liệu câu lệnh MODULE nhập khẩu có đề cập đến một mô -đun thư viện tiêu chuẩn hay mô hình con của gói hay không. Các phiên bản cũ hơn của Python trước tiên sẽ cố gắng tải mô -đun từ cùng một thư mục gói với mô hình con trong đó câu lệnh nhập xuất hiện và sau đó chuyển sang các mô -đun thư viện tiêu chuẩn nếu không tìm thấy khớp. Tuy nhiên, trong Python 3, nhập giả định một đường dẫn tuyệt đối và chỉ đơn giản là cố gắng tải mô -đun từ thư viện tiêu chuẩn. Nhập khẩu tương đối rõ ràng hơn ý định của bạn. Nhập khẩu tương đối cũng có thể được sử dụng để tải các mô hình con có trong các thư mục khác nhau của cùng một gói. Ví dụ: nếu mô -đun đồ họa.graph2d.plot2d muốn nhập graphics.primitives.lines, nó có thể sử dụng một câu như thế này: # Plot2D.Py từ .. PRIMITIVES Dòng nhập nhập

# Một mô -đun thư viện duy nhất # gói mô -đun hỗ trợ

# Một tập lệnh để chạy như: python runspam.py

Bạn nên tổ chức mã của mình để nó hoạt động bình thường khi chạy trình thông dịch Python trong thư mục cấp cao nhất. Ví dụ: nếu bạn bắt đầu Python trong thư mục spam, bạn sẽ có thể nhập các mô -đun, nhập các thành phần gói và chạy tập lệnh mà không phải thay đổi bất kỳ cài đặt Python nào như đường dẫn tìm kiếm mô -đun. Sau khi bạn đã tổ chức mã của mình, hãy tạo một thiết lập tệp trong thư mục hàng đầu nhất [spam trong các ví dụ trước]. Trong tệp này, hãy đặt mã sau: # setup.py từ distutils.core Nhập Cài đặt thiết lập [name = "spam", phiên bản = "1.0", py_modules = ['libspam'], gói = ['spampkg'] = ['runspam.py'],]

Trong cuộc gọi setup [], đối số py_modules là danh sách tất cả các mô-đun python một tệp đơn, các gói là danh sách tất cả các thư mục gói và tập lệnh là danh sách các tệp script. Bất kỳ đối số nào trong số này có thể bị bỏ qua nếu phần mềm của bạn không có bất kỳ thành phần phù hợp nào [tức là, không có tập lệnh]. Tên là tên của gói của bạn và phiên bản là số phiên bản dưới dạng chuỗi. Call to setup [] hỗ trợ nhiều tham số khác cung cấp siêu dữ liệu khác nhau về gói của bạn. Có thể 8.1 cho thấy các tham số phổ biến nhất có thể được chỉ định. Tất cả các giá trị là các chuỗi ngoại trừ tham số phân loại, là danh sách các chuỗi như ['trạng thái phát triển :: 4 - beta', 'Ngôn ngữ lập trình :: Python'] [có thể tìm thấy danh sách đầy đủ tại // pypi .Python.org]. Bảng 8.1

Tham số để setup []

Tham số

Sự mô tả

Tên phiên bản tác giả tác giả_Email

Tên của gói [Yêu cầu] Số phiên bản [Yêu cầu] Tác giả Tên tác giả Địa chỉ email của tác giả

F

H lib

fl

B

d

ff

Phân phối các chương trình và thư viện Python

Bảng 8.1

153

Tiếp tục

Tham số

Sự mô tả

Tên phiên bản tác giả tác giả_Email

Tên của gói [Yêu cầu] Số phiên bản [Yêu cầu] Tác giả Tên tác giả Địa chỉ email của tác giả

F

H lib

fl

B

h Lib

fL

B

d

ff

154

Chapter 8 Modules, Packages, and Distribution

binary executable, that is beyond the scope of what can be covered here [look at a third-party module such as py2exe or py2app for further details]. If all you are doing is distributing libraries or simple scripts to people, it is usually unnecessary to package your code with the Python interpreter and runtime as well. Finally, it should be noted that there are many more options to distutils than those covered here. Chapter 26 describes how distutils can be used to compile C and C++ extensions. Although not part of the standard Python distribution, Python software is often distributed in the form of an .egg file.This format is created by the popular setuptools extension [//pypi.python.org/pypi/setuptools].To support setuptools, you can simply change the first part of your setup.py file as follows: # setup.py try: from setuptools import setup except ImportError: from distutils.core import setup setup[name = "spam", ... ]

Installing Third-Party Libraries The definitive resource for locating third-party libraries and extensions to Python is the Python Package Index [PyPI], which is located at //pypi.python.org. Installing thirdparty modules is usually straightforward but can become quite involved for very large packages that also depend on other third-party modules. For the more major extensions, you will often find a platform-native installer that simply steps you through the process using a series of dialog screens. For other modules, you typically unpack the download, look for the setup.py file, and type python setup.py install to install the software. By default, third-party modules are installed in the site-packages directory of the Python standard library. Access to this directory typically requires root or administrator access. If this is not the case, you can type python setup.py install --user to have the module installed in a per-user library directory.This installs the package in a per-user directory such as "/Users/beazley/.local/lib/python2.6/site-packages" on UNIX. If you want to install the software somewhere else entirely, use the --prefix option to setup.py. For example, typing python setup.py install --prefix=/home/ beazley/pypackages installs a module under the directory /home/beazley/ pypackages.When installing in a nonstandard location, you will probably have to adjust the setting of sys.path in order for Python to locate your newly installed modules. Be aware that many extensions to Python involve C or C++ code. If you have downloaded a source distribution, your system will have to have a C++ compiler installed in order to run the installer. On UNIX, Linux, and OS X, this is usually not an issue. On Windows, it has traditionally been necessary to have a version of Microsoft Visual Studio installed. If you’re working on that platform, you’re probably better off looking for a precompiled version of your extension.

F

h Lib

fL

B

d

ff

Installing Third-Party Libraries

155

If you have installed setuptools, a script easy_install is available to install packages. Simply type easy_install pkgname to install a specific package. If configured correctly, this will download the appropriate software from PyPI along with any dependencies and install it for you. Of course, your mileage might vary. If you would like to add your own software to PyPI, simply type python setup.py register.This will upload metadata about the latest version of your software to the index [note that you will have to register a username and password first].

F

h Lib

fL

B

d

ff

This page intentionally left blank

F

h Lib

fL

B

d

ff

9 Input and Output T

his chapter describes the basics of Python input and output [I/O], including command-line options, environment variables, file I/O, Unicode, and how to serialize objects using the pickle module.

Reading Command-Line Options When Python starts, command-line options are placed in the list sys.argv.The first element is the name of the program. Subsequent items are the options presented on the command line after the program name.The following program shows a minimal prototype of manually processing simple command-line arguments: import sys if len[sys.argv] != 3: sys.stderr.write["Usage : python %s inputfile outputfile\n" % sys.argv[0]] raise SystemExit[1] inputfile = sys.argv[1] outputfile = sys.argv[2]

In this program, sys.argv[0] contains the name of the script being executed.Writing an error message to sys.stderr and raising SystemExit with a non-zero exit code as shown is standard practice for reporting usage errors in command-line tools. Although you can manually process command options for simple scripts, use the optparse module for more complicated command-line handling. Here is a simple example: import optparse p = optparse.OptionParser[] # An option taking an argument p.add_option["-o",action="store",dest="outfile"] p.add_option["--output",action="store",dest="outfile"] # An option that sets a boolean flag p.add_option["-d",action="store_true",dest="debug"] p.add_option["--debug",action="store_true",dest="debug"] # Set default values for selected options p.set_defaults[debug=False] # Parse the command line opts, args = p.parse_args[] # Retrieve the option settings outfile = opts.outfile debugmode = opts.debug

F

H lib

fl

B

d

ff

158

Chương 9 Đầu vào và đầu ra

Trong ví dụ này, hai loại tùy chọn được thêm Tùy chọn, -D hoặc - -Debug, chỉ đơn thuần là đặt cờ boolean. Điều này được bật bằng cách chỉ định Action = 'store_true' trong p.add_option []. Đối số số phận cho p.add_option [] sẽ được lưu trữ sau khi phân tích cú pháp. Phương thức p.set_defaults [] Đặt các giá trị mặc định cho một hoặc nhiều tùy chọn. Tên đối số được sử dụng với phương thức này sẽ khớp với các tên đích được chọn cho mỗi tùy chọn. Nếu không có giá trị mặc định được chọn, giá trị mặc định được đặt thành không có. Chương trình trước đó nhận ra tất cả các kiểu dòng lệnh sau: % % % %

Python Python Python Python

prog.py prog.py prog.py prog.py

-o Outfile -d Infile1 ... Infilen -Output = Outfile -Debug Infile1 ... Infilen -H - -Help

Phân tích cú pháp được thực hiện bằng phương thức p.parse_args []. Phương thức này trả về 2-tuple [opts, args] trong đó opts là một đối tượng chứa các giá trị tùy chọn được phân tích cú pháp và ARGS là danh sách các mục trên dòng lệnh không được phân tích cú pháp làm tùy chọn. Các giá trị tùy chọn được truy xuất bằng Opts.Dest WHERE DEST là tên đích được sử dụng khi thêm tùy chọn. Ví dụ: đối số cho đối số -O hoặc --Output Cung cấp tùy chọn -H hoặc -Help liệt kê các tùy chọn có sẵn nếu người dùng yêu cầu. Các tùy chọn xấu cũng dẫn đến một thông báo lỗi. Ví dụ này chỉ hiển thị việc sử dụng đơn giản nhất của mô -đun OptParse. Thông tin chi tiết về một số tùy chọn nâng cao hơn có thể được tìm thấy trong Chương 19, Dịch vụ hệ điều hành.

Biến môi trường Biến môi trường được truy cập trong từ điển OS.ENVION. Ở đây, một ví dụ: Nhập OS PATH = OS.ENVION ["PATH"] user = os.environ ["user"] editor = os.environ ["Editor"] ... vv ...

Để sửa đổi các biến môi trường, hãy đặt biến OS.ENVION. Ví dụ: Os.Envir ["foo"] = "Bar"

Sửa đổi thành OS.EnVION ảnh hưởng đến cả chương trình đang chạy và các quy trình con được tạo bởi Python.

Các tệp và đối tượng tệp Mở chức năng tích hợp [name [, mode [, bufsize]]] mở và tạo một đối tượng tệp, như được hiển thị ở đây: f = open ["foo"] f = open ["foo", 'r '] f = open ["foo",' w ']

# Mở "Foo" để đọc # Mở "Foo" để đọc [giống như trên] # Mở để viết

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

159

Trong ví dụ này, hai loại tùy chọn được thêm Tùy chọn, -D hoặc - -Debug, chỉ đơn thuần là đặt cờ boolean. Điều này được bật bằng cách chỉ định Action = 'store_true' trong p.add_option []. Đối số số phận cho p.add_option [] sẽ được lưu trữ sau khi phân tích cú pháp. Phương thức p.set_defaults [] Đặt các giá trị mặc định cho một hoặc nhiều tùy chọn. Tên đối số được sử dụng với phương thức này sẽ khớp với các tên đích được chọn cho mỗi tùy chọn. Nếu không có giá trị mặc định được chọn, giá trị mặc định được đặt thành không có. Chương trình trước đó nhận ra tất cả các kiểu dòng lệnh sau: % % % %

Chuỗi trống], bất kỳ kết thúc dòng nào được công nhận là Newlines, nhưng không được dịch trong văn bản đầu vào. Nếu Newline có bất kỳ giá trị pháp lý nào khác, giá trị đó là những gì được sử dụng để chấm dứt các dòng. CloseFD kiểm soát xem bộ mô tả tệp cơ bản có thực sự đóng khi phương thức đóng [] được gọi hay không. Theo mặc định, điều này được đặt thành true. Bảng 9.1 cho thấy các phương thức được hỗ trợ bởi các đối tượng tệp. Bảng 9.1

Phương pháp tập tin

Phương pháp

Sự mô tả

F.Read [[n]] F.Readline [[n]]

Đọc nhiều nhất n byte. Đọc một dòng duy nhất đầu vào lên đến n ký tự. Nếu N bị bỏ qua, phương pháp này sẽ đọc toàn bộ dòng. Đọc tất cả các dòng và trả về một danh sách. Kích thước tùy chọn chỉ định số lượng ký tự gần đúng để đọc trên tệp trước khi dừng. Viết chuỗi s. Viết tất cả các chuỗi trong các dòng trình tự. Đóng tệp.

F.ReadLines [[kích thước]]

f.write [s] f.writelines [dòng] f.close []

F

H lib

fl

B

d

ff

160

Chương 9 Đầu vào và đầu ra

Bảng 9.1

Tiếp tục

Phương pháp

Sự mô tả

F.Read [[n]] F.Readline [[n]]

Đọc nhiều nhất n byte. Đọc một dòng duy nhất đầu vào lên đến n ký tự. Nếu N bị bỏ qua, phương pháp này sẽ đọc toàn bộ dòng. Đọc tất cả các dòng và trả về một danh sách. Kích thước tùy chọn chỉ định số lượng ký tự gần đúng để đọc trên tệp trước khi dừng. Viết chuỗi s. Viết tất cả các chuỗi trong các dòng trình tự. Đóng tệp.

F.ReadLines [[kích thước]]

f.write [s] f.writelines [dòng] f.close []

F

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

161

Bảng 9.1

Thuộc tính đối tượng tệp

Thuộc tính

Sự mô tả

f.closed

Giá trị Boolean chỉ ra trạng thái tệp: Sai Nếu tệp được mở, đúng nếu đóng. Chế độ I/O cho tệp. Tên của tệp nếu được tạo bằng Open []. Nếu không, nó sẽ là một chuỗi chỉ ra nguồn của tệp. Giá trị Boolean cho biết liệu một ký tự không gian có cần được in trước một giá trị khác khi sử dụng câu lệnh in hay không. Các lớp mô phỏng các tệp phải cung cấp một thuộc tính có thể ghi của tên này mà ban đầu được khởi tạo về 0 [chỉ Python 2]. Khi một tệp được mở ở chế độ NEWLINE phổ quát, thuộc tính này chứa biểu diễn NewLine thực sự được tìm thấy trong tệp. Giá trị không có nếu không gặp phải dòng mới nào, một chuỗi chứa '\ n', '\ r' hoặc '\ r \ n' hoặc một tuple chứa tất cả các mã hóa dòng mới khác nhau được thấy. Một chuỗi biểu thị mã hóa tệp, nếu có [ví dụ: 'Latin-1' hoặc 'UTF-8']. Giá trị là không nếu không có mã hóa đang được sử dụng.

F.Mode F.Name F.SoFtsPace

F.Newlines

f.encoding

Đầu vào tiêu chuẩn, đầu ra và lỗi Trình thông dịch cung cấp ba đối tượng tệp tiêu chuẩn, được gọi là đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và lỗi tiêu chuẩn, có sẵn trong mô -đun SYS như sys.stdin, sys.stdout và sys.stderr, tương ứng. Stdin là một đối tượng tệp tương ứng với luồng các ký tự đầu vào được cung cấp cho trình thông dịch. Stdout là đối tượng tệp nhận được đầu ra được tạo bằng in. Stderr là một tệp nhận được thông báo lỗi. Thường xuyên hơn không, Stdin được ánh xạ tới bàn phím của người dùng, trong khi Stdout và Stderr tạo văn bản trên màn hình.

F

H lib

fl

B

d

ff

162

Chương 9 Đầu vào và đầu ra

Các phương thức được mô tả trong phần trước có thể được sử dụng để thực hiện I/O RAW với người dùng. Ví dụ: mã sau ghi vào đầu ra tiêu chuẩn và đọc một dòng đầu vào từ đầu vào tiêu chuẩn: nhập sys sys.stdout.write ["Nhập tên của bạn:"] name = sys.stdin.readline []

Ngoài ra, chức năng tích hợp RAW_INPUT [nhắc] có thể đọc một dòng văn bản từ stdin và in tùy chọn nhắc nhở: name = raw_input ["Nhập tên của bạn:"]

Các dòng được đọc bởi Raw_Input [] không bao gồm dòng mới. Điều này khác với việc đọc trực tiếp từ sys.stdin nơi các dòng mới được đưa vào văn bản đầu vào. Trong Python 3, Raw_Input [] đã được đổi tên thành Input []. Các ngắt bàn phím [thường được tạo bởi CTRL+C] dẫn đến ngoại lệ của bàn phím có thể bị bắt bằng cách sử dụng trình xử lý ngoại lệ. Nếu cần thiết, các giá trị của sys.stdout, sys.stdin và sys.stderr có thể được thay thế bằng các đối tượng tệp khác, trong trường hợp đó câu lệnh in và hàm đầu vào sử dụng các giá trị mới. Nếu cần phải khôi phục giá trị ban đầu của sys.stdout, nó nên được lưu trước. sys._ _stdin_ _ và sys._ _stderr_ _, tương ứng. Lưu ý rằng trong một số trường hợp, Sys.stdin, sys.stdout và sys.stderr có thể bị thay đổi bằng cách sử dụng môi trường phát triển tích hợp [IDE]. Ví dụ, khi Python được chạy theo Idle, Sys.stdin được thay thế bằng một đối tượng hoạt động giống như một tệp nhưng thực sự là một đối tượng trong môi trường phát triển. Trong trường hợp này, một số phương thức Lowlevel nhất định, chẳng hạn như Read [] và Seek [], có thể không khả dụng.

Câu lệnh in Python 2 sử dụng một câu lệnh in đặc biệt để tạo đầu ra trên tệp có trong sys.stdout. In chấp nhận danh sách các đối tượng được phân tách bằng dấu phẩy như sau: in "Các giá trị là", x, y, z

Đối với mỗi đối tượng, hàm str [] được gọi để tạo ra một chuỗi đầu ra. Các chuỗi đầu ra này sau đó được nối và phân tách bởi một không gian duy nhất để tạo ra chuỗi đầu ra cuối cùng. Tuyên bố in. Trong trường hợp này, câu lệnh in tiếp theo sẽ chèn một không gian trước khi in thêm các mục. Đầu ra của không gian này được điều khiển bởi thuộc tính seftspace của tệp được sử dụng cho đầu ra. In "Các giá trị là", x, y, z, w # in cùng một văn bản, sử dụng hai câu lệnh in in "Các giá trị là"

Để tạo ra đầu ra được định dạng, hãy sử dụng toán tử định dạng chuỗi [%] hoặc phương thức .format [] như được mô tả trong Chương 4, toán tử và biểu thức. Đây là một ví dụ: In "Các giá trị là %d %7,5f %s" %[x, y, z] # được định dạng I/O in "Các giá trị là {0: d} {1: 7.5f} {2}" .format [x, y, z]

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

163

Các phương thức được mô tả trong phần trước có thể được sử dụng để thực hiện I/O RAW với người dùng. Ví dụ: mã sau ghi vào đầu ra tiêu chuẩn và đọc một dòng đầu vào từ đầu vào tiêu chuẩn: nhập sys sys.stdout.write ["Nhập tên của bạn:"] name = sys.stdin.readline []

Hàm in [] Một trong những thay đổi quan trọng nhất trong Python 3 là bản in được biến thành một hàm. Trong Python 2.6, cũng có thể sử dụng in như một hàm nếu bạn bao gồm câu lệnh từ _ _future_ _ Nhập in_Function trong mỗi mô -đun khi sử dụng. Hàm in [] hoạt động gần như chính xác giống như câu lệnh in được mô tả trong phần trước. Để in một loạt các giá trị được phân tách bằng không gian, chỉ cần cung cấp tất cả để in [] như thế này: in ["Các giá trị là", x, y, z]

Để triệt tiêu hoặc thay đổi kết thúc dòng, hãy sử dụng đối số từ khóa kết thúc = kết thúc. Ví dụ: in ["Các giá trị là", x, y, z, end = '']

# Đàn áp dòng mới

Để chuyển hướng đầu ra sang tệp, hãy sử dụng đối số từ khóa File = Outfile. Ví dụ: in ["Các giá trị là", x, y, z, file = f]

# Chuyển hướng đến tệp đối tượng f

Để thay đổi ký tự phân cách giữa các mục, hãy sử dụng đối số từ khóa SEP = SEPCHR. Ví dụ: in ["Các giá trị là", x, y, z, sep = ',']

# Đặt dấu phẩy giữa các giá trị

Nội suy biến trong đầu ra văn bản Một vấn đề phổ biến khi tạo ra đầu ra là sản xuất các đoạn văn bản lớn có chứa các thay thế biến nhúng. Nhiều ngôn ngữ kịch bản như Perl và PHP cho phép các biến được chèn vào các chuỗi bằng cách sử dụng các thay thế biến đồng đô la [nghĩa là $ name, $ địa chỉ, v.v.]. Python không cung cấp tương đương trực tiếp với tính năng này, nhưng nó có thể được mô phỏng bằng cách sử dụng I/O được định dạng kết hợp với các chuỗi được trích dẫn ba. Ví dụ: bạn có thể viết một chữ cái biểu mẫu ngắn, điền vào tên, tên vật phẩm và số lượng, như được hiển thị trong ví dụ sau: # Lưu ý: Trailing Slash ngay sau "" "Ngăn chặn # một dòng trống xuất hiện dưới dạng Dòng đầu tiên Mẫu = "" "\ Dear %[Tên] S,

F

H lib

fl

B

d

ff

164

Chương 9 Đầu vào và đầu ra

Vui lòng gửi lại %[mục] của tôi hoặc trả cho tôi $ %[số tiền] 0,2f. Trân trọng của bạn, Joe Python Người dùng "" "In Form % {'name': 'Ông Bush', 'Item': 'Blender', 'Số tiền': 50.00,}

Điều này tạo ra đầu ra sau: Thưa ông Bush, xin vui lòng gửi lại máy xay của tôi hoặc trả cho tôi $ 50,00. Trân trọng của bạn, người dùng Joe Python

Phương thức định dạng [] là một giải pháp thay thế hiện đại hơn để làm sạch một số mã trước đó. Ví dụ: form = "" " Bush ', item =' Blender ', số tiền = 50.0]

Đối với một số loại biểu mẫu nhất định, bạn cũng có thể sử dụng chuỗi mẫu, như sau: Nhập chuỗi biểu mẫu = String.Template ["" " "" ".

Trong trường hợp này, các biến $ đặc biệt trong chuỗi chỉ ra sự thay thế. Phương thức form.subst acy [] có một từ điển thay thế và trả về một chuỗi mới. Mặc dù các phương pháp trước đây rất đơn giản, nhưng chúng không phải lúc nào cũng là giải pháp mạnh mẽ nhất để tạo văn bản. Khung Web và các khung ứng dụng lớn khác có xu hướng cung cấp các công cụ chuỗi mẫu của riêng họ hỗ trợ dòng điều khiển nhúng, thay thế thay đổi, bao gồm tệp và các công cụ khác các tính năng tiên tiến.

Tạo đầu ra làm việc trực tiếp với các tệp là mô hình I/O quen thuộc nhất với các lập trình viên. Tuy nhiên, các chức năng của máy phát cũng có thể được sử dụng để phát ra luồng I/O như một chuỗi các đoạn dữ liệu. Để làm điều này, chỉ cần sử dụng câu lệnh năng suất như bạn sẽ sử dụng câu lệnh Write [] hoặc in. Đây là một ví dụ:

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

165

Vui lòng gửi lại %[mục] của tôi hoặc trả cho tôi $ %[số tiền] 0,2f. Trân trọng của bạn, Joe Python Người dùng "" "In Form % {'name': 'Ông Bush', 'Item': 'Blender', 'Số tiền': 50.00,}

Điều này tạo ra đầu ra sau: Thưa ông Bush, xin vui lòng gửi lại máy xay của tôi hoặc trả cho tôi $ 50,00. Trân trọng của bạn, người dùng Joe Python

Phương thức định dạng [] là một giải pháp thay thế hiện đại hơn để làm sạch một số mã trước đó. Ví dụ: form = "" " Bush ', item =' Blender ', số tiền = 50.0]

Đối với một số loại biểu mẫu nhất định, bạn cũng có thể sử dụng chuỗi mẫu, như sau: Nhập chuỗi biểu mẫu = String.Template ["" " "" ".

Trong trường hợp này, các biến $ đặc biệt trong chuỗi chỉ ra sự thay thế. Phương thức form.subst acy [] có một từ điển thay thế và trả về một chuỗi mới. Mặc dù các phương pháp trước đây rất đơn giản, nhưng chúng không phải lúc nào cũng là giải pháp mạnh mẽ nhất để tạo văn bản. Khung Web và các khung ứng dụng lớn khác có xu hướng cung cấp các công cụ chuỗi mẫu của riêng họ hỗ trợ dòng điều khiển nhúng, thay thế thay đổi, bao gồm tệp và các công cụ khác các tính năng tiên tiến.

Đối với các chương trình định tuyến đầu ra cho các tệp hoặc kết nối mạng, cách tiếp cận của trình tạo cũng có thể dẫn đến giảm đáng kể việc sử dụng bộ nhớ vì toàn bộ luồng đầu ra thường có thể được tạo và xử lý trong các đoạn nhỏ thay vì được thu thập đầu tiên vào một chuỗi đầu ra lớn hoặc danh sách các chuỗi. Cách tiếp cận đầu ra này đôi khi được nhìn thấy khi viết các chương trình tương tác với giao diện Cổng dịch vụ web Python [WSGI] được sử dụng để giao tiếp giữa các thành phần trong một số khung web nhất định.

Chuỗi Unicode Xử lý một vấn đề chung liên quan đến xử lý I/O là xử lý các ký tự quốc tế được đại diện là Unicode. Nếu bạn có một chuỗi các byte thô có chứa biểu diễn được mã hóa của chuỗi unicode, hãy sử dụng phương thức s.decode [[mã hóa [, lỗi]]] để chuyển đổi nó thành chuỗi unicode thích hợp. Để chuyển đổi chuỗi unicode, u, u, Để một chuỗi byte được mã hóa, hãy sử dụng phương thức chuỗi U.enCode [[mã hóa [, lỗi]]]. Cả hai toán tử chuyển đổi này đều yêu cầu sử dụng tên mã hóa đặc biệt, chỉ định cách các giá trị ký tự unicode được ánh xạ tới một chuỗi các ký tự 8 bit trong chuỗi byte và ngược lại.

F

H lib

fl

B

d

ff

166

Chương 9 Đầu vào và đầu ra

và là một trong hơn một trăm mã hóa ký tự khác nhau. Tuy nhiên, các giá trị sau đây là phổ biến nhất: giá trị

Sự mô tả

'ASCII' 'Latin-1' hoặc 'ISO-8859-1'

ASCII 7-bit ISO 8859-1 Latin-1 Windows 1252 Mã hóa mã hóa biến đổi độ dài thay đổi 8 bit [có thể là ít hoặc lớn UTF-16, mã hóa endian nhỏ, mã hóa endian lớn Cùng một định dạng với unicode nghĩa đen u "chuỗi" cùng định dạng với unicode thô theo nghĩa đen của bạn "chuỗi"

'CP1252' 'UTF-8' 'UTF-16' 'UTF-16-LE' 'UTF-16-BE' 'Unicode-Escape' 'Raw-Unicode-Escape'

Mã hóa mặc định được đặt trong mô -đun trang web và có thể được truy vấn bằng sys.getDefaultEncoding []. Trong nhiều trường hợp, mã hóa mặc định là 'ASCII', có nghĩa là các ký tự ASCII có giá trị trong phạm vi [0x00,0x7F] được ánh xạ trực tiếp đến các ký tự Unicode trong phạm vi [U+0000, U+007F]. Tuy nhiên, 'UTF-8' cũng là một cài đặt rất phổ biến. Chi tiết kỹ thuật liên quan đến các mã hóa phổ biến xuất hiện trong một phần sau. Khi sử dụng phương thức s.decode [], người ta luôn cho rằng s là một chuỗi byte. Trong Python 2, điều này có nghĩa là S là một chuỗi tiêu chuẩn, nhưng trong Python 3, S phải là loại byte đặc biệt. Tương tự, kết quả của t.encode [] luôn luôn là một chuỗi byte. Một thận trọng nếu bạn quan tâm đến tính di động là các phương pháp này có một chút mờ nhạt trong Python 2. Ví dụ, chuỗi Python 2 có cả hai phương thức giải mã [] và mã hóa [], trong khi trong Python 3, chuỗi chỉ có phương thức mã hóa [] và Loại byte chỉ có phương thức decode []. Để đơn giản hóa mã trong python 2, đảm bảo bạn chỉ sử dụng encode [] trên chuỗi unicode và giải mã [] trên chuỗi byte. Khi các giá trị chuỗi đang được chuyển đổi, một ngoại lệ unicodeerror có thể được nâng lên nếu một ký tự có thể được chuyển đổi được chuyển đổi. Chẳng hạn, nếu bạn đang cố gắng mã hóa một chuỗi thành 'ASCII' và nó chứa một ký tự unicode như U+1F28, bạn sẽ gặp lỗi mã hóa vì giá trị ký tự này quá lớn để được biểu diễn trong bộ ký tự ASCII. tham số lỗi của các phương thức mã hóa [] và giải mã [] xác định cách xử lý lỗi mã hóa. Nó có một chuỗi với một trong các giá trị sau: Giá trị

Sự mô tả

'ASCII' 'Latin-1' hoặc 'ISO-8859-1'

ASCII 7-bit ISO 8859-1 Latin-1 Windows 1252 Mã hóa mã hóa biến đổi độ dài thay đổi 8 bit [có thể là ít hoặc lớn UTF-16, mã hóa endian nhỏ, mã hóa endian lớn Cùng một định dạng với unicode nghĩa đen u "chuỗi" cùng định dạng với unicode thô theo nghĩa đen của bạn "chuỗi"

'CP1252' 'UTF-8' 'UTF-16' 'UTF-16-LE' 'UTF-16-BE' 'Unicode-Escape' 'Raw-Unicode-Escape'

Mã hóa mặc định được đặt trong mô -đun trang web và có thể được truy vấn bằng sys.getDefaultEncoding []. Trong nhiều trường hợp, mã hóa mặc định là 'ASCII', có nghĩa là các ký tự ASCII có giá trị trong phạm vi [0x00,0x7F] được ánh xạ trực tiếp đến các ký tự Unicode trong phạm vi [U+0000, U+007F]. Tuy nhiên, 'UTF-8' cũng là một cài đặt rất phổ biến. Chi tiết kỹ thuật liên quan đến các mã hóa phổ biến xuất hiện trong một phần sau. Khi sử dụng phương thức s.decode [], người ta luôn cho rằng s là một chuỗi byte. Trong Python 2, điều này có nghĩa là S là một chuỗi tiêu chuẩn, nhưng trong Python 3, S phải là loại byte đặc biệt. Tương tự, kết quả của t.encode [] luôn luôn là một chuỗi byte. Một thận trọng nếu bạn quan tâm đến tính di động là các phương pháp này có một chút mờ nhạt trong Python 2. Ví dụ, chuỗi Python 2 có cả hai phương thức giải mã [] và mã hóa [], trong khi trong Python 3, chuỗi chỉ có phương thức mã hóa [] và Loại byte chỉ có phương thức decode []. Để đơn giản hóa mã trong python 2, đảm bảo bạn chỉ sử dụng encode [] trên chuỗi unicode và giải mã [] trên chuỗi byte. Khi các giá trị chuỗi đang được chuyển đổi, một ngoại lệ unicodeerror có thể được nâng lên nếu một ký tự có thể được chuyển đổi được chuyển đổi. Chẳng hạn, nếu bạn đang cố gắng mã hóa một chuỗi thành 'ASCII' và nó chứa một ký tự unicode như U+1F28, bạn sẽ gặp lỗi mã hóa vì giá trị ký tự này quá lớn để được biểu diễn trong bộ ký tự ASCII. tham số lỗi của các phương thức mã hóa [] và giải mã [] xác định cách xử lý lỗi mã hóa. Nó có một chuỗi với một trong các giá trị sau: Giá trị

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

167

và là một trong hơn một trăm mã hóa ký tự khác nhau. Tuy nhiên, các giá trị sau đây là phổ biến nhất: giá trị

Unicode I/O Khi làm việc với các chuỗi Unicode, không bao giờ có thể trực tiếp ghi dữ liệu Unicode thô vào một tệp. Đây là do các ký tự Unicode được biểu diễn bên trong như số nguyên đa tế bào và việc viết số nguyên đó trực tiếp vào luồng đầu ra gây ra Các vấn đề liên quan đến đặt hàng byte. Ví dụ: bạn sẽ phải quyết định tùy ý để ký tự UNICode U+HHLL được viết theo định dạng Little Little endian là chuỗi byte sẽ hoặc ở định dạng end endian endian là chuỗi byte hh ll. Hơn nữa, các công cụ khác mà quá trình unicode sẽ phải biết bạn đã sử dụng mã hóa nào. Do vấn đề này, biểu diễn bên ngoài của chuỗi Unicode luôn được thực hiện theo quy tắc mã hóa cụ thể xác định chính xác các ký tự unicode được biểu diễn như một chuỗi byte. Trong phần trước được mở rộng cho các tệp. Mô-đun codec tích hợp chứa một tập hợp các chức năng để chuyển đổi dữ liệu hướng byte sang và từ các chuỗi Unicode theo nhiều sơ đồ mã hóa dữ liệu khác nhau. Có lẽ cách đơn giản nhất để xử lý các tệp unicode là sử dụng hàm codecs.open [tên tệp [, chế độ [, mã hóa [, lỗi]]]] ',' utf-8 ',' nghiêm ngặt '] g = codecs.open [' bar.txt ',' w ',' utf-8 ']]

# Đọc viết

Điều này tạo ra một đối tượng tệp đọc hoặc ghi các chuỗi unicode. Tham số mã hóa chỉ định mã hóa ký tự cơ bản sẽ được sử dụng để dịch dữ liệu vì nó được đọc hoặc ghi vào tệp. Tham số lỗi xác định cách xử lý lỗi và là một trong số ' nghiêm ngặt ',' phớt lờ ',' thay thế ',' backslashreplace 'hoặc' xmlcharrefreplace 'như được mô tả trong phần trước. Nếu bạn đã có một đối tượng tệp, codecs.encodedfile [file, inputenc [, outputenc [, error]]] có thể được sử dụng để đặt một trình bao bọc mã hóa xung quanh nó. Ở đây, một ví dụ: f = open ["foo.txt", "rb"] ... fenc = codecs.encodedfile [f, 'UTF-8']

F

H lib

fl

B

d

ff

168

Chương 9 Đầu vào và đầu ra

Trong trường hợp này, dữ liệu được đọc từ tệp sẽ được giải thích theo mã hóa được cung cấp trong InputenC. Dữ liệu được ghi vào tệp sẽ được giải thích theo mã hóa trong InputenC và được viết theo mã hóa trong OutputenC. Nếu OutputenCenc bị bỏ qua, nó mặc định giống như InputenC. Lỗi có ý nghĩa tương tự như được mô tả trước đó. Khi đặt một trình bao bọc mã hóa xung quanh một tệp hiện có, hãy đảm bảo rằng tệp ở chế độ nhị phân. Nếu không, bản dịch mới có thể phá vỡ mã hóa. Khi bạn làm việc với các tệp Unicode, mã hóa dữ liệu thường được nhúng trong chính tệp. Ví dụ: trình phân tích cú pháp XML có thể xem xét một vài byte đầu tiên của chuỗi '' để xác định mã hóa tài liệu. Nếu bốn giá trị đầu tiên là 3C 3F 78 6D ['>>

Để khắc phục điều này, bạn có thể đặt biến môi trường pythonioencoding thành một cái gì đó như 'ASCII: Backslashreplace' hoặc 'UTF-8'. Bây giờ, bạn sẽ nhận được cái này: >>> a = 'jalape \ xf1o' >>> a 'jalape \ xf1o' >>>

Trên Windows, một số biến môi trường như PythonPath được đọc bổ sung từ các mục đăng ký được tìm thấy trong HKEY_LOCAL_MACHINE/phần mềm/Python.

Các phiên tương tác Nếu không có tên chương trình được đưa ra và đầu vào tiêu chuẩn cho trình thông dịch là một thiết bị đầu cuối tương tác, Python bắt đầu ở chế độ tương tác. Trong chế độ này, một thông báo biểu ngữ được in và người dùng được trình bày với lời nhắc. Ngoài ra, trình thông dịch đánh giá tập lệnh có trong biến môi trường PythonStartup [nếu SET]. Tập lệnh này được đánh giá như thể nó là một phần của chương trình đầu vào [nghĩa là nó được tải bằng cách sử dụng câu lệnh nhập]. Một ứng dụng của tập lệnh này có thể là đọc tệp cấu hình người dùng như .pythonrc. Khi đầu vào tương tác đang được chấp nhận, hai lời nhắc của người dùng sẽ xuất hiện. Lời nhắc >>> xuất hiện khi bắt đầu một câu lệnh mới; ... lời nhắc biểu thị một câu lệnh tiếp tục. Ở đây, một ví dụ: >>> cho tôi trong phạm vi [0,4]: ... In I, ... 0 1 2 3 >>>

F

H lib

fl

B

d

ff

Chương 9 Đầu vào và đầu ra

176

Trong trường hợp này, dữ liệu được đọc từ tệp sẽ được giải thích theo mã hóa được cung cấp trong InputenC. Dữ liệu được ghi vào tệp sẽ được giải thích theo mã hóa trong InputenC và được viết theo mã hóa trong OutputenC. Nếu OutputenCenc bị bỏ qua, nó mặc định giống như InputenC. Lỗi có ý nghĩa tương tự như được mô tả trước đó. Khi đặt một trình bao bọc mã hóa xung quanh một tệp hiện có, hãy đảm bảo rằng tệp ở chế độ nhị phân. Nếu không, bản dịch mới có thể phá vỡ mã hóa. Khi bạn làm việc với các tệp Unicode, mã hóa dữ liệu thường được nhúng trong chính tệp. Ví dụ: trình phân tích cú pháp XML có thể xem xét một vài byte đầu tiên của chuỗi '' để xác định mã hóa tài liệu. Nếu bốn giá trị đầu tiên là 3C 3F 78 6D ['>>

def my_display [x]: r = repr [x] nếu len [r]> 40: in [r [: 40]+"..."+r [-1]] khác: in [r] sys.displayhook = My_Display 3+4 Phạm vi [100000] 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1 ...]

Cuối cùng, ở chế độ tương tác, rất hữu ích khi biết rằng kết quả của thao tác cuối cùng được lưu trữ trong một biến đặc biệt [_]. Biến này có thể được sử dụng để truy xuất kết quả nếu bạn cần sử dụng nó trong các hoạt động tiếp theo. Ở đây, một ví dụ: >>> 7 + 3 10 >>> _ + 2 12 >>>

Cài đặt của biến _ xảy ra trong hàm DisplayHook [] được hiển thị trước đó. Nếu bạn xác định lại DisplayHook [], chức năng thay thế của bạn cũng sẽ đặt _ nếu bạn muốn giữ lại chức năng đó.

Khởi chạy các ứng dụng Python Trong hầu hết các trường hợp, bạn sẽ muốn các chương trình tự động khởi động trình thông dịch, thay vì trước tiên phải bắt đầu trình thông dịch theo cách thủ công. Trên Unix, điều này được thực hiện bằng cách cấp cho phép chương trình thực thi và đặt dòng đầu tiên của chương trình thành một cái gì đó như thế này: #! ..

Trên Windows, nhấp đúp vào một tệp .py, .pyw, .wpy, .pyc hoặc .pyo tự động khởi chạy trình thông dịch. Thông thường, các chương trình chạy trong một cửa sổ bảng điều khiển trừ khi chúng được đổi tên bằng một hậu tố .pyw [trong trường hợp đó chương trình chạy im lặng]. Nếu nó cần thiết để cung cấp các tùy chọn cho trình thông dịch, Python cũng có thể được bắt đầu từ tệp .bat. Ví dụ: tệp .bat này chỉ cần chạy Python trên tập lệnh và chuyển bất kỳ tùy chọn nào được cung cấp trên dấu nhắc lệnh cho trình thông dịch: :: foo.bat :: chạy tập lệnh foo.py và chuyển các tùy chọn dòng lệnh được cung cấp theo [nếu có] C: \ python26 \ python.exe C: \ Pythonscripts \ foo.py %*

F

H lib

fl

B

d

ff

Gói trang web của người dùng

177

Các tệp cấu hình trang web Một cài đặt Python điển hình có thể bao gồm một số mô-đun và gói của bên thứ ba. Để định cấu hình các gói này, trình thông dịch đầu tiên nhập trang web mô-đun. Vai trò của trang web là tìm kiếm các tệp gói và thêm các thư mục bổ sung vào mô-đun tìm kiếm sys.path. Ngoài ra, mô -đun trang web đặt mã hóa mặc định cho các chuyển đổi chuỗi Unicode. Mô -đun trang web hoạt động bằng cách đầu tiên tạo một danh sách các tên thư mục được xây dựng từ các giá trị của sys.prefix và sys.exec_prefix như sau: [sys.prefix, # windows chỉ sys.exec_prefix, # windows chỉ sys.prefix /trang web-gói ', sys.prefix +' lib/site-python ', sys.exec_prefix +' lib/pythonvers/trang web trang web ', sys.exec_prefix +' lib/site-python ']]

Ngoài ra, nếu được bật, thư mục gói trang web dành riêng cho người dùng có thể được thêm vào danh sách này [được mô tả trong phần tiếp theo]. Đối với mỗi thư mục trong danh sách, một séc được thực hiện để xem liệu thư mục có tồn tại hay không. Nếu vậy, nó đã thêm vào biến sys.path. Tiếp theo, một kiểm tra được thực hiện để xem liệu nó có chứa bất kỳ tệp cấu hình đường dẫn nào không [các tệp có hậu tố .pth]. Tệp cấu hình đường dẫn chứa một danh sách các thư mục, tệp zip hoặc các tệp .egg liên quan đến vị trí của tệp đường dẫn nên được thêm vào sys.path. Ví dụ: # Foo Cấu hình gói tệp 'foo.pth' foo Bar

Mỗi thư mục trong tệp cấu hình đường dẫn phải được liệt kê trên một dòng riêng biệt. Nhận xét và các dòng trống bị bỏ qua. Khi mô -đun trang web tải tệp, nó kiểm tra xem mỗi thư mục có tồn tại hay không. Nếu vậy, thư mục được thêm vào sys.path. Các mục trùng lặp được thêm vào đường dẫn chỉ một lần. Sau khi tất cả các đường dẫn đã được thêm vào sys.Path, một nỗ lực được thực hiện để nhập một mô -đun có tên Sitecustomize. Mục đích của mô -đun này là thực hiện bất kỳ tùy chỉnh trang web bổ sung [và tùy ý] nào. Nếu việc nhập sitecustomize không thành công với một nhà nhập khẩu, lỗi âm thầm bị bỏ qua. Nhập Sitecustomize xảy ra trước khi thêm bất kỳ thư mục người dùng nào vào sys.path.SUS, việc đặt tệp này vào thư mục của riêng bạn không có hiệu lực. Mô -đun trang web cũng chịu trách nhiệm thiết lập mã hóa Unicode mặc định. Theo mặc định, mã hóa được đặt thành 'ASCII'. Tuy nhiên, mã hóa có thể được thay đổi bằng cách đặt mã trong sitecustomize.py gọi sys.setDefaultEncoding [] với mã hóa mới như 'UTF-8'. Nếu bạn sẵn sàng thử nghiệm, mã nguồn của trang web cũng có thể được sửa đổi để tự động đặt mã hóa dựa trên cài đặt địa phương của máy.

Thông thường, các gói trang web của người dùng, các mô-đun bên thứ ba được cài đặt theo cách giúp chúng có thể truy cập được cho tất cả người dùng. Tuy nhiên, người dùng cá nhân có thể cài đặt các mô-đun và gói trong thư mục trang web trên mỗi người dùng. Trên các hệ thống Unix và Macintosh, thư mục này được tìm thấy trong ~/.Local và được đặt tên là một cái gì đó như ~/.Local/lib/python2.6/trang web. Trên Windows Systems, thư mục này được xác định bởi biến môi trường % AppData %,

F

H lib

fl

B

d

ff

178

Chương 10 Môi trường thực hiện

Đây thường là một cái gì đó tương tự như C: \ Tài liệu và Cài đặt \ David Beazley \ Dữ liệu ứng dụng. Trong thư mục đó, bạn sẽ tìm thấy thư mục "Python \ Python26 \ Site-Packages". Nếu bạn đang viết các mô-đun và gói Python của riêng mình mà bạn muốn sử dụng trong thư viện, chúng có thể được đặt trong thư mục trang web trên mỗi người dùng. Nếu bạn đang cài đặt các mô-đun bên thứ ba, bạn có thể cài đặt chúng theo cách thủ công trong thư mục này bằng cách cung cấp tùy chọn --User để setup.py. Ví dụ: Cài đặt python setup.py.

Kích hoạt các tính năng trong tương lai Các tính năng ngôn ngữ mới ảnh hưởng đến khả năng tương thích với các phiên bản Python cũ hơn thường bị vô hiệu hóa khi chúng xuất hiện lần đầu tiên trong bản phát hành. Để có thể sử dụng các tính năng này, câu lệnh từ _ _future_ _ Nhập tính năng nhập có thể được sử dụng. Ở đây, một ví dụ: # Bật ngữ nghĩa phân chia mới từ _ _future_ _ Bộ phận nhập khẩu

Khi được sử dụng, câu lệnh này sẽ xuất hiện dưới dạng câu lệnh đầu tiên của một mô -đun hoặc chương trình. Hơn nữa, phạm vi nhập khẩu _ _future_ _ chỉ bị giới hạn ở mô -đun mà nó được sử dụng. Vì vậy, việc nhập một tính năng trong tương lai không ảnh hưởng đến hành vi của các mô -đun thư viện của Python hoặc mã cũ hơn yêu cầu hành vi trước đó của trình thông dịch để vận hành chính xác. Hiện tại, các tính năng sau đã được xác định: Bảng 10.3

Tên tính năng trong mô -đun _ _future_ _

Tên tính năng

Sự mô tả

Nested_scopes

Hỗ trợ cho phạm vi lồng nhau trong các chức năng. Được giới thiệu lần đầu tiên trong Python 2.1 và thực hiện hành vi mặc định trong Python 2.2. Hỗ trợ cho máy phát điện. Được giới thiệu lần đầu tiên trong Python 2.2 và thực hiện hành vi mặc định trong Python 2.3. Phân chia được sửa đổi ngữ nghĩa nơi phân chia số nguyên trả về kết quả phân số. Ví dụ: 1/4 mang lại 0,25 thay vì 0. lần đầu tiên được giới thiệu trong Python 2.2 và vẫn là một tính năng tùy chọn như Python 2.6. Đây là hành vi mặc định trong Python 3.0. Hành vi sửa đổi của nhập khẩu liên quan đến gói. Hiện tại, khi một mô hình con của một gói tạo ra một câu lệnh nhập như Chuỗi nhập, trước tiên nó nhìn vào thư mục hiện tại của gói và sau đó là thư mục trong sys.path. Tuy nhiên, điều này làm cho không thể tải các mô -đun trong thư viện tiêu chuẩn nếu một gói tình cờ sử dụng các tên mâu thuẫn. Khi tính năng này được bật, mô -đun nhập câu lệnh là nhập tuyệt đối. Do đó, một câu lệnh như chuỗi nhập sẽ luôn tải mô -đun chuỗi từ thư viện tiêu chuẩn. Được giới thiệu lần đầu tiên trong Python 2.5 và vẫn bị vô hiệu hóa trong Python 2.6. Nó được kích hoạt trong Python 3.0. Hỗ trợ cho các nhà quản lý bối cảnh và tuyên bố với. Được giới thiệu lần đầu tiên trong Python 2.5 và được bật theo mặc định trong Python 2.6. Sử dụng hàm python 3.0 print [] thay vì câu lệnh in. Được giới thiệu lần đầu tiên trong Python 2.6 và được bật theo mặc định trong Python 3.0.

Bộ phận máy phát điện

Tuyệt đối_Import

với_statement print_function

F

H lib

fl

B

d

ff

Chương 10 Môi trường thực hiện

179

Đây thường là một cái gì đó tương tự như C: \ Tài liệu và Cài đặt \ David Beazley \ Dữ liệu ứng dụng. Trong thư mục đó, bạn sẽ tìm thấy thư mục "Python \ Python26 \ Site-Packages". Nếu bạn đang viết các mô-đun và gói Python của riêng mình mà bạn muốn sử dụng trong thư viện, chúng có thể được đặt trong thư mục trang web trên mỗi người dùng. Nếu bạn đang cài đặt các mô-đun bên thứ ba, bạn có thể cài đặt chúng theo cách thủ công trong thư mục này bằng cách cung cấp tùy chọn --User để setup.py. Ví dụ: Cài đặt python setup.py.

Kích hoạt các tính năng trong tương lai Các tính năng ngôn ngữ mới ảnh hưởng đến khả năng tương thích với các phiên bản Python cũ hơn thường bị vô hiệu hóa khi chúng xuất hiện lần đầu tiên trong bản phát hành. Để có thể sử dụng các tính năng này, câu lệnh từ _ _future_ _ Nhập tính năng nhập có thể được sử dụng. Ở đây, một ví dụ: # Bật ngữ nghĩa phân chia mới từ _ _future_ _ Bộ phận nhập khẩu

Khi được sử dụng, câu lệnh này sẽ xuất hiện dưới dạng câu lệnh đầu tiên của một mô -đun hoặc chương trình. Hơn nữa, phạm vi nhập khẩu _ _future_ _ chỉ bị giới hạn ở mô -đun mà nó được sử dụng. Vì vậy, việc nhập một tính năng trong tương lai không ảnh hưởng đến hành vi của các mô -đun thư viện của Python hoặc mã cũ hơn yêu cầu hành vi trước đó của trình thông dịch để vận hành chính xác. Hiện tại, các tính năng sau đã được xác định: Bảng 10.3

One final peculiarity about program termination is that the _ _del_ _ method for some objects may try to access global data or methods defined in other modules. Because these objects may already have been destroyed, a NameError exception occurs in _ _del_ _, and you may get an error such as the following: Exception exceptions.NameError: 'c' in ignored

If this occurs, it means that _ _del_ _ has aborted prematurely. It also implies that it may have failed in an attempt to perform an important operation [such as cleanly shutting down a server connection]. If this is a concern, it’s probably a good idea to perform an explicit shutdown step in your code, rather than rely on the interpreter to destroy objects cleanly at program termination.The peculiar NameError exception can also be

F

h Lib

fL

B

d

ff

180

Chapter 10 Execution Environment

eliminated by declaring default arguments in the declaration of the _ _del_ _[] method: import foo class Bar[object]: def _ _del_ _[self, foo=foo]: foo.bar[] # Use something in module foo

In some cases, it may be useful to terminate program execution without performing any cleanup actions.This can be accomplished by calling os._exit[status].This function provides an interface to the low-level exit[] system call responsible for killing the Python interpreter process.When it’s invoked, the program immediately terminates without any further processing or cleanup.

F

h Lib

fL

B

d

ff

11 Testing, Debugging, Profiling, and Tuning U

nlike programs in languages such as C or Java, Python programs are not processed by a compiler that produces an executable program. In those languages, the compiler is the first line of defense against programming errors—catching mistakes such as calling functions with the wrong number of arguments or assigning improper values to variables [that is, type checking]. In Python, however, these kinds of checks do not occur until a program runs. Because of this, you will never really know if your program is correct until you run and test it. Not only that, unless you are able to run your program in a way that executes every possible branch of its internal control-flow, there is always some chance of a hidden error just waiting to strike [fortunately, this usually only happens a few days after shipping, however]. To address these kinds of problems, this chapter covers techniques and library modules used to test, debug, and profile Python code. At the end, some strategies for optimizing Python code are discussed.

Documentation Strings and the doctest Module If the first line of a function, class, or module is a string, that string is known as a documentation string.The inclusion of documentation strings is considered good style because these strings are used to supply information to Python software development tools. For example, the help[] command inspects documentation strings, and Python IDEs look at the strings as well. Because programmers tend to view documentation strings while experimenting in the interactive shell, it is common for the strings to include short interactive examples. For example: # splitter.py def split[line, types=None, delimiter=None]: """Splits a line of text and optionally performs type conversion. For example: >>> split['GOOG 100 490.50'] ['GOOG', '100', '490.50'] >>> split['GOOG 100 490.50',[str, int, float]] ['GOOG', 100, 490.5] >>>

F

h Lib

fL

B

d

ff

182

Chapter 11 Testing, Debugging, Profiling, and Tuning

By default, splitting is performed on whitespace, but a different delimiter can be selected with the delimiter keyword argument: >>> split['GOOG,100,490.50',delimiter=','] ['GOOG', '100', '490.50'] >>> """ fields = line.split[delimiter] if types: fields = [ ty[val] for ty,val in zip[types,fields] ] return fields

A common problem with writing documentation is keeping the documentation synchronized with the actual implementation of a function. For example, a programmer might modify a function but forget to update the documentation. To address this problem, use the doctest module. doctest collects documentation strings, scans them for interactive sessions, and executes them as a series of tests.To use doctest, you typically create a separate module for testing. For example, if the previous function is in a file splitter.py, you would create a file testsplitter.py for testing, as follows: # testsplitter.py import splitter import doctest nfail, ntests = doctest.testmod[splitter]

In this code, the call to doctest.testmod[module] runs tests on the specified module and returns the number of failures and total number of tests executed. No output is produced if all of the tests pass. Otherwise, you will get a failure report that shows the difference between the expected and received output. If you want to see verbose output of the tests, you can use testmod[module, verbose=True]. As an alternative to creating a separate testing file, library modules can test themselves by including code such as this at the end of the file: ... if _ _name_ _ == '_ _main_ _': # test myself import doctest doctest.testmod[]

Với mã này, các thử nghiệm tài liệu sẽ chạy nếu tệp được chạy làm chương trình chính cho trình thông dịch. Mặt khác, các thử nghiệm bị bỏ qua nếu tệp được tải với nhập. DocTest mong đợi đầu ra của các chức năng phù hợp với đầu ra chính xác mà bạn nhận được trong trình thông dịch tương tác. Kết quả là, nó khá nhạy cảm với các vấn đề về không gian trắng và độ chính xác số. Ví dụ, hãy xem xét chức năng này: def Half [x]: "" "Halves x.

Ví dụ:

>>> Một nửa [6.8] 3.4 >>> "" "Return X/2

F

H lib

fl

B

d

ff

Kiểm tra đơn vị và mô -đun nhất

183

Nếu bạn chạy tài liệu về chức năng này, bạn sẽ nhận được một báo cáo thất bại như thế này: ****** / TÌM HIỂU ****** / TÌM _main_ _.half Ví dụ thất bại: một nửa [6.8] Dự kiến: 3.4 Got: 3.39999999999999 ****** / TÌM HIỂU

Để khắc phục điều này, bạn cần phải làm cho tài liệu chính xác khớp với đầu ra hoặc cần chọn một ví dụ tốt hơn trong tài liệu. Bởi vì sử dụng DocTest gần như tầm thường, hầu như không có lý do gì để không sử dụng nó với các chương trình của riêng bạn. Tuy nhiên, hãy nhớ rằng DocTest không phải là một mô -đun mà bạn thường sử dụng để thử nghiệm chương trình đầy đủ. Làm như vậy có xu hướng dẫn đến các chuỗi tài liệu quá dài và phức tạp, điều này đánh bại điểm sản xuất tài liệu hữu ích [ví dụ: người dùng có thể sẽ khó chịu nếu anh ta yêu cầu trợ giúp và tài liệu liệt kê 50 ví dụ bao gồm tất cả các loại trường hợp khó khăn]. Đối với loại thử nghiệm này, bạn muốn sử dụng mô -đun Unittest. Cuối cùng, mô -đun tài liệu nhất có một số lượng lớn các tùy chọn cấu hình liên quan đến các khía cạnh khác nhau của cách thực hiện thử nghiệm và cách báo cáo kết quả. Bởi vì các tùy chọn này không bắt buộc cho việc sử dụng mô -đun phổ biến nhất, chúng không được đề cập ở đây. Tham khảo ý kiến ​​//docs.python.org/l Library/doctest.html để biết thêm chi tiết.

Kiểm tra đơn vị và mô -đun Unittest để thử nghiệm chương trình đầy đủ hơn, hãy sử dụng mô -đun Unittest. Với thử nghiệm đơn vị, một nhà phát triển viết một tập hợp các trường hợp kiểm tra bị cô lập cho mỗi yếu tố tạo nên một chương trình [ví dụ: các chức năng, phương pháp, lớp học riêng lẻ và lớp Các mô -đun]. Các thử nghiệm này sau đó được chạy để xác minh hành vi chính xác của các khối xây dựng cơ bản tạo nên các chương trình lớn hơn. Khi các chương trình phát triển về kích thước, các thử nghiệm đơn vị cho các thành phần khác nhau có thể được kết hợp để tạo ra các khung thử nghiệm lớn và các công cụ kiểm tra. Điều này có thể đơn giản hóa rất nhiều nhiệm vụ xác minh hành vi chính xác cũng như cách ly và khắc phục các vấn đề khi chúng xảy ra. Việc sử dụng mô -đun này có thể được minh họa bằng danh sách mã trong phần trước: # splitter.py def split [line, type = none, delimiter = none]: "" "chia một dòng văn bản và tùy chọn thực hiện chuyển đổi loại. .. .. ""

F

H lib

fl

B

d

ff

184

Kiểm tra đơn vị và mô -đun nhất

Nếu bạn chạy tài liệu về chức năng này, bạn sẽ nhận được một báo cáo thất bại như thế này: ****** / TÌM HIỂU ****** / TÌM _main_ _.half Ví dụ thất bại: một nửa [6.8] Dự kiến: 3.4 Got: 3.39999999999999 ****** / TÌM HIỂU

Để khắc phục điều này, bạn cần phải làm cho tài liệu chính xác khớp với đầu ra hoặc cần chọn một ví dụ tốt hơn trong tài liệu. Bởi vì sử dụng DocTest gần như tầm thường, hầu như không có lý do gì để không sử dụng nó với các chương trình của riêng bạn. Tuy nhiên, hãy nhớ rằng DocTest không phải là một mô -đun mà bạn thường sử dụng để thử nghiệm chương trình đầy đủ. Làm như vậy có xu hướng dẫn đến các chuỗi tài liệu quá dài và phức tạp, điều này đánh bại điểm sản xuất tài liệu hữu ích [ví dụ: người dùng có thể sẽ khó chịu nếu anh ta yêu cầu trợ giúp và tài liệu liệt kê 50 ví dụ bao gồm tất cả các loại trường hợp khó khăn]. Đối với loại thử nghiệm này, bạn muốn sử dụng mô -đun Unittest. Cuối cùng, mô -đun tài liệu nhất có một số lượng lớn các tùy chọn cấu hình liên quan đến các khía cạnh khác nhau của cách thực hiện thử nghiệm và cách báo cáo kết quả. Bởi vì các tùy chọn này không bắt buộc cho việc sử dụng mô -đun phổ biến nhất, chúng không được đề cập ở đây. Tham khảo ý kiến ​​//docs.python.org/l Library/doctest.html để biết thêm chi tiết.

Kiểm tra đơn vị và mô -đun Unittest để thử nghiệm chương trình đầy đủ hơn, hãy sử dụng mô -đun Unittest. Với thử nghiệm đơn vị, một nhà phát triển viết một tập hợp các trường hợp kiểm tra bị cô lập cho mỗi yếu tố tạo nên một chương trình [ví dụ: các chức năng, phương pháp, lớp học riêng lẻ và lớp Các mô -đun]. Các thử nghiệm này sau đó được chạy để xác minh hành vi chính xác của các khối xây dựng cơ bản tạo nên các chương trình lớn hơn. Khi các chương trình phát triển về kích thước, các thử nghiệm đơn vị cho các thành phần khác nhau có thể được kết hợp để tạo ra các khung thử nghiệm lớn và các công cụ kiểm tra. Điều này có thể đơn giản hóa rất nhiều nhiệm vụ xác minh hành vi chính xác cũng như cách ly và khắc phục các vấn đề khi chúng xảy ra. Việc sử dụng mô -đun này có thể được minh họa bằng danh sách mã trong phần trước: # splitter.py def split [line, type = none, delimiter = none]: "" "chia một dòng văn bản và tùy chọn thực hiện chuyển đổi loại. .. .. ""

Được gọi để thực hiện các bước thiết lập trước khi chạy bất kỳ phương pháp kiểm tra nào. t.teardown []

Được gọi để thực hiện các hành động dọn dẹp sau khi chạy các bài kiểm tra.

F

H lib

fl

B

d

ff

Kiểm tra đơn vị và mô -đun nhất

185

T.ASSERT_ [expr [, msg]] t.failunless [expr [, msg]]

Báo hiệu một lỗi kiểm tra nếu expr đánh giá là sai. MSG là một chuỗi tin nhắn đưa ra một lời giải thích cho sự thất bại [nếu có]. T.assertequal [X, Y [, MSG]] T.Failunlessequal [X, Y [, MSG]]

Tín hiệu lỗi kiểm tra nếu x và y không bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.assertNotequal [x, y [, msg]] t.failifequal [x, y, [, msg]]

Tín hiệu thất bại kiểm tra nếu x và y bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Assertal gần như [x, y [, địa điểm [, msg]]]

Tín hiệu lỗi kiểm tra nếu số x và y không ở trong số các vị trí thập phân của nhau. Điều này được kiểm tra bằng cách tính toán chênh lệch của x và y và làm tròn kết quả đến số lượng vị trí đã cho. Nếu kết quả bằng không, x và y gần như bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.assertnotal gần như [x, y, [, địa điểm [, msg]]]

Tín hiệu thất bại thử nghiệm nếu X và Y ít nhất là các vị trí thập phân. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Assertraise [exc, callable, ...] T.Failunlessraiese [exc, callable, ...]

Tín hiệu lỗi kiểm tra nếu đối tượng có thể gọi được có thể gọi không tăng ngoại lệ Exc. Các đối số còn lại được thông qua dưới dạng đối số cho có thể gọi được. Nhiều trường hợp ngoại lệ có thể được kiểm tra bằng cách sử dụng một bộ ngoại lệ như Exc. T.Failif [expr [, MSG]]

Tín hiệu thất bại kiểm tra nếu expr đánh giá là đúng. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Fail [[MSG]]

Báo hiệu một lỗi kiểm tra. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.FailureException

Thuộc tính này được đặt thành giá trị ngoại lệ cuối cùng bị bắt trong một thử nghiệm. Điều này có thể hữu ích nếu bạn không chỉ muốn kiểm tra xem ngoại lệ có được nêu ra không, nhưng ngoại lệ sẽ tăng giá trị thích hợp, ví dụ, nếu bạn muốn kiểm tra lỗi Tin nhắn được tạo ra như một phần của việc nâng cao một ngoại lệ.

F

H lib

fl

B

d

ff

186

Kiểm tra đơn vị và mô -đun nhất

T.ASSERT_ [expr [, msg]] t.failunless [expr [, msg]]

Báo hiệu một lỗi kiểm tra nếu expr đánh giá là sai. MSG là một chuỗi tin nhắn đưa ra một lời giải thích cho sự thất bại [nếu có]. T.assertequal [X, Y [, MSG]] T.Failunlessequal [X, Y [, MSG]]

Tín hiệu lỗi kiểm tra nếu x và y không bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.assertNotequal [x, y [, msg]] t.failifequal [x, y, [, msg]]

Tín hiệu thất bại kiểm tra nếu x và y bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Assertal gần như [x, y [, địa điểm [, msg]]]

Tín hiệu lỗi kiểm tra nếu số x và y không ở trong số các vị trí thập phân của nhau. Điều này được kiểm tra bằng cách tính toán chênh lệch của x và y và làm tròn kết quả đến số lượng vị trí đã cho. Nếu kết quả bằng không, x và y gần như bằng nhau. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.assertnotal gần như [x, y, [, địa điểm [, msg]]]

Tín hiệu thất bại thử nghiệm nếu X và Y ít nhất là các vị trí thập phân. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Assertraise [exc, callable, ...] T.Failunlessraiese [exc, callable, ...]

Tín hiệu lỗi kiểm tra nếu đối tượng có thể gọi được có thể gọi không tăng ngoại lệ Exc. Các đối số còn lại được thông qua dưới dạng đối số cho có thể gọi được. Nhiều trường hợp ngoại lệ có thể được kiểm tra bằng cách sử dụng một bộ ngoại lệ như Exc. T.Failif [expr [, MSG]]

Tín hiệu thất bại kiểm tra nếu expr đánh giá là đúng. MSG là một thông điệp giải thích sự thất bại [nếu có]. T.Fail [[MSG]]

F

H lib

fl

B

d

ff

Trình gỡ lỗi Python và mô -đun PDB

187

Các lệnh gỡ lỗi khi trình gỡ lỗi bắt đầu, nó trình bày một lời nhắc [pdb] như sau: >>> nhập pdb >>> nhập buggymodule >>> pdb.run ['buggymodule.start []']> [0]? [ ] [PDB]

[PDB] là lời nhắc trình gỡ lỗi mà tại đó các lệnh sau được nhận dạng. Ghi chú

rằng một số lệnh có một hình thức ngắn và dài. Trong trường hợp này, dấu ngoặc đơn được sử dụng để chỉ ra cả hai hình thức. Ví dụ, H [ELP] có nghĩa là H hoặc trợ giúp được chấp nhận. [!]bản tường trình

Thực thi câu lệnh [một dòng] trong bối cảnh của khung ngăn xếp hiện tại. Điểm nhấn dấu có thể bị bỏ qua, nhưng nó phải được sử dụng để tránh sự mơ hồ nếu từ đầu tiên của câu lệnh giống như lệnh gỡ lỗi. Để đặt biến toàn cầu, Bạn có thể tiền tố lệnh gán với lệnh toàn cầu trên cùng một dòng: [pdb] toàn cầu list_options; list_options = ['-l'] [pdb] a [rgs]

In danh sách đối số của hàm hiện tại. Bí danh [Tên [Lệnh]]

Tạo một bí danh được gọi là tên thực thi lệnh. Trong chuỗi lệnh, chuỗi con '%1', '%2', v.v. được thay thế bằng các tham số khi bí danh được gõ. '%*' được thay thế bằng tất cả các tham số. Nếu không có lệnh nào được đưa ra, danh sách bí danh hiện tại được hiển thị. Bí danh có thể được lồng và có thể chứa bất cứ thứ gì có thể được gõ hợp pháp tại dấu nhắc PDB. Dưới đây là một ví dụ: # PRIN INSTANCE Biến [cách sử dụng "pi classinst"] bí danh pi cho k in%1._ _dict_ _.keys []: in "%1.", K, "=",%1._dict_ _ .

Đặt điểm dừng tại vị trí loc. LoC chỉ định tên tệp và số dòng cụ thể hoặc là tên của hàm trong mô -đun. Cú pháp sau được sử dụng: Cài đặt

Sự mô tả

N FILENAME: n Mô -đun chức năng.Function

A a a

Số dòng trong số dòng tệp hiện tại trong tên chức năng tệp khác trong tên hàm mô -đun hiện tại trong mô -đun

Nếu LỘC bị bỏ qua, tất cả các điểm dừng hiện tại được in. Điều kiện là một biểu thức phải đánh giá đúng trước khi điểm dừng được tôn vinh. Tất cả các điểm dừng được chỉ định

F

H lib

fl

B

d

ff

188

Trình gỡ lỗi Python và mô -đun PDB

Các lệnh gỡ lỗi khi trình gỡ lỗi bắt đầu, nó trình bày một lời nhắc [pdb] như sau: >>> nhập pdb >>> nhập buggymodule >>> pdb.run ['buggymodule.start []']> [0]? [ ] [PDB]

[PDB] là lời nhắc trình gỡ lỗi mà tại đó các lệnh sau được nhận dạng. Ghi chú

rằng một số lệnh có một hình thức ngắn và dài. Trong trường hợp này, dấu ngoặc đơn được sử dụng để chỉ ra cả hai hình thức. Ví dụ, H [ELP] có nghĩa là H hoặc trợ giúp được chấp nhận. [!]bản tường trình

Thực thi câu lệnh [một dòng] trong bối cảnh của khung ngăn xếp hiện tại. Điểm nhấn dấu có thể bị bỏ qua, nhưng nó phải được sử dụng để tránh sự mơ hồ nếu từ đầu tiên của câu lệnh giống như lệnh gỡ lỗi. Để đặt biến toàn cầu, Bạn có thể tiền tố lệnh gán với lệnh toàn cầu trên cùng một dòng: [pdb] toàn cầu list_options; list_options = ['-l'] [pdb] a [rgs]

In danh sách đối số của hàm hiện tại. Bí danh [Tên [Lệnh]]

Tạo một bí danh được gọi là tên thực thi lệnh. Trong chuỗi lệnh, chuỗi con '%1', '%2', v.v. được thay thế bằng các tham số khi bí danh được gõ. '%*' được thay thế bằng tất cả các tham số. Nếu không có lệnh nào được đưa ra, danh sách bí danh hiện tại được hiển thị. Bí danh có thể được lồng và có thể chứa bất cứ thứ gì có thể được gõ hợp pháp tại dấu nhắc PDB. Dưới đây là một ví dụ: # PRIN INSTANCE Biến [cách sử dụng "pi classinst"] bí danh pi cho k in%1._ _dict_ _.keys []: in "%1.", K, "=",%1._dict_ _ .

Đặt điểm dừng tại vị trí loc. LoC chỉ định tên tệp và số dòng cụ thể hoặc là tên của hàm trong mô -đun. Cú pháp sau được sử dụng: Cài đặt

Sự mô tả

N FILENAME: n Mô -đun chức năng.Function

A a a

Số dòng trong số dòng tệp hiện tại trong tên chức năng tệp khác trong tên hàm mô -đun hiện tại trong mô -đun

Nếu LỘC bị bỏ qua, tất cả các điểm dừng hiện tại được in. Điều kiện là một biểu thức phải đánh giá đúng trước khi điểm dừng được tôn vinh. Tất cả các điểm dừng được chỉ định

F

H lib

fl

B

d

ff

Trình gỡ lỗi Python và mô -đun PDB

189

Các lệnh gỡ lỗi khi trình gỡ lỗi bắt đầu, nó trình bày một lời nhắc [pdb] như sau: >>> nhập pdb >>> nhập buggymodule >>> pdb.run ['buggymodule.start []']> [0]? [ ] [PDB]

[PDB] là lời nhắc trình gỡ lỗi mà tại đó các lệnh sau được nhận dạng. Ghi chú

rằng một số lệnh có một hình thức ngắn và dài. Trong trường hợp này, dấu ngoặc đơn được sử dụng để chỉ ra cả hai hình thức. Ví dụ, H [ELP] có nghĩa là H hoặc trợ giúp được chấp nhận. [!]bản tường trình

Thực thi câu lệnh [một dòng] trong bối cảnh của khung ngăn xếp hiện tại. Điểm nhấn dấu có thể bị bỏ qua, nhưng nó phải được sử dụng để tránh sự mơ hồ nếu từ đầu tiên của câu lệnh giống như lệnh gỡ lỗi. Để đặt biến toàn cầu, Bạn có thể tiền tố lệnh gán với lệnh toàn cầu trên cùng một dòng: [pdb] toàn cầu list_options; list_options = ['-l'] [pdb] a [rgs]

In danh sách đối số của hàm hiện tại. Bí danh [Tên [Lệnh]]

Chạy cho đến khi hàm hiện tại trả về. chạy [args]

Khởi động lại chương trình và sử dụng các đối số dòng lệnh trong Args làm cài đặt mới của sys.argv. Tất cả các điểm dừng và cài đặt trình gỡ lỗi khác được bảo tồn. bươc]

Thực hiện một dòng nguồn duy nhất và dừng bên trong các chức năng được gọi là. tbreak [loc [, điều kiện]]

Đặt một điểm dừng tạm thời mà đã loại bỏ sau lần đánh đầu tiên. lên]

Di chuyển khung hiện tại một cấp trong dấu vết ngăn xếp. Tên Unalias

Xóa bí danh được chỉ định. cho đến khi

Tiếp tục thực thi cho đến khi điều khiển rời khỏi khung thực thi hiện tại hoặc cho đến khi đạt được số dòng lớn hơn số dòng hiện tại. Ví dụ: nếu trình gỡ lỗi bị dừng ở dòng cuối cùng trong một thân vòng, gõ cho đến khi sẽ thực thi tất cả các câu lệnh trong vòng lặp cho đến khi vòng lặp kết thúc. ở đâu]

In một dấu vết ngăn xếp.

Gỡ lỗi từ dòng lệnh Một phương pháp thay thế để chạy trình gỡ lỗi là gọi nó trên dòng lệnh. Dưới đây là một ví dụ: % python -m pdb somePramram.py

F

H lib

fl

B

d

ff

190

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Trong trường hợp này, trình gỡ lỗi được khởi chạy tự động khi bắt đầu khởi động chương trình, nơi bạn được tự do đặt các điểm dừng và thực hiện các thay đổi cấu hình khác. Để thực hiện chương trình, chỉ cần sử dụng lệnh tiếp tục. Ví dụ: nếu bạn muốn gỡ lỗi chức năng chia [] từ trong một chương trình đã sử dụng nó, bạn có thể làm điều này: % pythonTHERM PDB someProgram.py> /Users/beazley/code/someprogram.py [1] [] -> Nhập bộ chia [PDB] b Splitter.Split Breakpoint 1 at /Users = line.split [Delimiter] [PDB]

Định cấu hình trình gỡ lỗi nếu tệp .pdbrc tồn tại trong thư mục nhà của người dùng hoặc trong thư mục hiện tại, nó được đọc và thực thi như thể nó đã được nhập vào dấu nhắc trình gỡ lỗi. Điều này có thể hữu ích để chỉ định các lệnh gỡ lỗi mà bạn muốn thực thi Thời gian trình gỡ lỗi được bắt đầu [trái ngược với việc phải gõ các lệnh tương tác mỗi lần].

Chương trình Hồ sơ hồ sơ và các mô -đun CPROFILE được sử dụng để thu thập thông tin định hình. Cả hai mô -đun đều hoạt động theo cùng một cách, nhưng CPROFILE được triển khai như một phần mở rộng C, nhanh hơn đáng kể và hiện đại hơn. Một mô -đun được sử dụng để thu thập cả thông tin bảo hiểm [nghĩa là các chức năng được thực thi] cũng như thống kê hiệu suất. Cách dễ nhất để lập trình một chương trình là thực thi nó từ dòng lệnh như sau: % python -m cprofile someProgrogram.py

Ngoài ra, chức năng sau trong mô -đun hồ sơ có thể được sử dụng: chạy [lệnh [, tên tệp]]

Thực thi nội dung của lệnh bằng cách sử dụng câu lệnh EXEC trong hồ sơ. Tên tệp là tên của một tệp trong đó dữ liệu hồ sơ thô được lưu. Nếu nó bị bỏ qua, một báo cáo được in ra đầu ra tiêu chuẩn. Kết quả của việc chạy Profiler là một báo cáo như sau: 126 cuộc gọi chức năng [6 cuộc gọi nguyên thủy] trong 5.130 CPU giây được đặt hàng bởi: Tên tiêu chuẩn NCALLS TOTTIME PERCALL CUMTIME PERCALL FILE ?] 121/1 5.020 0.041 5.020 5.020 Book.py:11[Process] 1 0,020 0.020 5.040 5.040 Book.Py:5 [?] Hồ sơ: 0 [Execfile ['Book.py']] 0 0.000 0.000 Cấu hình: 0 [Profiler]

Các phần khác nhau của báo cáo được tạo bởi Run [] được giải thích như sau:

F

H lib

fl

B

d

ff

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Trong trường hợp này, trình gỡ lỗi được khởi chạy tự động khi bắt đầu khởi động chương trình, nơi bạn được tự do đặt các điểm dừng và thực hiện các thay đổi cấu hình khác. Để thực hiện chương trình, chỉ cần sử dụng lệnh tiếp tục. Ví dụ: nếu bạn muốn gỡ lỗi chức năng chia [] từ trong một chương trình đã sử dụng nó, bạn có thể làm điều này: % pythonTHERM PDB someProgram.py> /Users/beazley/code/someprogram.py [1] [] -> Nhập bộ chia [PDB] b Splitter.Split Breakpoint 1 at /Users = line.split [Delimiter] [PDB]

191

Định cấu hình trình gỡ lỗi nếu tệp .pdbrc tồn tại trong thư mục nhà của người dùng hoặc trong thư mục hiện tại, nó được đọc và thực thi như thể nó đã được nhập vào dấu nhắc trình gỡ lỗi. Điều này có thể hữu ích để chỉ định các lệnh gỡ lỗi mà bạn muốn thực thi Thời gian trình gỡ lỗi được bắt đầu [trái ngược với việc phải gõ các lệnh tương tác mỗi lần].

Chương trình Hồ sơ hồ sơ và các mô -đun CPROFILE được sử dụng để thu thập thông tin định hình. Cả hai mô -đun đều hoạt động theo cùng một cách, nhưng CPROFILE được triển khai như một phần mở rộng C, nhanh hơn đáng kể và hiện đại hơn. Một mô -đun được sử dụng để thu thập cả thông tin bảo hiểm [nghĩa là các chức năng được thực thi] cũng như thống kê hiệu suất. Cách dễ nhất để lập trình một chương trình là thực thi nó từ dòng lệnh như sau: % python -m cprofile someProgrogram.py

Ngoài ra, chức năng sau trong mô -đun hồ sơ có thể được sử dụng: chạy [lệnh [, tên tệp]]

Thực thi nội dung của lệnh bằng cách sử dụng câu lệnh EXEC trong hồ sơ. Tên tệp là tên của một tệp trong đó dữ liệu hồ sơ thô được lưu. Nếu nó bị bỏ qua, một báo cáo được in ra đầu ra tiêu chuẩn. Kết quả của việc chạy Profiler là một báo cáo như sau: 126 cuộc gọi chức năng [6 cuộc gọi nguyên thủy] trong 5.130 CPU giây được đặt hàng bởi: Tên tiêu chuẩn NCALLS TOTTIME PERCALL CUMTIME PERCALL FILE ?] 121/1 5.020 0.041 5.020 5.020 Book.py:11[Process] 1 0,020 0.020 5.040 5.040 Book.Py:5 [?] Hồ sơ: 0 [Execfile ['Book.py']] 0 0.000 0.000 Cấu hình: 0 [Profiler]

Thực hiện các phép đo thời gian Nếu bạn đơn giản muốn thời gian một chương trình Python dài, cách dễ nhất để làm điều đó thường chỉ là chạy nó cho đến khi kiểm soát một thứ như lệnh thời gian Unix. Ngoài ra, nếu bạn có một khối các tuyên bố dài mà bạn muốn thời gian, bạn có thể chèn các cuộc gọi vào Time.Clock [] để đọc hiện tại về thời gian CPU đã qua -Clock thời gian. Ví dụ: start_cpu = Time.Clock [] start_real = Time.time [] Câu lệnh end_cpu = Time.clock [] end_real = Time.time [] in [" % f thực sự" % [end_real - start_real]] " % f CPU Seconds" % [end_cpu - start_cpu]]

Hãy ghi nhớ rằng kỹ thuật này thực sự chỉ hoạt động nếu mã được hẹn giờ chạy trong một khoảng thời gian hợp lý. Nếu bạn có một câu lệnh chi tiết mà bạn muốn điểm chuẩn, bạn có thể sử dụng hàm timeit [mã [, setup]] trong mô-đun thời gian. Ví dụ: >>> Từ thời gian nhập thời gian thời gian >>> timeit ['math.sqrt [2.0]', 'nhập khẩu'] 0.20388007164001465 >>> thời gian

F

H lib

fl

B

d

ff

192

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Trong ví dụ này, đối số đầu tiên cho timeit [] là mã bạn muốn điểm chuẩn. Đối số thứ hai là một tuyên bố được thực thi một lần để thiết lập môi trường thực thi. Hàm timeit [] chạy câu lệnh được cung cấp một triệu lần và báo cáo thời gian thực hiện. đối số từ khóa đến thời gian []. Mô -đun thời gian cũng có hàm lặp lại [] có thể được sử dụng để thực hiện các phép đo. Hàm này hoạt động giống như thời gian [] ngoại trừ việc lặp lại phép đo thời gian ba lần và trả về danh sách kết quả. Ví dụ: >>> từ Nhập thời gian lặp lại >>> lặp lại ['Math.sqrt [2.0]', 'nhập khẩu'] [0.20306601524353027, 0.19715800285339355, 0.2090739250181055] >>>

Khi thực hiện đo lường hiệu suất, người ta thường chỉ tham khảo SpeedUp liên quan, thường đề cập đến thời gian thực hiện ban đầu chia cho thời gian thực hiện mới. Ví dụ, trong các phép đo thời gian trước đó, sử dụng SQRT [2.0] thay vì Math.sqrt [2.0] biểu thị tốc độ tăng tốc 0,20388/0.14494 hoặc khoảng 1,41. Đôi khi điều này được báo cáo dưới dạng phần trăm bằng cách nói rằng tốc độ tăng tốc là khoảng 41 phần trăm.

Tạo các phép đo bộ nhớ Mô -đun SYS có hàm getsizeof [] có thể được sử dụng để điều tra dấu chân bộ nhớ [tính bằng byte] của các đối tượng python riêng lẻ. Ví dụ: >>> >>> 14 >>> 52 >>> 52 >>> 56

Nhập sys sys.getsizeOf [1] sys.getsizeOf ["Hello World"] sys.getsizeOf [[1,2,3,4]] Sum [sys.getSizeOf [x] cho x trong [1,2,3,4 ]]

Đối với các thùng chứa như danh sách, bộ dữ liệu và từ điển, kích thước được báo cáo chỉ dành cho chính đối tượng container, chứ không phải kích thước tích lũy của tất cả các đối tượng có bên trong nó. Ví dụ, trong ví dụ trước, kích thước được báo cáo của danh sách [1,2,3,4] thực sự nhỏ hơn không gian cần thiết cho bốn số nguyên [mỗi số là 14 byte]. Đây là vì nội dung của danh sách là Không bao gồm trong tổng số. Bạn có thể sử dụng sum [] như được hiển thị ở đây để tính tổng kích thước của nội dung danh sách. Xin lưu ý rằng hàm getSizeof [] sẽ chỉ cung cấp cho bạn một ý tưởng sơ bộ về việc sử dụng bộ nhớ tổng thể cho các đối tượng khác nhau. Trong nội bộ, thông dịch viên tích cực chia sẻ các đối tượng thông qua việc đếm tham chiếu để bộ nhớ thực tế được tiêu thụ bởi một đối tượng có thể ít hơn nhiều so với bạn tưởng tượng đầu tiên. Ngoài ra, do các phần mở rộng C cho Python có thể phân bổ bộ nhớ bên ngoài trình thông dịch Trình xem quá trình hệ thống hoặc Trình quản lý tác vụ. Thành thật mà nói, một cách tốt hơn để xử lý việc sử dụng bộ nhớ có thể là ngồi xuống và phân tích về nó. Nếu bạn biết chương trình của bạn sẽ phân bổ các loại cấu trúc dữ liệu khác nhau và bạn biết loại dữ liệu nào sẽ được lưu trữ trong các cấu trúc đó [nghĩa là INT, phao, chuỗi, v.v.], bạn có thể sử dụng kết quả của getsizeof [] chức năng để

F

H lib

fl

B

d

ff

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

193

Trong ví dụ này, đối số đầu tiên cho timeit [] là mã bạn muốn điểm chuẩn. Đối số thứ hai là một tuyên bố được thực thi một lần để thiết lập môi trường thực thi. Hàm timeit [] chạy câu lệnh được cung cấp một triệu lần và báo cáo thời gian thực hiện. đối số từ khóa đến thời gian []. Mô -đun thời gian cũng có hàm lặp lại [] có thể được sử dụng để thực hiện các phép đo. Hàm này hoạt động giống như thời gian [] ngoại trừ việc lặp lại phép đo thời gian ba lần và trả về danh sách kết quả. Ví dụ: >>> từ Nhập thời gian lặp lại >>> lặp lại ['Math.sqrt [2.0]', 'nhập khẩu'] [0.20306601524353027, 0.19715800285339355, 0.2090739250181055] >>>

Khi thực hiện đo lường hiệu suất, người ta thường chỉ tham khảo SpeedUp liên quan, thường đề cập đến thời gian thực hiện ban đầu chia cho thời gian thực hiện mới. Ví dụ, trong các phép đo thời gian trước đó, sử dụng SQRT [2.0] thay vì Math.sqrt [2.0] biểu thị tốc độ tăng tốc 0,20388/0.14494 hoặc khoảng 1,41. Đôi khi điều này được báo cáo dưới dạng phần trăm bằng cách nói rằng tốc độ tăng tốc là khoảng 41 phần trăm.

15 load_global 18 jump_if_false 21 pop_top

4

22 25 26 29 32 35 38 41 42 45 48 51 54 57 60 63 66 67 70 73 76 79

>>

>>

>> 5

>>

>> 5

Build_list DUP_TOP Store_Fast Load_Global Load_Global Load_Fast Call_Function get_ITER FOR_ITER unpack_singence store_fast store_fast load_fast load_fast call_function list_append jump_absolute xóa

80 load_fast 83 return_value

0 0 1 1 2

[dòng] [chia] [DELIMITER] [Trường]

1 [loại] 58 [đến 79]

0 3 2 1 2 2

[_ [1]] [zip] [loại] [trường]

25 2 4 5 3 4 5 1

[đến 70] [TY] [Val] [_ [1]] [Ty] [Val]

42 3 [_ [1]] 2 [trường] 1 [đến 80]

2 [Trường]

>>>

Các lập trình viên chuyên gia có thể sử dụng thông tin này theo hai cách. Đầu tiên, một sự tháo gỡ sẽ cho bạn thấy chính xác những hoạt động nào liên quan đến việc thực hiện một chức năng. Với nghiên cứu cẩn thận, bạn có thể phát hiện ra các cơ hội để thực hiện tăng tốc. Thứ hai, nếu bạn đang lập trình với các chủ đề, mỗi dòng được in trong việc tháo gỡ đại diện cho một hoạt động phiên dịch duy nhất trong số đó có thực thi nguyên tử. Vì vậy, nếu bạn đang cố gắng theo dõi một điều kiện đua khó khăn, thông tin này có thể hữu ích.

F

H lib

fl

B

d

194

ff

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Các chiến lược điều chỉnh Các phần sau đây phác thảo một vài chiến lược tối ưu hóa, theo ý kiến ​​của tác giả, đã được chứng minh là hữu ích với mã Python.

Hiểu chương trình của bạn trước khi bạn tối ưu hóa bất cứ điều gì, hãy biết rằng SpeedUp có được bằng cách tối ưu hóa một phần của chương trình có liên quan trực tiếp đến phần đóng góp của phần đó vào thời gian thực hiện. Ví dụ: nếu bạn tối ưu hóa một chức năng bằng cách làm cho nó chạy nhanh gấp 10 lần nhưng chức năng đó chỉ đóng góp tới 10%tổng thời gian thực hiện của chương trình, bạn sẽ chỉ tăng tốc độ tăng tốc khoảng 9%10%. Tùy thuộc vào nỗ lực liên quan đến việc thực hiện tối ưu hóa, điều này có thể hoặc không xứng đáng. Luôn luôn là một ý tưởng tốt để sử dụng mô -đun định hình trên mã mà bạn dự định tối ưu hóa. Bạn thực sự chỉ muốn tập trung vào các chức năng và phương pháp trong đó chương trình của bạn dành phần lớn thời gian của nó, không phải là hoạt động tối nghĩa chỉ được gọi là.

Hiểu các thuật toán Một thuật toán O [n log n] được thực hiện kém sẽ vượt trội hơn thuật toán O [N3] được điều chỉnh tốt nhất. Don Tiết tối ưu hóa các thuật toán không hiệu quả trước tiên tìm kiếm một thuật toán tốt hơn.

Sử dụng các loại hình, danh sách, bộ và từ điển tích hợp của Python được triển khai hoàn toàn trong C và là cấu trúc dữ liệu được điều chỉnh tinh xảo nhất trong trình thông dịch. Bạn nên chủ động sử dụng các loại này để lưu trữ và thao tác dữ liệu trong chương trình của bạn và chống lại sự thôi thúc xây dựng các cấu trúc dữ liệu tùy chỉnh của riêng bạn bắt chước chức năng của chúng [nghĩa là các cây tìm kiếm nhị phân, danh sách được liên kết, v.v.]. Phải nói rằng, bạn vẫn nên xem xét kỹ hơn các loại trong thư viện tiêu chuẩn. Một số mô-đun thư viện cung cấp các loại mới vượt trội so với các công việc xây dựng ở một số nhiệm vụ nhất định. Chẳng hạn, loại thu gom.deque cung cấp chức năng tương tự như một danh sách nhưng đã được tối ưu hóa cao để chèn các mục mới ở cả hai đầu. Một danh sách, ngược lại, chỉ hiệu quả khi kết thúc các mục ở cuối. Nếu bạn chèn các mục ở phía trước, tất cả các yếu tố khác cần phải được thay đổi để tạo phòng. Thời gian cần thiết để thực hiện điều này phát triển khi danh sách ngày càng lớn hơn. Chỉ để cung cấp cho bạn một ý tưởng về sự khác biệt, đây là một phép đo thời gian chèn một triệu mục ở phía trước danh sách và một deque: >>> từ thời gian nhập thời gian >>> thời gian ['S.Appendleft [37]' , ... 'Bộ sưu tập nhập; 1000000] 612.95199513435364

Các lập trình viên chuyên gia có thể sử dụng thông tin này theo hai cách. Đầu tiên, một sự tháo gỡ sẽ cho bạn thấy chính xác những hoạt động nào liên quan đến việc thực hiện một chức năng. Với nghiên cứu cẩn thận, bạn có thể phát hiện ra các cơ hội để thực hiện tăng tốc. Thứ hai, nếu bạn đang lập trình với các chủ đề, mỗi dòng được in trong việc tháo gỡ đại diện cho một hoạt động phiên dịch duy nhất trong số đó có thực thi nguyên tử. Vì vậy, nếu bạn đang cố gắng theo dõi một điều kiện đua khó khăn, thông tin này có thể hữu ích.

F

H lib

fl

B

d

ff

195

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Các chiến lược điều chỉnh Các phần sau đây phác thảo một vài chiến lược tối ưu hóa, theo ý kiến ​​của tác giả, đã được chứng minh là hữu ích với mã Python.

Nếu chương trình của bạn tạo ra hàng triệu từ điển khi nó chạy, thì bạn nên biết rằng cách tiếp cận đầu tiên nhanh hơn. Với một số ngoại lệ, bất kỳ tính năng nào thêm tăng cường hoặc thay đổi cách thức mà đối tượng Python hiện tại hoạt động sẽ chạy chậm hơn.

Biết cách các lớp và trường hợp xây dựng dựa trên các lớp và trường hợp do người dùng xác định từ điển được xây dựng bằng từ điển. Bởi vì điều này, các hoạt động tra cứu, đặt hoặc xóa dữ liệu phiên bản hầu như luôn luôn chạy chậm hơn so với trực tiếp thực hiện các hoạt động này trên từ điển. Nếu tất cả những gì bạn đang làm là xây dựng một cấu trúc dữ liệu đơn giản để lưu trữ dữ liệu, từ điển có thể là một lựa chọn hiệu quả hơn so với việc xác định một lớp. Chỉ để minh họa sự khác biệt, đây là một lớp đơn giản thể hiện sự nắm giữ của cổ phiếu: cổ phiếu lớp [đối tượng]: def _ _init_ _ [self, name, cổ phiếu, giá]: self.name = name self.shares = chia sẻ bản thân. Giá = Giá

Nếu bạn so sánh hiệu suất của việc sử dụng lớp này với từ điển, kết quả rất thú vị. Đầu tiên, hãy so sánh hiệu suất của việc tạo các trường hợp đơn giản: >>> từ thời gian nhập thời gian >>> thời gian ["s = stock ['goog', 100.490.10]" s = {'name': 'goog', 'chia sẻ': 100, 'giá': 490.10} "] 0.37812089920043945 >>>

Ở đây, tốc độ tạo ra các đối tượng mới là khoảng 3,5. Tiếp theo, chúng ta hãy xem hiệu suất của việc thực hiện tính toán đơn giản: >>> thời gian ["S.Shares*s.price", ... "từ cổ phiếu chứng khoán; >>> Timeit ["S ['chia sẻ']*s ['giá']", ... "s = {'name': 'goog', 'chia sẻ': 100, 'giá': 490.10}"] 0.23622798919677734 >>>

Ở đây, SpeedUp là khoảng 1.2. Bài học ở đây là chỉ vì bạn có thể xác định một đối tượng mới bằng cách sử dụng một lớp, nó không phải là cách duy nhất để làm việc với dữ liệu. Các mẫu và từ điển thường đủ tốt. Sử dụng chúng sẽ làm cho chương trình của bạn chạy nhanh hơn và sử dụng ít bộ nhớ hơn.

F

H lib

fl

B

d

ff

196

Chương 11 Thử nghiệm, gỡ lỗi, hồ sơ và điều chỉnh

Sử dụng _ _SLOTS_ _ Nếu chương trình của bạn tạo một số lượng lớn các phiên bản của các lớp do người dùng xác định, bạn có thể xem xét sử dụng thuộc tính _ _slots_ _ trong một định nghĩa lớp. Ví dụ: Class Stock [Đối tượng]: _ _Slots_ _ = ['name', 'chia sẻ', 'giá'] def __init __ [self, tên, chia sẻ, giá]: self.name = name self.shares = chia sẻ tự. Giá = Giá

_ _slots_ _ đôi khi được xem là một tính năng an toàn vì nó hạn chế tập hợp của Attrial-

Tên ute. Tuy nhiên, nó thực sự là một tối ưu hóa hiệu suất. Các lớp sử dụng _ _SLOTS_ _ don lồng sử dụng từ điển để lưu trữ dữ liệu thể hiện [thay vào đó, cấu trúc dữ liệu nội bộ hiệu quả hơn được sử dụng]. Vì vậy, không chỉ các trường hợp sẽ sử dụng bộ nhớ ít hơn nhiều mà còn truy cập vào dữ liệu thể hiện cũng hiệu quả hơn. Trong một số trường hợp, chỉ cần thêm _ _Slots_ _ sẽ làm cho một chương trình chạy nhanh hơn đáng kể mà không thực hiện bất kỳ thay đổi nào khác. Tuy nhiên, có một cảnh báo với việc sử dụng _ _slots_ _, tuy nhiên. Thêm tính năng này vào một lớp có thể khiến mã khác bị phá vỡ một cách bí ẩn. Ví dụ: người ta thường biết rằng các trường hợp lưu trữ dữ liệu của họ trong một từ điển có thể được truy cập dưới dạng thuộc tính _ _dict_ _. Khi các khe được xác định, thuộc tính này không tồn tại để bất kỳ mã nào dựa trên _ _ .

Tránh toán tử [.] Bất cứ khi nào bạn sử dụng [.] Để tra cứu một thuộc tính trên một đối tượng, nó luôn liên quan đến việc tra cứu tên. Ví dụ: khi bạn nói X.Name, có một cái nhìn cho tên biến "x" trong môi trường và sau đó là tìm kiếm thuộc tính "tên" trên x. Đối với các đối tượng do người dùng xác định, tra cứu thuộc tính có thể liên quan đến việc tìm kiếm trong từ điển, từ điển lớp và từ điển của các lớp cơ sở. Đối với các tính toán liên quan đến việc sử dụng nhiều phương thức hoặc tra cứu mô -đun, hầu như luôn luôn tốt hơn để loại bỏ việc tra cứu thuộc tính bằng cách đặt thao tác bạn muốn thực hiện vào một biến cục bộ trước tiên. Ví dụ: nếu bạn đang thực hiện nhiều thao tác gốc, việc sử dụng 'từ Math Nhập SQRT' và 'SQRT [x]' sẽ nhanh hơn là gõ 'Math.sqrt [x]'. Trong phần đầu tiên của phần này, chúng tôi đã thấy rằng phương pháp này dẫn đến tăng tốc khoảng 1,4. Rõ ràng bạn không nên cố gắng loại bỏ các tra cứu thuộc tính ở mọi nơi trong chương trình của bạn vì nó sẽ làm cho mã của bạn rất khó đọc. Tuy nhiên, đối với các phần quan trọng về hiệu suất, đây là một kỹ thuật hữu ích.

Sử dụng các ngoại lệ để xử lý các trường hợp không phổ biến để tránh lỗi, bạn có thể có xu hướng thêm kiểm tra thêm vào chương trình. Ví dụ: def parse_header [line]: field = line.split [":"] Nếu len [trường]! = 2: nâng cao RunTimeError ["Tiêu đề không phù hợp"] Tiêu đề, giá trị = trường trả về trường.Lower [], giá trị. dải []

F

H lib

fl

B

d

ff

Điều chỉnh và tối ưu hóa

197

Tuy nhiên, một cách khác để xử lý các lỗi là chỉ cần để chương trình tạo ra một ngoại lệ và bắt nó. Ví dụ: def parse_header [line]: field = line.split [":"] Hãy thử: tiêu đề, value = trường return return.lower [], value.strip [] ngoại trừ valueError: RAIN

Nếu bạn điểm chuẩn cả hai phiên bản trên một dòng được định dạng đúng, phiên bản thứ hai của mã sẽ chạy nhanh hơn khoảng 10 phần trăm. Thiết lập một khối thử cho mã thường không nâng cao các ngoại lệ chạy nhanh hơn so với thực hiện câu lệnh IF.

Tránh các trường hợp ngoại lệ cho các trường hợp phổ biến don don mã viết sử dụng xử lý ngoại lệ cho trường hợp phổ biến. Ví dụ, giả sử bạn đã có một chương trình thực hiện rất nhiều bộ tra cứu từ điển, nhưng hầu hết các bộ tra cứu này là dành cho các khóa đã tồn tại. Bây giờ, hãy xem xét hai cách tiếp cận để thực hiện tra cứu: # tiếp cận 1: Thực hiện tra cứu và bắt một ngoại lệ Hãy thử: value = item trong các mục: value = items [key] other: value = none

Trong một phép đo hiệu suất đơn giản trong đó không tìm thấy khóa, cách tiếp cận thứ hai chạy nhanh hơn 17 lần! Trong trường hợp bạn đang tự hỏi, cách tiếp cận sau này cũng chạy nhanh gần gấp đôi so với sử dụng items.get [khóa] vì toán tử trong nhanh hơn để thực hiện hơn là một cuộc gọi phương thức.

Embrace Lập trình chức năng và Liệt kê danh sách lặp lại, biểu thức máy phát, máy phát điện, coroutines và đóng cửa hiệu quả hơn nhiều so với hầu hết các lập trình viên Python nhận ra. Để xử lý dữ liệu đặc biệt, liệt kê các biểu thức toàn diện và trình tạo chạy nhanh hơn đáng kể so với mã theo cách thủ công dữ liệu và thực hiện các hoạt động tương tự. Các hoạt động này cũng chạy nhanh hơn nhiều so với mã Python cũ sử dụng các chức năng như MAP [] và Filter [] . Máy phát điện có thể được sử dụng để viết mã không chỉ chạy nhanh mà còn sử dụng bộ nhớ hiệu quả.

Sử dụng trang trí và metaclasses và metaclasses là các tính năng được sử dụng để sửa đổi các chức năng và lớp học. Tuy nhiên, vì chúng hoạt động tại thời điểm chức năng hoặc định nghĩa lớp, chúng có thể được sử dụng theo cách dẫn đến hiệu suất được cải thiện, đặc biệt là nếu một chương trình có nhiều tính năng tùy chọn có thể được bật hoặc tắt. Chương 6, Các chức năng và lập trình chức năng, có một ví dụ về việc sử dụng trình trang trí để cho phép ghi nhật ký các chức năng, nhưng theo cách không ảnh hưởng đến hiệu suất khi đăng nhập bị vô hiệu hóa.

F

H lib

fl

B

d

ff

Điều chỉnh và tối ưu hóa

F

H lib

fl

B

d

ff

Điều chỉnh và tối ưu hóa

12

Tuy nhiên, một cách khác để xử lý các lỗi là chỉ cần để chương trình tạo ra một ngoại lệ và bắt nó. Ví dụ: def parse_header [line]: field = line.split [":"] Hãy thử: tiêu đề, value = trường return return.lower [], value.strip [] ngoại trừ valueError: RAIN

13

Nếu bạn điểm chuẩn cả hai phiên bản trên một dòng được định dạng đúng, phiên bản thứ hai của mã sẽ chạy nhanh hơn khoảng 10 phần trăm. Thiết lập một khối thử cho mã thường không nâng cao các ngoại lệ chạy nhanh hơn so với thực hiện câu lệnh IF.

14

Tránh các trường hợp ngoại lệ cho các trường hợp phổ biến don don mã viết sử dụng xử lý ngoại lệ cho trường hợp phổ biến. Ví dụ, giả sử bạn đã có một chương trình thực hiện rất nhiều bộ tra cứu từ điển, nhưng hầu hết các bộ tra cứu này là dành cho các khóa đã tồn tại. Bây giờ, hãy xem xét hai cách tiếp cận để thực hiện tra cứu: # tiếp cận 1: Thực hiện tra cứu và bắt một ngoại lệ Hãy thử: value = item trong các mục: value = items [key] other: value = none

15

Trong một phép đo hiệu suất đơn giản trong đó không tìm thấy khóa, cách tiếp cận thứ hai chạy nhanh hơn 17 lần! Trong trường hợp bạn đang tự hỏi, cách tiếp cận sau này cũng chạy nhanh gần gấp đôi so với sử dụng items.get [khóa] vì toán tử trong nhanh hơn để thực hiện hơn là một cuộc gọi phương thức.

16

Embrace Lập trình chức năng và Liệt kê danh sách lặp lại, biểu thức máy phát, máy phát điện, coroutines và đóng cửa hiệu quả hơn nhiều so với hầu hết các lập trình viên Python nhận ra. Để xử lý dữ liệu đặc biệt, liệt kê các biểu thức toàn diện và trình tạo chạy nhanh hơn đáng kể so với mã theo cách thủ công dữ liệu và thực hiện các hoạt động tương tự. Các hoạt động này cũng chạy nhanh hơn nhiều so với mã Python cũ sử dụng các chức năng như MAP [] và Filter [] . Máy phát điện có thể được sử dụng để viết mã không chỉ chạy nhanh mà còn sử dụng bộ nhớ hiệu quả.

17

Sử dụng trang trí và metaclasses và metaclasses là các tính năng được sử dụng để sửa đổi các chức năng và lớp học. Tuy nhiên, vì chúng hoạt động tại thời điểm chức năng hoặc định nghĩa lớp, chúng có thể được sử dụng theo cách dẫn đến hiệu suất được cải thiện, đặc biệt là nếu một chương trình có nhiều tính năng tùy chọn có thể được bật hoặc tắt. Chương 6, Các chức năng và lập trình chức năng, có một ví dụ về việc sử dụng trình trang trí để cho phép ghi nhật ký các chức năng, nhưng theo cách không ảnh hưởng đến hiệu suất khi đăng nhập bị vô hiệu hóa.

18

Trang này cố ý để trống

19

II Thư viện Python

20

Chức năng tích hợp sẵn

21

Dịch vụ thời gian chạy Python

22

toán học

23

Cấu trúc dữ liệu, thuật toán và các tiện ích

24

Chuỗi và xử lý văn bản

25

Truy cập cơ sở dữ liệu Python

F

H lib

fl

B

d

ff

Điều chỉnh và tối ưu hóa

F

H lib

fl

B

d

ff

Điều chỉnh và tối ưu hóa

Tuy nhiên, một cách khác để xử lý các lỗi là chỉ cần để chương trình tạo ra một ngoại lệ và bắt nó. Ví dụ: def parse_header [line]: field = line.split [":"] Hãy thử: tiêu đề, value = trường return return.lower [], value.strip [] ngoại trừ valueError: RAIN

Nếu bạn điểm chuẩn cả hai phiên bản trên một dòng được định dạng đúng, phiên bản thứ hai của mã sẽ chạy nhanh hơn khoảng 10 phần trăm. Thiết lập một khối thử cho mã thường không nâng cao các ngoại lệ chạy nhanh hơn so với thực hiện câu lệnh IF.

Tránh các trường hợp ngoại lệ cho các trường hợp phổ biến don don mã viết sử dụng xử lý ngoại lệ cho trường hợp phổ biến. Ví dụ, giả sử bạn đã có một chương trình thực hiện rất nhiều bộ tra cứu từ điển, nhưng hầu hết các bộ tra cứu này là dành cho các khóa đã tồn tại. Bây giờ, hãy xem xét hai cách tiếp cận để thực hiện tra cứu: # tiếp cận 1: Thực hiện tra cứu và bắt một ngoại lệ Hãy thử: value = item trong các mục: value = items [key] other: value = none

Trong một phép đo hiệu suất đơn giản trong đó không tìm thấy khóa, cách tiếp cận thứ hai chạy nhanh hơn 17 lần! Trong trường hợp bạn đang tự hỏi, cách tiếp cận sau này cũng chạy nhanh gần gấp đôi so với sử dụng items.get [khóa] vì toán tử trong nhanh hơn để thực hiện hơn là một cuộc gọi phương thức.

Embrace Lập trình chức năng và Liệt kê danh sách lặp lại, biểu thức máy phát, máy phát điện, coroutines và đóng cửa hiệu quả hơn nhiều so với hầu hết các lập trình viên Python nhận ra. Để xử lý dữ liệu đặc biệt, liệt kê các biểu thức toàn diện và trình tạo chạy nhanh hơn đáng kể so với mã theo cách thủ công dữ liệu và thực hiện các hoạt động tương tự. Các hoạt động này cũng chạy nhanh hơn nhiều so với mã Python cũ sử dụng các chức năng như MAP [] và Filter [] . Máy phát điện có thể được sử dụng để viết mã không chỉ chạy nhanh mà còn sử dụng bộ nhớ hiệu quả.

Sử dụng trang trí và metaclasses và metaclasses là các tính năng được sử dụng để sửa đổi các chức năng và lớp học. Tuy nhiên, vì chúng hoạt động tại thời điểm chức năng hoặc định nghĩa lớp, chúng có thể được sử dụng theo cách dẫn đến hiệu suất được cải thiện, đặc biệt là nếu một chương trình có nhiều tính năng tùy chọn có thể được bật hoặc tắt. Chương 6, Các chức năng và lập trình chức năng, có một ví dụ về việc sử dụng trình trang trí để cho phép ghi nhật ký các chức năng, nhưng theo cách không ảnh hưởng đến hiệu suất khi đăng nhập bị vô hiệu hóa.

F

H lib

fl

B

d

ff

202

Chương 12 Chức năng và ngoại lệ tích hợp

Basestring

Đây là một loại dữ liệu trừu tượng là siêu lớp của tất cả các chuỗi trong Python 2 [Str và Unicode]. Nó chỉ được sử dụng để thử nghiệm loại của chuỗi. Ví dụ: isinstance [s, basestring] trả về true nếu s là loại chuỗi. Python 2 chỉ. bin [x]

Trả về một chuỗi chứa biểu diễn nhị phân của số nguyên x. Bool [[x]]

Loại đại diện cho các giá trị boolean đúng và sai. Nếu được sử dụng để chuyển đổi X, nó sẽ trả về đúng nếu X đánh giá đúng bằng cách sử dụng ngữ nghĩa thử nghiệm sự thật thông thường [nghĩa là số khác, danh sách không trống, v.v.]. Nếu không, sai được trả lại. Sai cũng là giá trị mặc định được trả về nếu bool [] được gọi mà không có bất kỳ đối số nào. Lớp bool kế thừa từ int để các giá trị boolean đúng và sai có thể được sử dụng làm số nguyên có giá trị 1 và 0 trong các tính toán toán học. bytearray [[x]]

Một loại đại diện cho một mảng byte có thể thay đổi. Khi tạo một thể hiện, x có thể là một chuỗi số nguyên trong phạm vi 0 đến 255, chuỗi 8 bit hoặc byte theo nghĩa đen hoặc một số nguyên chỉ định kích thước của mảng byte [ trong trường hợp đó, mọi mục sẽ được khởi tạo thành 0]. Một đối tượng bytearray trông giống như một loạt các số nguyên. Nếu bạn thực hiện tra cứu như [i], bạn sẽ nhận được giá trị số nguyên đại diện cho giá trị byte tại Index i. Các bài tập như [i] = v cũng yêu cầu v là giá trị byte số nguyên. Tuy nhiên, một bytearray cũng cung cấp tất cả các hoạt động thường được liên kết với các chuỗi [nghĩa là cắt, tìm [], chia [], thay thế []. Chuỗi chữ với B để chỉ ra rằng bạn đang làm việc với byte. Ví dụ: nếu bạn muốn chia một mảng byte a thành các trường bằng cách sử dụng bộ phân cách ký tự dấu phẩy, bạn sẽ sử dụng a.split [b ','] không a.split [',']. Kết quả của các hoạt động này luôn mới Các đối tượng bytearray, không phải chuỗi. Để biến một bytearray a thành một chuỗi, sử dụng phương thức a.decode [mã hóa]. Việc mã hóa 'Latin-1' sẽ trực tiếp biến một bytearray của các ký tự 8 bit thành một chuỗi mà không có bất kỳ sửa đổi nào của các giá trị ký tự cơ bản. Bytearray [S, mã hóa]

Một quy ước gọi thay thế để tạo một thể hiện bytearray từ các ký tự trong một chuỗi S trong đó mã hóa chỉ định mã hóa ký tự để sử dụng trong chuyển đổi. Byte [[x]]

Một loại đại diện cho một mảng byte bất biến. Trong Python 2, đây là bí danh cho str [] tạo ra một chuỗi các ký tự 8 bit tiêu chuẩn. Trong Python 3, byte là một loại hoàn toàn riêng biệt là phiên bản bất biến của loại bytearray được mô tả trước đó. Trong trường hợp đó, đối số X có cùng cách giải thích và có thể được sử dụng theo cách tương tự. Một cảnh báo tính di động là mặc dù các byte được xác định trong Python 2, đối tượng kết quả không hoạt động nhất quán với Python 3. Ví dụ: nếu A là một thể hiện được tạo bởi byte [], thì [i] trả về một chuỗi ký tự trong Python 2, nhưng trả về một số nguyên trong Python 3.

F

H lib

fl

B

d

ff

Chương 12 Chức năng và ngoại lệ tích hợp

203

Basestring

Đây là một loại dữ liệu trừu tượng là siêu lớp của tất cả các chuỗi trong Python 2 [Str và Unicode]. Nó chỉ được sử dụng để thử nghiệm loại của chuỗi. Ví dụ: isinstance [s, basestring] trả về true nếu s là loại chuỗi. Python 2 chỉ. bin [x]

Trả về một chuỗi chứa biểu diễn nhị phân của số nguyên x. Bool [[x]]

Loại đại diện cho các giá trị boolean đúng và sai. Nếu được sử dụng để chuyển đổi X, nó sẽ trả về đúng nếu X đánh giá đúng bằng cách sử dụng ngữ nghĩa thử nghiệm sự thật thông thường [nghĩa là số khác, danh sách không trống, v.v.]. Nếu không, sai được trả lại. Sai cũng là giá trị mặc định được trả về nếu bool [] được gọi mà không có bất kỳ đối số nào. Lớp bool kế thừa từ int để các giá trị boolean đúng và sai có thể được sử dụng làm số nguyên có giá trị 1 và 0 trong các tính toán toán học. bytearray [[x]]

Một loại đại diện cho một mảng byte có thể thay đổi. Khi tạo một thể hiện, x có thể là một chuỗi số nguyên trong phạm vi 0 đến 255, chuỗi 8 bit hoặc byte theo nghĩa đen hoặc một số nguyên chỉ định kích thước của mảng byte [ trong trường hợp đó, mọi mục sẽ được khởi tạo thành 0]. Một đối tượng bytearray trông giống như một loạt các số nguyên. Nếu bạn thực hiện tra cứu như [i], bạn sẽ nhận được giá trị số nguyên đại diện cho giá trị byte tại Index i. Các bài tập như [i] = v cũng yêu cầu v là giá trị byte số nguyên. Tuy nhiên, một bytearray cũng cung cấp tất cả các hoạt động thường được liên kết với các chuỗi [nghĩa là cắt, tìm [], chia [], thay thế []. Chuỗi chữ với B để chỉ ra rằng bạn đang làm việc với byte. Ví dụ: nếu bạn muốn chia một mảng byte a thành các trường bằng cách sử dụng bộ phân cách ký tự dấu phẩy, bạn sẽ sử dụng a.split [b ','] không a.split [',']. Kết quả của các hoạt động này luôn mới Các đối tượng bytearray, không phải chuỗi. Để biến một bytearray a thành một chuỗi, sử dụng phương thức a.decode [mã hóa]. Việc mã hóa 'Latin-1' sẽ trực tiếp biến một bytearray của các ký tự 8 bit thành một chuỗi mà không có bất kỳ sửa đổi nào của các giá trị ký tự cơ bản. Bytearray [S, mã hóa]

Một quy ước gọi thay thế để tạo một thể hiện bytearray từ các ký tự trong một chuỗi S trong đó mã hóa chỉ định mã hóa ký tự để sử dụng trong chuyển đổi. Byte [[x]]

Một loại đại diện cho một mảng byte bất biến. Trong Python 2, đây là bí danh cho str [] tạo ra một chuỗi các ký tự 8 bit tiêu chuẩn. Trong Python 3, byte là một loại hoàn toàn riêng biệt là phiên bản bất biến của loại bytearray được mô tả trước đó. Trong trường hợp đó, đối số X có cùng cách giải thích và có thể được sử dụng theo cách tương tự. Một cảnh báo tính di động là mặc dù các byte được xác định trong Python 2, đối tượng kết quả không hoạt động nhất quán với Python 3. Ví dụ: nếu A là một thể hiện được tạo bởi byte [], thì [i] trả về một chuỗi ký tự trong Python 2, nhưng trả về một số nguyên trong Python 3.

Chức năng và loại tích hợp

Byte [S, mã hóa]

Danh sách các tùy chọn cảnh báo được cung cấp cho trình thông dịch với tùy chọn dòng lệnh. Winver

Số phiên bản được sử dụng để hình thành các khóa đăng ký trên Windows.

F

H lib

fl

B

d

ff

sys

233

Các chức năng Các chức năng sau có sẵn: _clear_type_cache []

Xóa bộ đệm loại bên trong. Để tối ưu hóa phương pháp tra cứu, một bộ đệm nhỏ 1024 của các phương pháp được sử dụng gần đây được duy trì bên trong trình thông dịch. Bộ đệm này tăng tốc độ tra cứu phương pháp lặp đi lặp lại, đặc biệt là trong mã có hệ thống phân cấp kế thừa sâu. Thông thường, bạn không cần phải xóa bộ đệm này, nhưng bạn có thể làm như vậy nếu bạn đang cố gắng theo dõi vấn đề đếm tham chiếu bộ nhớ thực sự khó khăn. Ví dụ, nếu một phương thức trong bộ đệm đang giữ một tham chiếu đến một đối tượng mà bạn đang mong đợi bị phá hủy. _Current_Frames []

Trả về một định danh luồng ánh xạ từ điển vào khung ngăn xếp trên cùng của luồng thực thi tại thời điểm gọi. Thông tin này có thể hữu ích trong các công cụ viết liên quan đến gỡ lỗi luồng [nghĩa là theo dõi bế tắc]. Hãy nhớ rằng các giá trị được trả về bởi hàm này chỉ thể hiện một ảnh chụp nhanh của trình thông dịch tại thời điểm gọi. Chủ đề có thể được thực hiện ở nơi khác vào thời điểm bạn nhìn vào dữ liệu được trả về. DisplayHook [[Giá trị]]

Hàm này được gọi để in kết quả của một biểu thức khi trình thông dịch đang chạy ở chế độ tương tác. Theo mặc định, giá trị của repr [giá trị] được in thành đầu ra tiêu chuẩn và giá trị được lưu trong biến _ _builtin_ _._. Displayhook có thể được xác định lại để cung cấp hành vi khác nhau nếu muốn. ngoại lệ [loại, giá trị, traceback]

Hàm này được gọi là khi một ngoại lệ chưa được thực hiện. Loại là lớp ngoại lệ, giá trị là giá trị được cung cấp bởi câu lệnh RAISE và TraceBack là đối tượng Traceback. Hành vi mặc định là in ngoại lệ và theo dõi thành lỗi tiêu chuẩn. Tuy nhiên, chức năng này có thể được xác định lại để cung cấp xử lý thay thế các trường hợp ngoại lệ chưa được thực hiện [có thể hữu ích trong các ứng dụng chuyên dụng như gỡ lỗi hoặc tập lệnh CGI]. exc_clear []

Xóa tất cả các thông tin liên quan đến ngoại lệ cuối cùng xảy ra. Nó chỉ xóa thông tin cụ thể cho luồng gọi. exc_info []

Trả về một tuple [loại, giá trị, traceback] chứa thông tin về ngoại lệ mà hiện đang được xử lý. Loại là loại ngoại lệ, giá trị là tham số ngoại lệ được truyền để nâng cao và TraceBack là đối tượng Traceback chứa ngăn xếp cuộc gọi tại điểm xảy ra ngoại lệ. Trả về không nếu không có ngoại lệ hiện đang được xử lý. Thoát [[n]]

Thoát Python bằng cách nâng ngoại lệ hệ thống. N là mã thoát số nguyên biểu thị mã trạng thái. Giá trị 0 được coi là bình thường [mặc định]; Giá trị khác không được coi là bất thường. Nếu một giá trị không được cung cấp cho N, thì nó được in vào sys.stderr và mã thoát của 1 được sử dụng.

F

H lib

fl

B

d

ff

234

sys

Các chức năng Các chức năng sau có sẵn: _clear_type_cache []

Xóa bộ đệm loại bên trong. Để tối ưu hóa phương pháp tra cứu, một bộ đệm nhỏ 1024 của các phương pháp được sử dụng gần đây được duy trì bên trong trình thông dịch. Bộ đệm này tăng tốc độ tra cứu phương pháp lặp đi lặp lại, đặc biệt là trong mã có hệ thống phân cấp kế thừa sâu. Thông thường, bạn không cần phải xóa bộ đệm này, nhưng bạn có thể làm như vậy nếu bạn đang cố gắng theo dõi vấn đề đếm tham chiếu bộ nhớ thực sự khó khăn. Ví dụ, nếu một phương thức trong bộ đệm đang giữ một tham chiếu đến một đối tượng mà bạn đang mong đợi bị phá hủy. _Current_Frames []

Trả về một định danh luồng ánh xạ từ điển vào khung ngăn xếp trên cùng của luồng thực thi tại thời điểm gọi. Thông tin này có thể hữu ích trong các công cụ viết liên quan đến gỡ lỗi luồng [nghĩa là theo dõi bế tắc]. Hãy nhớ rằng các giá trị được trả về bởi hàm này chỉ thể hiện một ảnh chụp nhanh của trình thông dịch tại thời điểm gọi. Chủ đề có thể được thực hiện ở nơi khác vào thời điểm bạn nhìn vào dữ liệu được trả về. DisplayHook [[Giá trị]]

Hàm này được gọi để in kết quả của một biểu thức khi trình thông dịch đang chạy ở chế độ tương tác. Theo mặc định, giá trị của repr [giá trị] được in thành đầu ra tiêu chuẩn và giá trị được lưu trong biến _ _builtin_ _._. Displayhook có thể được xác định lại để cung cấp hành vi khác nhau nếu muốn. ngoại lệ [loại, giá trị, traceback]

Hàm này được gọi là khi một ngoại lệ chưa được thực hiện. Loại là lớp ngoại lệ, giá trị là giá trị được cung cấp bởi câu lệnh RAISE và TraceBack là đối tượng Traceback. Hành vi mặc định là in ngoại lệ và theo dõi thành lỗi tiêu chuẩn. Tuy nhiên, chức năng này có thể được xác định lại để cung cấp xử lý thay thế các trường hợp ngoại lệ chưa được thực hiện [có thể hữu ích trong các ứng dụng chuyên dụng như gỡ lỗi hoặc tập lệnh CGI]. exc_clear []

Xóa tất cả các thông tin liên quan đến ngoại lệ cuối cùng xảy ra. Nó chỉ xóa thông tin cụ thể cho luồng gọi. exc_info []

Trả về một tuple [loại, giá trị, traceback] chứa thông tin về ngoại lệ mà hiện đang được xử lý. Loại là loại ngoại lệ, giá trị là tham số ngoại lệ được truyền để nâng cao và TraceBack là đối tượng Traceback chứa ngăn xếp cuộc gọi tại điểm xảy ra ngoại lệ. Trả về không nếu không có ngoại lệ hiện đang được xử lý. Thoát [[n]]

Thoát Python bằng cách nâng ngoại lệ hệ thống. N là mã thoát số nguyên biểu thị mã trạng thái. Giá trị 0 được coi là bình thường [mặc định]; Giá trị khác không được coi là bất thường. Nếu một giá trị không được cung cấp cho N, thì nó được in vào sys.stderr và mã thoát của 1 được sử dụng.

Chương 13 Dịch vụ thời gian chạy Python

getCheckInterval []

Trả về hàm theo dõi được đặt bởi hàm setTrace []. getWindowsVersion []

Trả về một tuple [chính, nhỏ, xây dựng, nền tảng, văn bản] mô tả phiên bản Windows đang được sử dụng. Major là số phiên bản chính. Ví dụ: giá trị 4 cho biết Windows NT 4.0 và giá trị 5 cho biết Windows 2000 và Windows XP

F

H lib

fl

B

d

ff

tìm lại

235

biến thể. Nhỏ là số phiên bản nhỏ. Ví dụ: 0 chỉ ra Windows 2000, trong khi 1 cho biết Windows XP. Bản dựng là số xây dựng Windows. Nền tảng xác định nền tảng và là một số nguyên với một trong các giá trị chung sau: 0 [Win32 trên Windows 3.1], 1 [Windows 95,98 hoặc ME], 2 [Windows NT, 2000, XP] hoặc 3 [Windows CE ]. Văn bản là một chuỗi chứa thông tin bổ sung như "Gói dịch vụ 3". setCheckInterval [n]

Đặt số lượng hướng dẫn máy ảo Python phải được trình thông dịch thực hiện trước khi kiểm tra các sự kiện định kỳ như tín hiệu và chuyển đổi ngữ cảnh luồng. Giá trị mặc định là 10.

Đặt mã hóa mặc định. ENC là một chuỗi như 'ASCII' hoặc 'UTF-8'. Hàm này chỉ được xác định bên trong mô-đun trang web. Nó có thể được gọi từ các mô-đun Sitecustomize có thể xác định người dùng. setdlopenflags [cờ]

Đặt các cờ được truyền đến hàm c dlopen [], được sử dụng để tải các mô -đun mở rộng trên UNIX. Điều này sẽ ảnh hưởng đến cách giải quyết các ký hiệu giữa các thư viện và các mô -đun mở rộng khác. Cờ là bitwise hoặc của các giá trị có thể được tìm thấy trong mô -đun DL [xem Chương 19, Lập trình mạng mạng] - Ví dụ: Sys.SetDlopenFlags [dl.rtld_now | dl.rtld_global]. setprofile [PFUNC]

Đặt chức năng cấu hình hệ thống có thể được sử dụng để thực hiện trình hồ sơ mã nguồn. setrecursionlimit [n]

Thay đổi giới hạn đệ quy cho các hàm. Giá trị mặc định là 1000. Lưu ý rằng hệ điều hành có thể áp đặt giới hạn cứng đối với kích thước ngăn xếp, do đó, việc đặt quá mức này có thể khiến quá trình thông dịch viên Python gặp sự cố với lỗi phân đoạn hoặc vi phạm truy cập. SetTrace [TFUNC]

Đặt chức năng theo dõi hệ thống, có thể được sử dụng để thực hiện trình gỡ lỗi. Tham khảo Chương 11 để biết thông tin về trình gỡ lỗi Python.

TraceBack Mô -đun Traceback được sử dụng để thu thập và in dấu vết ngăn xếp của chương trình sau khi xảy ra ngoại lệ. Ví dụ, mô-đun cần báo cáo các lỗi theo cách không chuẩn, nếu bạn đang chạy các chương trình Python được nhúng sâu vào máy chủ mạng và bạn muốn chuyển hướng truy tìm đến tệp nhật ký. print_tb [traceback [, giới hạn [, tệp]]]]

In để giới hạn các mục nhập dấu vết từ Traceback sang tệp. Nếu giới hạn bị bỏ qua, tất cả các mục được in. Nếu tệp bị bỏ qua, đầu ra sẽ được gửi đến sys.stderr.

F

H lib

fl

B

d

ff

236

tìm lại

biến thể. Nhỏ là số phiên bản nhỏ. Ví dụ: 0 chỉ ra Windows 2000, trong khi 1 cho biết Windows XP. Bản dựng là số xây dựng Windows. Nền tảng xác định nền tảng và là một số nguyên với một trong các giá trị chung sau: 0 [Win32 trên Windows 3.1], 1 [Windows 95,98 hoặc ME], 2 [Windows NT, 2000, XP] hoặc 3 [Windows CE ]. Văn bản là một chuỗi chứa thông tin bổ sung như "Gói dịch vụ 3". setCheckInterval [n]

Đặt số lượng hướng dẫn máy ảo Python phải được trình thông dịch thực hiện trước khi kiểm tra các sự kiện định kỳ như tín hiệu và chuyển đổi ngữ cảnh luồng. Giá trị mặc định là 10.

Đặt mã hóa mặc định. ENC là một chuỗi như 'ASCII' hoặc 'UTF-8'. Hàm này chỉ được xác định bên trong mô-đun trang web. Nó có thể được gọi từ các mô-đun Sitecustomize có thể xác định người dùng. setdlopenflags [cờ]

Đặt các cờ được truyền đến hàm c dlopen [], được sử dụng để tải các mô -đun mở rộng trên UNIX. Điều này sẽ ảnh hưởng đến cách giải quyết các ký hiệu giữa các thư viện và các mô -đun mở rộng khác. Cờ là bitwise hoặc của các giá trị có thể được tìm thấy trong mô -đun DL [xem Chương 19, Lập trình mạng mạng] - Ví dụ: Sys.SetDlopenFlags [dl.rtld_now | dl.rtld_global]. setprofile [PFUNC]

Đặt chức năng cấu hình hệ thống có thể được sử dụng để thực hiện trình hồ sơ mã nguồn. setrecursionlimit [n]

Thay đổi giới hạn đệ quy cho các hàm. Giá trị mặc định là 1000. Lưu ý rằng hệ điều hành có thể áp đặt giới hạn cứng đối với kích thước ngăn xếp, do đó, việc đặt quá mức này có thể khiến quá trình thông dịch viên Python gặp sự cố với lỗi phân đoạn hoặc vi phạm truy cập. SetTrace [TFUNC]

Đặt chức năng theo dõi hệ thống, có thể được sử dụng để thực hiện trình gỡ lỗi. Tham khảo Chương 11 để biết thông tin về trình gỡ lỗi Python.

TraceBack Mô -đun Traceback được sử dụng để thu thập và in dấu vết ngăn xếp của chương trình sau khi xảy ra ngoại lệ. Ví dụ, mô-đun cần báo cáo các lỗi theo cách không chuẩn, nếu bạn đang chạy các chương trình Python được nhúng sâu vào máy chủ mạng và bạn muốn chuyển hướng truy tìm đến tệp nhật ký. print_tb [traceback [, giới hạn [, tệp]]]]

In để giới hạn các mục nhập dấu vết từ Traceback sang tệp. Nếu giới hạn bị bỏ qua, tất cả các mục được in. Nếu tệp bị bỏ qua, đầu ra sẽ được gửi đến sys.stderr.

Chương 13 Dịch vụ thời gian chạy Python

print_exception [loại, giá trị, tracback [, giới hạn [, tệp]]]]]

Giống như Format_List [Extract_TB [TraceBack, Limit]]. format_stack [[khung [, giới hạn]]]]

Giống như Format_List [Extract_Stack [khung, giới hạn]]. TB_LINENO [Traceback]

Trả về số dòng được đặt trong một đối tượng TraceBack.

F

H lib

fl

B

d

ff

loại

237

Các loại Mô-đun xác định tên cho các loại tích hợp tương ứng với các hàm, mô-đun, trình tạo, khung ngăn xếp và các yếu tố chương trình khác. Nội dung của mô-đun này thường được sử dụng cùng với hàm isInstance [] tích hợp Các hoạt động liên quan đến loại. Biến đổi

Sự mô tả

BuildInfunctionType CodeType frameType functionType Generatortype getSetDescriptypePype LambDatype thành viênDescriptype Phương thức

Loại chức năng tích hợp Loại đối tượng mã Loại khung thực thi Đối tượng Loại chức năng do người dùng xác định và LambDas Loại đối tượng máy phát điện loại Loại getSet đối tượng mô tả Loại mô -đun loại đối tượng theo dõi

Hầu hết các đối tượng loại trước đóng vai trò là hàm tạo có thể được sử dụng để tạo một đối tượng thuộc loại đó. Các mô tả sau đây cung cấp các tham số được sử dụng để tạo các hàm, mô -đun, đối tượng mã và phương thức. Chương 3 chứa thông tin chi tiết về các thuộc tính của các đối tượng được tạo và các đối số cần được cung cấp cho các chức năng được mô tả tiếp theo. FunctionType [Mã, Globals [, Tên [, DeFarags [, đóng]]]]]]

Tạo một đối tượng chức năng mới. CodeType [argcount, nlocals, stacksize, flags, codestring, hằng số, tên, varnames, fileName, tên, firstlineno, lnotab [, freevars [, cellvars]]]

Tạo một đối tượng mã mới. MethodType [hàm, ví dụ, lớp]

Tạo một phương thức thể hiện ràng buộc mới. Moduletype [Tên [, Doc]]

Tạo một đối tượng mô -đun mới.

Ghi chú n

Không nên sử dụng mô-đun các loại để giới thiệu loại đối tượng tích hợp như số nguyên, danh sách hoặc từ điển. Trong Python 2, các loại chứa các tên khác như inttype và dictType. Tuy nhiên, những cái tên này chỉ là bí danh cho tên loại tích hợp của Int và Dict. Trong mã hiện đại, bạn chỉ nên sử dụng tên loại tích hợp vì mô-đun loại chỉ chứa các tên được liệt kê trước đây trong Python 3.

F

H lib

fl

B

d

ff

238

loại

Các loại Mô-đun xác định tên cho các loại tích hợp tương ứng với các hàm, mô-đun, trình tạo, khung ngăn xếp và các yếu tố chương trình khác. Nội dung của mô-đun này thường được sử dụng cùng với hàm isInstance [] tích hợp Các hoạt động liên quan đến loại. Biến đổi

Sự mô tả

BuildInfunctionType CodeType frameType functionType Generatortype getSetDescriptypePype LambDatype thành viênDescriptype Phương thức

Sự mô tả

BuildInfunctionType CodeType frameType functionType Generatortype getSetDescriptypePype LambDatype thành viênDescriptype Phương thức

Loại chức năng tích hợp Loại đối tượng mã Loại khung thực thi Đối tượng Loại chức năng do người dùng xác định và LambDas Loại đối tượng máy phát điện loại Loại getSet đối tượng mô tả Loại mô -đun loại đối tượng theo dõi

Hầu hết các đối tượng loại trước đóng vai trò là hàm tạo có thể được sử dụng để tạo một đối tượng thuộc loại đó. Các mô tả sau đây cung cấp các tham số được sử dụng để tạo các hàm, mô -đun, đối tượng mã và phương thức. Chương 3 chứa thông tin chi tiết về các thuộc tính của các đối tượng được tạo và các đối số cần được cung cấp cho các chức năng được mô tả tiếp theo. FunctionType [Mã, Globals [, Tên [, DeFarags [, đóng]]]]]]

Tạo một đối tượng chức năng mới. CodeType [argcount, nlocals, stacksize, flags, codestring, hằng số, tên, varnames, fileName, tên, firstlineno, lnotab [, freevars [, cellvars]]]

Tạo một đối tượng mã mới. MethodType [hàm, ví dụ, lớp]

Tạo một phương thức thể hiện ràng buộc mới. Moduletype [Tên [, Doc]]

F

H lib

fl

B

d

ff

loại

239

Các loại Mô-đun xác định tên cho các loại tích hợp tương ứng với các hàm, mô-đun, trình tạo, khung ngăn xếp và các yếu tố chương trình khác. Nội dung của mô-đun này thường được sử dụng cùng với hàm isInstance [] tích hợp Các hoạt động liên quan đến loại. Biến đổi

Sự mô tả

Đây là phiên bản cấp thấp của hàm WARN []. Thông điệp và danh mục có ý nghĩa tương tự như đối với Warn []. Tên tệp, Lineno và Mô -đun chỉ định rõ ràng vị trí của cảnh báo. Đăng ký là một đối tượng đại diện cho tất cả các bộ lọc hiện đang hoạt động. Nếu sổ đăng ký bị bỏ qua, thông điệp cảnh báo không bị triệt tiêu. ShowWarning [Tin nhắn, Thể loại, Tên tệp, Lineno [, Tệp]]

Viết một cảnh báo cho một tập tin. Nếu tệp bị bỏ qua, cảnh báo được in cho sys.stderr. Định dạng [tin nhắn, danh mục, tên tệp, lineno]

Tạo chuỗi được định dạng được in khi cảnh báo được đưa ra. FilterWarnings [hành động [, message [, danh mục [, mô -đun [, lineno [, append]]]]]]]

Thêm một mục vào danh sách các bộ lọc cảnh báo. Hành động là một trong những 'lỗi', 'bỏ ​​qua', 'luôn luôn', 'mặc định', 'một lần' hoặc 'mô -đun'. Danh sách sau đây cung cấp một lời giải thích của mỗi: hành động

Sự mô tả

'Lỗi' 'bỏ qua' 'luôn luôn' 'mặc định' 'mô -đun' 'một lần'

Chuyển đổi cảnh báo thành một ngoại lệ bỏ qua cảnh báo luôn in thông báo cảnh báo in cảnh báo một lần cho từng địa điểm nơi cảnh báo xảy ra in cảnh báo một lần cho mỗi mô -đun trong đó cảnh báo xảy ra in cảnh báo một lần

thông báo là một chuỗi biểu thức thông thường được sử dụng để khớp với thông báo cảnh báo. Danh mục là một lớp cảnh báo như DEFARMERERROR. Mô -đun là một chuỗi biểu thức thông thường được khớp với tên mô -đun. Lineno là một số dòng cụ thể hoặc 0 để khớp với tất cả các dòng. Phụ lục chỉ định rằng bộ lọc phải được thêm vào danh sách tất cả các bộ lọc [đã kiểm tra lần cuối]. Theo mặc định, các bộ lọc mới được thêm vào đầu danh sách bộ lọc. Nếu bất kỳ đối số nào bị bỏ qua, nó mặc định là một giá trị phù hợp với tất cả các cảnh báo. cài đặt lại cảnh báo[]

Đặt lại tất cả các bộ lọc cảnh báo. Điều này loại bỏ tất cả các cuộc gọi trước đó cho FilterWarnings [] cũng như các tùy chọn được chỉ định với.

Ghi chú n n

Danh sách các bộ lọc hiện đang hoạt động được tìm thấy trong biến.Filters biến. Khi cảnh báo được chuyển đổi thành ngoại lệ, danh mục cảnh báo trở thành loại ngoại lệ. Chẳng hạn, một lỗi đối với DEVENTWARNING sẽ làm tăng ngoại lệ không dùng nữa.

F

H lib

fl

B

d

ff

Chương 13 Dịch vụ thời gian chạy Python

240

N

Tùy chọn có thể được sử dụng để chỉ định bộ lọc cảnh báo trên dòng lệnh. Định dạng chung của tùy chọn này là -waction: Tin nhắn: Thể loại: Mô -đun: Lineno

trong đó mỗi phần có cùng ý nghĩa như đối với hàm filterWarning []. Tuy nhiên, trong trường hợp này, các trường thông báo và mô -đun chỉ định các chuỗi con [thay vì các biểu thức chính quy] cho phần đầu tiên của thông báo cảnh báo và tên mô -đun được lọc, tương ứng.

yếu Mô -đun yếu được sử dụng để cung cấp hỗ trợ cho các tài liệu tham khảo yếu. Thông thường, một tham chiếu đến một đối tượng gây ra số lượng tham chiếu của nó để tăng hiệu quả giữ cho đối tượng tồn tại cho đến khi tham chiếu biến mất. Mặt khác, một tài liệu tham khảo yếu cung cấp một cách đề cập đến một đối tượng mà không tăng số lượng tham chiếu của nó. Điều này có thể hữu ích trong một số loại ứng dụng nhất định phải quản lý các đối tượng theo những cách bất thường. Ví dụ: trong một chương trình hướng đối tượng, nơi bạn có thể thực hiện một mối quan hệ như mẫu quan sát viên, một tham chiếu yếu có thể được sử dụng để tránh việc tạo các chu kỳ tham chiếu. Một ví dụ về điều này được hiển thị trong phần Quản lý bộ nhớ đối tượng của Google trong Chương 7. Một tham chiếu yếu được tạo bằng cách sử dụng hàm yếu >> ar = weakref.ref [a] # Tạo tham chiếu yếu đến a >>> in ar

Khi một tham chiếu yếu được tạo, đối tượng gốc có thể được lấy từ tham chiếu yếu bằng cách gọi nó là một hàm không có đối số. Nếu đối tượng cơ bản vẫn tồn tại, nó sẽ được trả về. Nếu không, không có gì được trả lại để chỉ ra rằng đối tượng ban đầu không còn tồn tại. Ví dụ: >>> in ar [] # in đối tượng gốc

>>> del a # xóa đối tượng gốc >>> in ar [] # a đã biến mất, vì vậy bây giờ điều này không trả về không có >>>>

Các chức năng sau được xác định bởi mô -đun yếu: Ref [Object [, Callback]]

Tạo một tham chiếu yếu đến đối tượng. Gọi lại là một chức năng tùy chọn sẽ được gọi khi đối tượng sắp bị phá hủy. Nếu được cung cấp, hàm này sẽ chấp nhận một đối số duy nhất, đó là đối tượng tham chiếu yếu tương ứng. Nhiều hơn một tham chiếu yếu có thể đề cập đến cùng một đối tượng. Trong trường hợp này, các chức năng gọi lại sẽ được gọi theo thứ tự từ tham chiếu được áp dụng gần đây nhất đến tham chiếu lâu đời nhất. Đối tượng có thể được lấy từ một tham chiếu yếu bằng cách gọi đối tượng tham chiếu yếu được trả về dưới dạng hàm không có đối số. Nếu đối tượng ban đầu không còn tồn tại, không có đối tượng nào

F

h Lib

fL

B

d

ff

weakref

241

will be returned. ref[] actually defines a type, ReferenceType, that can be used for type-checking and subclasses. proxy[object[, callback]]

Creates a proxy using a weak reference to object.The returned proxy object is really a wrapper around the original object that provides access to its attributes and methods. As long as the original object exists, manipulation of the proxy object will transparently mimic the behavior of the underlying object. On the other hand, if the original object has been destroyed, operations on the proxy will raise a weakref.ReferenceError to indicate that the object no longer exists. callback is a callback function with the same meaning as for the ref[] function.The type of a proxy object is either ProxyType or CallableProxyType, depending on whether or not the original object is callable. getweakrefcount[object]

Returns the number of weak references and proxies that refer to object. getweakrefs[object]

Returns a list of all weak reference and proxy objects that refer to object. WeakKeyDictionary[[dict]]

Creates a dictionary in which the keys are referenced weakly.When there are no more strong references to a key, the corresponding entry in the dictionary is automatically removed. If supplied, the items in dict are initially added to the returned WeakKeyDictionary object. Because only certain types of objects can be weakly referenced, there are numerous restrictions on acceptable key values. In particular, built-in strings cannot be used as weak keys. However, instances of user-defined classes that define a _ _hash_ _[] method can be used as keys. An instance of WeakKeyDictionary has two methods, iterkeyrefs[] and keyrefs[], that return the weak key references. WeakValueDictionary[[dict]]

Creates a dictionary in which the values are referenced weakly.When there are no more strong references to a value, corresponding entries in the dictionary will be discarded. If supplied, the entries in dict are added to the returned WeakValueDictionary. An instance of WeakValueDictionary has two methods, itervaluerefs[] and valuerefs[], that return the weak value references. ProxyTypes

This is a tuple [ProxyType, CallableProxyType] that can be used for testing if an object is one of the two kinds of proxy objects created by the proxy[] function—for example, isinstance[object, ProxyTypes].

F

h Lib

fL

B

d

ff

Chapter 13 Python Runtime Services

242

Example One application of weak references is to create caches of recently computed results. For instance, if a function takes a long time to compute a result, it might make sense to cache these results and to reuse them as long as they are still in use someplace in the application. For example: _resultcache = { } def foocache[x]: if resultcache.has_key[x]: r = _resultcache[x][] # Get weak ref and dereference it if r is not None: return r r = foo[x] _resultcache[x] = weakref.ref[r] return r

Notes n

n

n

n

n

Only class instances, functions, methods, sets, frozen sets, files, generators, type objects, and certain object types defined in library modules [for example, sockets, arrays, and regular expression patterns] support weak references. Built-in functions and most built-in types such as lists, dictionaries, strings, and numbers cannot be used. If iteration is ever used on a WeakKeyDictionary or WeakValueDictionary, great care should be taken to ensure that the dictionary does not change size because this may produce bizarre side effects such as items mysteriously disappearing from the dictionary for no apparent reason. If an exception occurs during the execution of a callback registered with ref[] or proxy[], the exception is printed to standard error and ignored. Weak references are hashable as long as the original object is hashable. Moreover, the weak reference will maintain its hash value after the original object has been deleted, provided that the original hash value is computed while the object still exists. Weak references can be tested for equality but not for ordering. If the objects are still alive, references are equal if the underlying objects have the same value. Otherwise, references are equal if they are the same reference.

F

h Lib

fL

B

d

ff

14 Mathematics T

his chapter describes modules for performing various kinds of mathematical operations. In addition, the decimal module, which provides generalized support for decimal floating-point numbers, is described.

decimal The Python float data type is represented using a double-precision binary floatingpoint encoding [usually as defined by the IEEE 754 standard]. A subtle consequence of this encoding is that decimal values such as 0.1 can’t be represented exactly. Instead, the closest value is 0.10000000000000001.This inexactness carries over to calculations involving floating-point numbers and can sometimes lead to unexpected results [for example, 3*0.1 == 0.3 evaluates as False]. The decimal module provides an implementation of the IBM General Decimal Arithmetic Standard, which allows for the exact representation of decimals. It also gives precise control over mathematical precision, significant digits, and rounding behavior. These features can be useful if interacting with external systems that precisely define properties of decimal numbers. For example, if writing Python programs that must interact with business applications. The decimal module defines two basic data types: a Decimal type that represents a decimal number and a Context type that represents various parameters concerning computation such as precision and round-off error-handling. Here are a few simple examples that illustrate the basics of how the module works: import decimal x = decimal.Decimal['3.4'] y = decimal.Decimal['4.5']

# Create some decimal numbers

# Perform some math calculations using the default context a = x * y # a = decimal.Decimal['15.30'] b = x / y # b = decimal.Decimal['0.7555555555555555555555555556'] # Change the precision and perform calculations decimal.getcontext[].prec = 3 c = x * y # c = decimal.Decimal['15.3'] d = x / y # d = decimal.Decimal['0.756'] # Change the precision for just a single block of statements with decimal.localcontext[decimal.Context[prec=10]]: e = x * y # e = decimal.Decimal['15.30'] f = x / y # f = decimal.Decimal['0.7555555556']

F

h Lib

fL

B

d

ff

244

Chapter 14 Mathematics

Decimal Objects Decimal numbers are represented by the following class: Decimal[[value [, context]]]

value is the value of the number specified as either an integer, a string containing a decimal value such as '4.5', or a tuple [sign, digits, exponent]. If a tuple is supplied, sign is 0 for positive, 1 for negative; digits is a tuple of digits specified as integers; and exponent is an integer exponent.The special strings 'Infinity', '-Infinity', 'NaN', and 'sNaN' may be used to specify positive and negative infinity as well as Not a Number [NaN]. 'sNaN' is a variant of NaN that results in an exception if it is ever subsequently used in a calculation. An ordinary float object may not

be used as the initial value because that value may not be exact [which defeats the purpose of using decimal in the first place].The context parameter is a Context object, which is described later. If supplied, context determines what happens if the initial value is not a valid number—raising an exception or returning a decimal with the value NaN. The following examples show how to create various decimal numbers: a b c d e

= = = = =

decimal.Decimal[42] # Creates Decimal["42"] decimal.Decimal["37.45"] # Creates Decimal["37.45"] decimal.Decimal[[1,[2,3,4,5],-2]] # Creates Decimal["-23.45"] decimal.Decimal["Infinity"] decimal.Decimal["NaN"]

Decimal objects are immutable and have all the usual numeric properties of the built-in int and float types.They can also be used as dictionary keys, placed in sets, sorted, and so forth. For the most part, you manipulate Decimal objects using the standard Python math operators. However, the methods in the following list can be used to carry out several common mathematical operations. All operations take an optional context parameter that controls the behavior of precision, rounding, and other aspects of the calculation. If omitted, the current context is used. Method

Description

x.exp[[context]] x.fma[y, z [, context]] x.ln[[context]] x.log10[[context]] x.sqrt[[context]]

Natural exponent e**d x*y + z with no rounding of x*y component Natural logarithm [base e] of x Base-10 logarithm of x Square root of x

Context Objects Various properties of decimal numbers, such as rounding and precision, are controlled through the use of a Context object:

F

h Lib

fL

B

d

ff

decimal

245

Context[prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1]

This creates a new decimal context.The parameters should be specified using keyword arguments with the names shown. prec is an integer that sets the number of digits of precision for arithmetic operations, rounding determines the rounding behavior, and traps is a list of signals that produce a Python exception when certain events occur during computation [such as division by zero]. flags is a list of signals that indicate the initial state of the context [such as overflow]. Normally, flags is not specified. Emin and Emax are integers representing the minimum and maximum range for exponents, respectively. capitals is a boolean flag that indicates whether to use 'E' or 'e' for exponents.The default is 1 ['E']. Normally, new Context objects aren’t created directly. Instead, the function getcontext[] or localcontext[] is used to return the currently active Context object.That object is then modified as needed. Examples of this appear later in this section. However, in order to better understand those examples, it is necessary to explain these context parameters in further detail. Rounding behavior is determined by setting the rounding parameter to one of the following values: Constant

Description

ROUND_CEILING

Rounds toward positive infinity. For example, 2.52 rounds up to 2.6 and -2.58 rounds up to -2.5. Rounds toward zero. For example, 2.58 rounds down to 2.5 and -2.58 rounds up to -2.5. Rounds toward negative infinity. For example, 2.58 rounds down to 2.5 and -2.52 rounds down to -2.6. Rounds away from zero if the fractional part is greater than half; otherwise, rounds toward zero. For example, 2.58 rounds up to 2.6, 2.55 rounds down to 2.5 -2.55 rounds up to -2.5, and -2.58 rounds down to -2.6. The same as ROUND_HALF_DOWN except that if the fractional part is exactly half, the result is rounded down if the preceding digit is even and rounded up if the preceding digit is odd. For example, 2.65 is rounded down to 2.6 and 2.55 is rounded up to 2.6. The same as ROUND_HALF_DOWN except that if the fractional part is exactly half, it is rounded away from zero. For example 2.55 rounds up to 2.6, and -2.55 rounds down to -2.6. Rounds away from zero. For example, 2.52 rounds up to 2.6 and 2.52 rounds down to -2.6. Rounds away from zero if the last digit after toward zero would have been 0 or 5. Otherwise, rounds toward zero. For example, 2.54 rounds to 2.6 and 2.64 rounds to 2.6.

Round_down Round_Floor Round_half_down

Round_half_Even

Round_half_up

Round_Up Round_05Up

Các tham số bẫy và cờ của bối cảnh [] là danh sách các tín hiệu. Một tín hiệu đại diện cho một loại ngoại lệ số học có thể xảy ra trong quá trình tính toán. Trừ khi được liệt kê trong bẫy, tín hiệu bị bỏ qua. Mặt khác, một ngoại lệ được nâng lên. Các tín hiệu sau đây được xác định:

F

H lib

fl

B

d

ff

246

Chương 14 Toán học

Dấu hiệu

Sự mô tả

Kẹp phân chia không chính trị không chính xác

Số mũ điều chỉnh để phù hợp với phạm vi cho phép. Phân chia số không vô hạn bằng 0. Lỗi làm tròn xảy ra. Hoạt động không hợp lệ được thực hiện. Số mũ vượt quá Emax sau khi làm tròn. Cũng tạo ra không chính xác và tròn. Làm tròn xảy ra. Có thể xảy ra ngay cả khi không có thông tin nào bị mất [ví dụ: 1,00 1,00 được làm tròn đến 1.0 1.0]. Số mũ ít hơn emin trước khi làm tròn. Dòng chảy số. Kết quả được làm tròn đến 0. Cũng tạo ra không chính xác và dưới mức.

Tràn dưới dòng chảy dưới dòng

Các tên tín hiệu này tương ứng với các ngoại lệ Python có thể được sử dụng để kiểm tra lỗi. Ở đây, một ví dụ: Hãy thử: x = a/b ngoại trừ decimal.divisionbyzero: In "Division by Zero"

Giống như các trường hợp ngoại lệ, các tín hiệu được tổ chức thành một hệ thống phân cấp: arithmeticerror [ngoại lệ tích hợp] DecimalException Kẹp bộ phận tràn không chính trị

Các tín hiệu tràn và dòng chảy xuất hiện nhiều hơn một lần trong bảng vì các tín hiệu đó cũng dẫn đến tín hiệu cha mẹ [ví dụ: dòng chảy cũng báo hiệu dưới mức]. Tín hiệu thập phân.divisionbyzero cũng xuất phát từ ngoại lệ phân chia tích hợp. Trong nhiều trường hợp, các tín hiệu số học bị bỏ qua âm thầm. Chẳng hạn, một tính toán có thể tạo ra một lỗi làm tròn nhưng không tạo ra ngoại lệ. Trong trường hợp này, các tên tín hiệu có thể được sử dụng để kiểm tra một tập hợp các cờ dính biểu thị trạng thái tính toán. Ở đây, một ví dụ: ctxt = decimal.getContext [] # Nhận bối cảnh hiện tại x = a + b nếu ctxt.flags [tròn]: in "Kết quả đã được làm tròn!"

F

H lib

fl

B

d

ff

Chương 14 Toán học

247

Dấu hiệu

Sự mô tả

Kẹp phân chia không chính trị không chính xác

Số mũ điều chỉnh để phù hợp với phạm vi cho phép. Phân chia số không vô hạn bằng 0. Lỗi làm tròn xảy ra. Hoạt động không hợp lệ được thực hiện. Số mũ vượt quá Emax sau khi làm tròn. Cũng tạo ra không chính xác và tròn. Làm tròn xảy ra. Có thể xảy ra ngay cả khi không có thông tin nào bị mất [ví dụ: 1,00 1,00 được làm tròn đến 1.0 1.0]. Số mũ ít hơn emin trước khi làm tròn. Dòng chảy số. Kết quả được làm tròn đến 0. Cũng tạo ra không chính xác và dưới mức.

Tràn dưới dòng chảy dưới dòng

Các tên tín hiệu này tương ứng với các ngoại lệ Python có thể được sử dụng để kiểm tra lỗi. Ở đây, một ví dụ: Hãy thử: x = a/b ngoại trừ decimal.divisionbyzero: In "Division by Zero"

Giống như các trường hợp ngoại lệ, các tín hiệu được tổ chức thành một hệ thống phân cấp: arithmeticerror [ngoại lệ tích hợp] DecimalException Kẹp bộ phận tràn không chính trị

Các tín hiệu tràn và dòng chảy xuất hiện nhiều hơn một lần trong bảng vì các tín hiệu đó cũng dẫn đến tín hiệu cha mẹ [ví dụ: dòng chảy cũng báo hiệu dưới mức]. Tín hiệu thập phân.divisionbyzero cũng xuất phát từ ngoại lệ phân chia tích hợp. Trong nhiều trường hợp, các tín hiệu số học bị bỏ qua âm thầm. Chẳng hạn, một tính toán có thể tạo ra một lỗi làm tròn nhưng không tạo ra ngoại lệ. Trong trường hợp này, các tên tín hiệu có thể được sử dụng để kiểm tra một tập hợp các cờ dính biểu thị trạng thái tính toán. Ở đây, một ví dụ: ctxt = decimal.getContext [] # Nhận bối cảnh hiện tại x = a + b nếu ctxt.flags [tròn]: in "Kết quả đã được làm tròn!"

số thập phân

Khi các cờ được đặt, chúng được đặt cho đến khi chúng được xóa bằng phương thức Clear_flags []. Vì vậy, người ta có thể thực hiện toàn bộ chuỗi tính toán và chỉ kiểm tra các lỗi ở cuối. Các cài đặt trên đối tượng bối cảnh hiện có C có thể được thay đổi thông qua các thuộc tính và phương thức sau: C.Capitals

Cờ được đặt thành 1 hoặc 0 xác định có sử dụng E hay E làm ký tự số mũ. C.Emax

Số nguyên Chỉ định số mũ tối đa. C.Emin

Số nguyên Chỉ định số mũ tối thiểu. C.PREC

F

H lib

fl

B

d

ff

248

Chương 14 Toán học

Dấu hiệu

Sự mô tả

Kẹp phân chia không chính trị không chính xác

Số mũ điều chỉnh để phù hợp với phạm vi cho phép. Phân chia số không vô hạn bằng 0. Lỗi làm tròn xảy ra. Hoạt động không hợp lệ được thực hiện. Số mũ vượt quá Emax sau khi làm tròn. Cũng tạo ra không chính xác và tròn. Làm tròn xảy ra. Có thể xảy ra ngay cả khi không có thông tin nào bị mất [ví dụ: 1,00 1,00 được làm tròn đến 1.0 1.0]. Số mũ ít hơn emin trước khi làm tròn. Dòng chảy số. Kết quả được làm tròn đến 0. Cũng tạo ra không chính xác và dưới mức.

Tràn dưới dòng chảy dưới dòng

Các tên tín hiệu này tương ứng với các ngoại lệ Python có thể được sử dụng để kiểm tra lỗi. Ở đây, một ví dụ: Hãy thử: x = a/b ngoại trừ decimal.divisionbyzero: In "Division by Zero"

Giống như thập phân ["vô cực"]. NEGINF

Giống như thập phân ["-vô cực"]. Nan

Giống như thập phân ["nan"].

Ví dụ Dưới đây là một số ví dụ khác cho thấy cách sử dụng cơ bản của số thập phân: >>> A = thập phân ["42,5"] >>> B = thập phân ["37.1"] >>> A + B thập phân ["79,6"] >>>> A / B thập phân ["1.145552560646900269541778976"] >>> divmod [a, b] [thập phân ["1"], thập phân ["5,4"]] >>> tối đa [a, b] > C = [thập phân ["4,5"], thập phân ["3"], thập phân ["1.23e3"]] >>> Sum [c] thập phân ["1237.5"]

F

H lib

fl

B

d

ff

số thập phân

249

>>> [10*x cho x trong c] [thập phân ["45,0"], thập phân ["30"], thập phân ["1.230E4"]] >>> float [a] 42.5 >>> str [a] '42 .5 '

Dưới đây là một ví dụ về việc thay đổi các tham số trong bối cảnh: >>> getcontext []. Prec = 4 >>> a = thập phân ["3.4562384105"] >>> một thập phân ["3.4562384105"] >>> b = thập phân ["5.62738333333333333 "] >>> getcontext []. Cờ [tròn] 0 >>> a + b 9.084 >>> getContext []. ]: Tệp "", dòng 1, trong? decimal.divisionbyzero: x / 0 >>> getContext [].

Ghi chú n

N

N

N

N

N

Các đối tượng thập phân và bối cảnh có một số lượng lớn các phương pháp liên quan đến các chi tiết cấp thấp liên quan đến biểu diễn và hành vi của các hoạt động thập phân. Những điều này chưa được ghi nhận ở đây vì chúng không cần thiết cho việc sử dụng cơ bản của mô-đun này. Tuy nhiên, bạn nên tham khảo tài liệu trực tuyến tại //docs.python.org/l Library/decimal.html để biết thêm thông tin. Bối cảnh thập phân là duy nhất cho mỗi chủ đề. Thay đổi bối cảnh chỉ ảnh hưởng đến chủ đề đó chứ không phải những người khác. Một số đặc biệt, thập phân ["snan"], có thể được sử dụng làm tín hiệu-nan. Số này không bao giờ được tạo bởi bất kỳ chức năng tích hợp nào. Tuy nhiên, nếu nó xuất hiện trong một tính toán, một lỗi luôn được báo hiệu. Bạn có thể sử dụng điều này để chỉ ra các tính toán không hợp lệ phải dẫn đến lỗi và không được bỏ qua âm thầm. Ví dụ, kết quả là một hàm có thể trả về Snan. Giá trị của 0 có thể là dương hoặc âm [nghĩa là thập phân [0] và thập phân ["-0"]]. Các số không khác biệt vẫn so sánh như nhau. Mô-đun này có lẽ không phù hợp với điện toán khoa học hiệu suất cao do số lượng chi phí đáng kể liên quan đến tính toán. Ngoài ra, thường có rất ít lợi ích thực tế trong việc sử dụng điểm nổi thập phân trên điểm nổi nhị phân trong các ứng dụng như vậy. Một cuộc thảo luận toán học đầy đủ về biểu diễn dấu phẩy động và phân tích lỗi nằm ngoài phạm vi của cuốn sách này. Độc giả nên tham khảo một cuốn sách về phân tích số để biết thêm chi tiết. Bài viết về những gì mọi nhà khoa học máy tính nên

F

H lib

fl

B

d

ff

số thập phân

250

N

Các đối tượng thập phân và bối cảnh có một số lượng lớn các phương pháp liên quan đến các chi tiết cấp thấp liên quan đến biểu diễn và hành vi của các hoạt động thập phân. Những điều này chưa được ghi nhận ở đây vì chúng không cần thiết cho việc sử dụng cơ bản của mô-đun này. Tuy nhiên, bạn nên tham khảo tài liệu trực tuyến tại //docs.python.org/l Library/decimal.html để biết thêm thông tin. Bối cảnh thập phân là duy nhất cho mỗi chủ đề. Thay đổi bối cảnh chỉ ảnh hưởng đến chủ đề đó chứ không phải những người khác. Một số đặc biệt, thập phân ["snan"], có thể được sử dụng làm tín hiệu-nan. Số này không bao giờ được tạo bởi bất kỳ chức năng tích hợp nào. Tuy nhiên, nếu nó xuất hiện trong một tính toán, một lỗi luôn được báo hiệu. Bạn có thể sử dụng điều này để chỉ ra các tính toán không hợp lệ phải dẫn đến lỗi và không được bỏ qua âm thầm. Ví dụ, kết quả là một hàm có thể trả về Snan. Giá trị của 0 có thể là dương hoặc âm [nghĩa là thập phân [0] và thập phân ["-0"]]. Các số không khác biệt vẫn so sánh như nhau. Mô-đun này có lẽ không phù hợp với điện toán khoa học hiệu suất cao do số lượng chi phí đáng kể liên quan đến tính toán. Ngoài ra, thường có rất ít lợi ích thực tế trong việc sử dụng điểm nổi thập phân trên điểm nổi nhị phân trong các ứng dụng như vậy. Một cuộc thảo luận toán học đầy đủ về biểu diễn dấu phẩy động và phân tích lỗi nằm ngoài phạm vi của cuốn sách này. Độc giả nên tham khảo một cuốn sách về phân tích số để biết thêm chi tiết. Bài viết về những gì mọi nhà khoa học máy tính nên

Chương 14 Toán học

Biết về số học dấu phẩy động của David Goldberg, trong các cuộc khảo sát điện toán, Hiệp hội máy tính, tháng 3 năm 1991 cũng là một bài đọc xứng đáng [bài viết này rất dễ tìm thấy trên internet nếu bạn chỉ cần tìm kiếm tiêu đề]. Thông số kỹ thuật số học thập phân chung của IBM chứa nhiều thông tin hơn và có thể dễ dàng định vị trực tuyến thông qua các công cụ tìm kiếm.

Phân số Mô -đun phân số xác định một phân số lớp đại diện cho một số hợp lý. Các thể hiện có thể được tạo theo ba cách khác nhau bằng cách sử dụng hàm tạo lớp: phân số [[Nữ số [, mẫu số]]]]

Tạo một số hợp lý mới. Tổ số và mẫu số có các giá trị tích phân và mặc định là 0 và 1, tương ứng. Phân số [phân số]

Nếu phân số là một thể hiện của các số. TUYỆT VỜI, hãy tạo một số hợp lý mới có cùng giá trị với phân số. [Các] phân số

Nếu S là một chuỗi chứa một phân số như "3/7" hoặc "-4/7", một phần có cùng giá trị được tạo. Nếu s là một số thập phân, chẳng hạn như "1.25", một phần có giá trị đó được tạo ra [ví dụ: phân số [5,4]]. Các phương thức lớp sau có thể tạo các phiên bản phân số từ các loại đối tượng khác: phân số.from_float [f]

Tạo một phân số đại diện cho giá trị chính xác của số điểm nổi f. Phân số.from_decimal [d]

Tạo một phân số đại diện cho giá trị chính xác của số thập phân d. Dưới đây là một số ví dụ về việc sử dụng các chức năng này: >>> f = phân số.fraction [3,4] >>> g = phân số. Phân số.fraction.from_float [3.1415926] Phân số [3537118815677477, 1125899906842624] >>>>

F

H lib

fl

B

d

ff

môn Toán

251

Dưới đây là một số ví dụ về việc sử dụng các phiên bản phân số [sử dụng các giá trị được tạo trong ví dụ trước]: >>> Phân số F + G [5, 2] >>> Phân số F * G [21, 16] >>> H.Limit_denominator [ 10] Phân số [22, 7] >>>

Mô -đun phân số cũng xác định một hàm duy nhất: GCD [A, B]

Tính toán ước số chung lớn nhất của các số nguyên A và B. Kết quả có cùng dấu hiệu B nếu B là không khác; Nếu không, nó có cùng một dấu hiệu như a.

Toán Mô -đun toán học xác định các hàm toán học tiêu chuẩn sau đây. Các hàm này hoạt động trên số nguyên và phao nhưng không hoạt động với các số phức tạp [một mô -đun riêng CMATH có thể được sử dụng để thực hiện các hoạt động tương tự trên các số phức tạp]. Giá trị trả về của tất cả các hàm là một chiếc phao. Tất cả các chức năng lượng giác giả định sử dụng radian. Hàm số

Sự mô tả

ACOS [x] acosh [x] asin [x] asinh [x] atan [x] atan2 [y, x] atanh [x] ceil [x] copysign [x, y] cos [x] COSH [x] độ [x] x] radian [x] exp [x] fabs [x] giai thừa [x]

Trả về cosin hồ quang của x. Trả về cosin hồ quang hyperbol của x. Trả về sin hồ quang của x. Trả về sin hồ quang hyperbol của x. Trả về tiếp tuyến hồ quang của x. Trả lại atan [y / x]. Trả về tiếp tuyến hồ quang hyperbol của x. Trả về trần của x. Trả về x với cùng một dấu với y. Trả về cosin của x. Trả về cosin hyperbol của x. Chuyển đổi X từ radian thành độ. Chuyển đổi X từ độ sang radian. Trả về e ** x. Trả về giá trị tuyệt đối của x. Trả lại x factorial. Trả lại sàn của x. Trả về x % y như được tính toán bởi hàm c fmod []. Trả về mantissa dương và số mũ của X như một tuple. Trả về tổng chính xác đầy đủ của các giá trị dấu phẩy động trong chuỗi có thể lặp lại. Xem ghi chú sau đây để biết mô tả. Trả về khoảng cách Euclide, sqrt [x * x + y * y].

Tầng [x] FMOD [X, Y] FREXP [x] FSUM [S] Hypot [X, Y]

tiếp tục

F

H lib

fl

B

d

ff

môn Toán

252

Dưới đây là một số ví dụ về việc sử dụng các phiên bản phân số [sử dụng các giá trị được tạo trong ví dụ trước]: >>> Phân số F + G [5, 2] >>> Phân số F * G [21, 16] >>> H.Limit_denominator [ 10] Phân số [22, 7] >>>

Sự mô tả

ACOS [x] acosh [x] asin [x] asinh [x] atan [x] atan2 [y, x] atanh [x] ceil [x] copysign [x, y] cos [x] COSH [x] độ [x] x] radian [x] exp [x] fabs [x] giai thừa [x]

Trả về cosin hồ quang của x. Trả về cosin hồ quang hyperbol của x. Trả về sin hồ quang của x. Trả về sin hồ quang hyperbol của x. Trả về tiếp tuyến hồ quang của x. Trả lại atan [y / x]. Trả về tiếp tuyến hồ quang hyperbol của x. Trả về trần của x. Trả về x với cùng một dấu với y. Trả về cosin của x. Trả về cosin hyperbol của x. Chuyển đổi X từ radian thành độ. Chuyển đổi X từ độ sang radian. Trả về e ** x. Trả về giá trị tuyệt đối của x. Trả lại x factorial. Trả lại sàn của x. Trả về x % y như được tính toán bởi hàm c fmod []. Trả về mantissa dương và số mũ của X như một tuple. Trả về tổng chính xác đầy đủ của các giá trị dấu phẩy động trong chuỗi có thể lặp lại. Xem ghi chú sau đây để biết mô tả. Trả về khoảng cách Euclide, sqrt [x * x + y * y].

Tầng [x] FMOD [X, Y] FREXP [x] FSUM [S] Hypot [X, Y]

tiếp tục

Sự mô tả

ACOS [x] acosh [x] asin [x] asinh [x] atan [x] atan2 [y, x] atanh [x] ceil [x] copysign [x, y] cos [x] COSH [x] độ [x] x] radian [x] exp [x] fabs [x] giai thừa [x]

Trả về cosin hồ quang của x. Trả về cosin hồ quang hyperbol của x. Trả về sin hồ quang của x. Trả về sin hồ quang hyperbol của x. Trả về tiếp tuyến hồ quang của x. Trả lại atan [y / x]. Trả về tiếp tuyến hồ quang hyperbol của x. Trả về trần của x. Trả về x với cùng một dấu với y. Trả về cosin của x. Trả về cosin hyperbol của x. Chuyển đổi X từ radian thành độ. Chuyển đổi X từ độ sang radian. Trả về e ** x. Trả về giá trị tuyệt đối của x. Trả lại x factorial. Trả lại sàn của x. Trả về x % y như được tính toán bởi hàm c fmod []. Trả về mantissa dương và số mũ của X như một tuple. Trả về tổng chính xác đầy đủ của các giá trị dấu phẩy động trong chuỗi có thể lặp lại. Xem ghi chú sau đây để biết mô tả. Trả về khoảng cách Euclide, sqrt [x * x + y * y].

Tầng [x] FMOD [X, Y] FREXP [x] FSUM [S] Hypot [X, Y]

tiếp tục

Chương 14 Toán học

Hàm số

F

H lib

fl

B

d

ff

môn Toán

253

Dưới đây là một số ví dụ về việc sử dụng các phiên bản phân số [sử dụng các giá trị được tạo trong ví dụ trước]: >>> Phân số F + G [5, 2] >>> Phân số F * G [21, 16] >>> H.Limit_denominator [ 10] Phân số [22, 7] >>>

Mô -đun phân số cũng xác định một hàm duy nhất: GCD [A, B]

Tính toán ước số chung lớn nhất của các số nguyên A và B. Kết quả có cùng dấu hiệu B nếu B là không khác; Nếu không, nó có cùng một dấu hiệu như a.

Toán Mô -đun toán học xác định các hàm toán học tiêu chuẩn sau đây. Các hàm này hoạt động trên số nguyên và phao nhưng không hoạt động với các số phức tạp [một mô -đun riêng CMATH có thể được sử dụng để thực hiện các hoạt động tương tự trên các số phức tạp]. Giá trị trả về của tất cả các hàm là một chiếc phao. Tất cả các chức năng lượng giác giả định sử dụng radian. Hàm số

Sự mô tả

ACOS [x] acosh [x] asin [x] asinh [x] atan [x] atan2 [y, x] atanh [x] ceil [x] copysign [x, y] cos [x] COSH [x] độ [x] x] radian [x] exp [x] fabs [x] giai thừa [x]

Trả về cosin hồ quang của x. Trả về cosin hồ quang hyperbol của x. Trả về sin hồ quang của x. Trả về sin hồ quang hyperbol của x. Trả về tiếp tuyến hồ quang của x. Trả lại atan [y / x]. Trả về tiếp tuyến hồ quang hyperbol của x. Trả về trần của x. Trả về x với cùng một dấu với y. Trả về cosin của x. Trả về cosin hyperbol của x. Chuyển đổi X từ radian thành độ. Chuyển đổi X từ độ sang radian. Trả về e ** x. Trả về giá trị tuyệt đối của x. Trả lại x factorial. Trả lại sàn của x. Trả về x % y như được tính toán bởi hàm c fmod []. Trả về mantissa dương và số mũ của X như một tuple. Trả về tổng chính xác đầy đủ của các giá trị dấu phẩy động trong chuỗi có thể lặp lại. Xem ghi chú sau đây để biết mô tả. Trả về khoảng cách Euclide, sqrt [x * x + y * y].

Tầng [x] FMOD [X, Y] FREXP [x] FSUM [S] Hypot [X, Y]

# x là một giá trị tích phân

Nếu một trong các loại kiểm tra này trả về đúng, điều đó có nghĩa là X tương thích với tất cả các hoạt động toán học thông thường được liên kết với loại đó và chuyển đổi sang một trong các loại tích hợp như phức tạp [], float [] [] sẽ làm việc. Các lớp cơ sở trừu tượng cũng có thể được sử dụng làm lớp cơ sở cho các lớp do người dùng xác định nhằm mô phỏng số. Làm điều này không chỉ là một ý tưởng tốt để kiểm tra loại, mà còn bổ sung các kiểm tra an toàn bổ sung để đảm bảo bạn thực hiện tất cả các phương pháp cần thiết. Ví dụ: >>> lớp foo [số.real]: Pass ... >>> f = foo [] Traceback [cuộc gọi gần đây nhất] Foo với các phương thức trừu tượng _ _abs_ _, _ _add_ _, _ _div_ _, _ _eq_ _, _ _ _, _ _ _

Ghi chú n

N

Tham khảo Chương 7 [Các lớp học và lập trình hướng đối tượng] để biết thêm thông tin về các lớp cơ sở trừu tượng. PEP 3141 [//www.python.org/dev/peps/pep-3141] có thêm thông tin về hệ thống phân cấp loại và dự định sử dụng mô-đun này.

F

H lib

fl

B

d

ff

254

Chương 14 Toán học

ngẫu nhiên Mô-đun ngẫu nhiên cung cấp một loạt các hàm để tạo các số giả ngẫu nhiên cũng như các hàm để tạo các giá trị ngẫu nhiên theo các phân phối khác nhau trên các số thực. Hầu hết các hàm trong mô -đun này phụ thuộc vào hàm ngẫu nhiên [], tạo ra các số phân phối đồng đều trong phạm vi [0,0, 1.0] bằng cách sử dụng trình tạo Twister Mersenne.

Hạt giống và khởi tạo Các chức năng sau được sử dụng để kiểm soát trạng thái của bộ tạo số ngẫu nhiên cơ bản: hạt giống [[x]]

Khởi tạo trình tạo số ngẫu nhiên. Nếu X bị bỏ qua hoặc không có, thời gian hệ thống được sử dụng để gieo hạt máy phát. Mặt khác, nếu x là số nguyên hoặc số nguyên dài, giá trị của nó được sử dụng. Nếu x không phải là một số nguyên, nó phải là một đối tượng có thể băm và giá trị của băm [x] được sử dụng làm hạt giống. getstate []

Trả về một đối tượng đại diện cho trạng thái hiện tại của trình tạo. Đối tượng này sau này có thể được chuyển cho setstate [] để khôi phục trạng thái. SetState [Bang]

Khôi phục trạng thái của trình tạo số ngẫu nhiên từ một đối tượng được trả về bởi getstate []. jumpahead [n]

Nhanh chóng thay đổi trạng thái của trình tạo thành những gì nó sẽ xảy ra nếu ngẫu nhiên [] được gọi là n lần liên tiếp. n phải là một số nguyên không âm.

Số nguyên ngẫu nhiên Các hàm sau được sử dụng để thao tác các số nguyên ngẫu nhiên. getrandbits [k]

Tạo một số nguyên dài chứa K bit ngẫu nhiên. Randint [A, B]

Trả về một số nguyên ngẫu nhiên, x, trong phạm vi A -1. Cunifvariate [trung bình, cung]

Phân phối đồng đều tròn. Trung bình là góc trung bình và cung là phạm vi phân phối, tập trung xung quanh góc trung bình. Cả hai giá trị này phải được chỉ định trong radian trong phạm vi từ 0 đến PI. Các giá trị được trả về nằm trong phạm vi [trung bình - cung/2, trung bình + cung/2]. Outvariate [Lambd]

Phân phối theo cấp số nhân. Lambd là 1,0 chia cho giá trị trung bình mong muốn. Trả về các giá trị trong phạm vi [0, +vô cực]. Gammavariate [Alpha, Beta]

Phân phối Gamma. Alpha> -1, Beta> 0. Gauss [MU, Sigma]

Phân phối Gaussian với MU trung bình và độ lệch chuẩn. Nhanh hơn một chút so với bình thường []. lognormvariate [MU, Sigma]

Đăng nhập phân phối bình thường. Làm cho logarit tự nhiên của phân phối này dẫn đến phân phối bình thường với MU trung bình và độ lệch chuẩn. Bình thường [MU, Sigma]

Phân phối bình thường với MU trung bình và độ lệch chuẩn.

F

H lib

fl

B

d

ff

Chương 14 Toán học

256

ngẫu nhiên Mô-đun ngẫu nhiên cung cấp một loạt các hàm để tạo các số giả ngẫu nhiên cũng như các hàm để tạo các giá trị ngẫu nhiên theo các phân phối khác nhau trên các số thực. Hầu hết các hàm trong mô -đun này phụ thuộc vào hàm ngẫu nhiên [], tạo ra các số phân phối đồng đều trong phạm vi [0,0, 1.0] bằng cách sử dụng trình tạo Twister Mersenne.

Hạt giống và khởi tạo Các chức năng sau được sử dụng để kiểm soát trạng thái của bộ tạo số ngẫu nhiên cơ bản: hạt giống [[x]]

Khởi tạo trình tạo số ngẫu nhiên. Nếu X bị bỏ qua hoặc không có, thời gian hệ thống được sử dụng để gieo hạt máy phát. Mặt khác, nếu x là số nguyên hoặc số nguyên dài, giá trị của nó được sử dụng. Nếu x không phải là một số nguyên, nó phải là một đối tượng có thể băm và giá trị của băm [x] được sử dụng làm hạt giống. getstate []

Trả về một đối tượng đại diện cho trạng thái hiện tại của trình tạo. Đối tượng này sau này có thể được chuyển cho setstate [] để khôi phục trạng thái. SetState [Bang]

Khôi phục trạng thái của trình tạo số ngẫu nhiên từ một đối tượng được trả về bởi getstate []. jumpahead [n]

F

H lib

fl

B

d

ff

Chương 14 Toán học

259

ngẫu nhiên Mô-đun ngẫu nhiên cung cấp một loạt các hàm để tạo các số giả ngẫu nhiên cũng như các hàm để tạo các giá trị ngẫu nhiên theo các phân phối khác nhau trên các số thực. Hầu hết các hàm trong mô -đun này phụ thuộc vào hàm ngẫu nhiên [], tạo ra các số phân phối đồng đều trong phạm vi [0,0, 1.0] bằng cách sử dụng trình tạo Twister Mersenne.

Hạt giống và khởi tạo Các chức năng sau được sử dụng để kiểm soát trạng thái của bộ tạo số ngẫu nhiên cơ bản: hạt giống [[x]]

Loại mã

Sự mô tả

Loại c

Kích thước tối thiểu [tính bằng byte]

'c' 'b' 'b' 'u' 'h' 'h' 'i' '' i '' l '' l '' f '' d '

Ký tự 8 bit 8 bit 8 bit 8 bit không dấu số nguyên unicode ký tự 16 bit số nguyên 16-bit số nguyên không dấu số nguyên không dấu số nguyên dài không dấu phao chính xác dài

char đã ký char unsign char py_unicode ngắn không dấu ngắn int unsignt int dài không dấu phao dài đôi

1 1 1 2 2 2 4 4 4 4 4 8

hoặc 4

hoặc hoặc hoặc hoặc

8 8 8 8

Đại diện của số nguyên và số nguyên dài được xác định bởi kiến ​​trúc máy [chúng có thể là 32 hoặc 64 bit]. Khi các giá trị được lưu trữ dưới dạng 'l' hoặc 'i' được trả về Xác định loại sau: Mảng [Typecode [, InfitorSer]]

Tạo một mảng kiểu typecode. Khởi tạo là chuỗi hoặc danh sách các giá trị được sử dụng để khởi tạo các giá trị trong mảng. Các thuộc tính và phương thức sau áp dụng cho một đối tượng mảng, A: Mục

Sự mô tả

A.TyPecode A.ItemSize A.Append [x] A.Buffer_info []

Loại mã ký tự được sử dụng để tạo mảng. Kích thước của các mục được lưu trữ trong mảng [tính bằng byte]. Nối X đến cuối mảng. Trả về [địa chỉ, độ dài], cho vị trí bộ nhớ và độ dài của bộ đệm được sử dụng để lưu trữ mảng. Trao đổi thứ tự byte của tất cả các mục trong mảng từ lớn đến Little-endian, hoặc ngược lại. Điều này chỉ được hỗ trợ cho các giá trị số nguyên.

A.BytesWap []

tiếp tục

F

H lib

fl

B

d

ff

260

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

Mục

Sự mô tả

Trả về số lần xuất hiện của x trong a. Nối b đến cuối mảng a. B có thể là một mảng hoặc một đối tượng có thể đi được có cùng loại như trong a. a.fromfile [f, n] đọc n các mục [ở định dạng nhị phân] từ đối tượng tệp f và nối vào cuối mảng. f phải là một đối tượng tệp. Tăng Eoferror nếu có thể đọc ít hơn n. a.fromlist [danh sách] nối các mục từ danh sách đến cuối mảng. Danh sách có thể là bất kỳ đối tượng khác. a.fromString [s] nối các mục từ chuỗi s, trong đó s được hiểu là một chuỗi các giá trị nhị phân, tên gọi như đã được đọc bằng cách sử dụng fromfile []. a.index [x] Trả về chỉ số của lần xuất hiện đầu tiên của x trong a. Tăng giá trịerror nếu không tìm thấy. a.insert [i, x] chèn x trước vị trí i. A.Pop [[i]] loại bỏ mục I khỏi mảng và trả về nó. Nếu tôi bị bỏ qua, phần tử cuối cùng sẽ bị loại bỏ. A.Remove [x] loại bỏ lần xuất hiện đầu tiên của X khỏi mảng. Tăng giá trịerror nếu không tìm thấy. a.reverse [] đảo ngược thứ tự của mảng. A.Tofile [f] ghi tất cả các mục vào tệp f. Dữ liệu được lưu ở định dạng nhị phân gốc. a.tolist [] chuyển đổi mảng thành một danh sách các giá trị thông thường. a.tostring [] chuyển đổi thành một chuỗi dữ liệu nhị phân, cùng một dữ liệu như được viết bằng tofile []. a.tounicode [] chuyển đổi mảng thành chuỗi unicode. Tăng giá trịerror nếu mảng không thuộc loại 'u'. A.Count [x] A.Extend [b]

Khi các mục được chèn vào một mảng, ngoại lệ kiểu kiểu được tạo nếu loại mục không khớp với loại được sử dụng để tạo mảng. Mô-đun mảng rất hữu ích nếu bạn cần lưu trữ hiệu quả không gian cho danh sách dữ liệu và bạn biết rằng tất cả các mục trong danh sách sẽ giống nhau. Ví dụ, việc lưu trữ 10 triệu số nguyên trong danh sách yêu cầu khoảng 160MB bộ nhớ trong khi một mảng 10 triệu số nguyên chỉ cần 40MB. Mặc dù tiết kiệm không gian này, không có hoạt động cơ bản nào trên một mảng có xu hướng nhanh hơn so với các đối tác danh sách của họ trên thực tế, chúng có thể chậm hơn. Khi thực hiện các tính toán với các mảng, bạn sẽ muốn cẩn thận với các hoạt động tạo ra danh sách. Ví dụ: sử dụng khả năng hiểu danh sách trên một mảng sẽ chuyển đổi toàn bộ mảng thành một danh sách, đánh bại bất kỳ lợi ích tiết kiệm không gian nào. Một cách tốt hơn để xử lý điều này là tạo các mảng mới bằng cách sử dụng các biểu thức tạo. Ví dụ: a = mảng.

# Tạo một mảng mới từ b

Bởi vì điểm sử dụng một mảng là để tiết kiệm không gian, nên có thể mong muốn hơn khi thực hiện các hoạt động tại chỗ. Một cách hiệu quả để làm điều này là với mã sử dụng Enumerate [], như thế này: a = mảng.Array ["I", [1,2,3,4,5]] cho I, x trong Enumate [a]: A [i] = 2*x

F

H lib

fl

B

d

ff

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

261

Mục

Trả về số lần xuất hiện của x trong a. Nối b đến cuối mảng a. B có thể là một mảng hoặc một đối tượng có thể đi được có cùng loại như trong a. a.fromfile [f, n] đọc n các mục [ở định dạng nhị phân] từ đối tượng tệp f và nối vào cuối mảng. f phải là một đối tượng tệp. Tăng Eoferror nếu có thể đọc ít hơn n. a.fromlist [danh sách] nối các mục từ danh sách đến cuối mảng. Danh sách có thể là bất kỳ đối tượng khác. a.fromString [s] nối các mục từ chuỗi s, trong đó s được hiểu là một chuỗi các giá trị nhị phân, tên gọi như đã được đọc bằng cách sử dụng fromfile []. a.index [x] Trả về chỉ số của lần xuất hiện đầu tiên của x trong a. Tăng giá trịerror nếu không tìm thấy. a.insert [i, x] chèn x trước vị trí i. A.Pop [[i]] loại bỏ mục I khỏi mảng và trả về nó. Nếu tôi bị bỏ qua, phần tử cuối cùng sẽ bị loại bỏ. A.Remove [x] loại bỏ lần xuất hiện đầu tiên của X khỏi mảng. Tăng giá trịerror nếu không tìm thấy. a.reverse [] đảo ngược thứ tự của mảng. A.Tofile [f] ghi tất cả các mục vào tệp f. Dữ liệu được lưu ở định dạng nhị phân gốc. a.tolist [] chuyển đổi mảng thành một danh sách các giá trị thông thường. a.tostring [] chuyển đổi thành một chuỗi dữ liệu nhị phân, cùng một dữ liệu như được viết bằng tofile []. a.tounicode [] chuyển đổi mảng thành chuỗi unicode. Tăng giá trịerror nếu mảng không thuộc loại 'u'. A.Count [x] A.Extend [b]

Khi các mục được chèn vào một mảng, ngoại lệ kiểu kiểu được tạo nếu loại mục không khớp với loại được sử dụng để tạo mảng. Mô-đun mảng rất hữu ích nếu bạn cần lưu trữ hiệu quả không gian cho danh sách dữ liệu và bạn biết rằng tất cả các mục trong danh sách sẽ giống nhau. Ví dụ, việc lưu trữ 10 triệu số nguyên trong danh sách yêu cầu khoảng 160MB bộ nhớ trong khi một mảng 10 triệu số nguyên chỉ cần 40MB. Mặc dù tiết kiệm không gian này, không có hoạt động cơ bản nào trên một mảng có xu hướng nhanh hơn so với các đối tác danh sách của họ trên thực tế, chúng có thể chậm hơn. Khi thực hiện các tính toán với các mảng, bạn sẽ muốn cẩn thận với các hoạt động tạo ra danh sách. Ví dụ: sử dụng khả năng hiểu danh sách trên một mảng sẽ chuyển đổi toàn bộ mảng thành một danh sách, đánh bại bất kỳ lợi ích tiết kiệm không gian nào. Một cách tốt hơn để xử lý điều này là tạo các mảng mới bằng cách sử dụng các biểu thức tạo. Ví dụ: a = mảng.

# Tạo một mảng mới từ b

See Also: struct [p. 290]

bisect The bisect module provides support for keeping lists in sorted order. It uses a bisection algorithm to do most of its work. bisect[list, item [, low [, high]]]

Returns the index of the insertion point for item to be placed in list in order to maintain list in sorted order. low and high are indices specifying a subset of the list to examine. If items is already in the list, the insertion point will always be to the right of existing entries in the list. bisect_left[list, item [, low [, high]]]

Returns the index of the insertion point for item to be placed in list in order to maintain list in sorted order. low and high are indices specifying a subset of the list to examine. If items is already in the list, the insertion point will always be to the left of existing entries in the list. bisect_right[list, item [, low [, high]]]

The same as bisect[]. insort[list, item [, low [, high]]]

Inserts item into list in sorted order. If item is already in the list, the new entry is inserted to the right of any existing entries. insort_left[list, item [, low [, high]]]

Inserts item into list in sorted order. If item is already in the list, the new entry is inserted to the left of any existing entries. insort_right[list, item [, low [, high]]]

The same as insort[].

F

h Lib

fL

B

d

ff

262

Chapter 15 Data Structures, Algorithms, and Code Simplification

collections The collections module contains high-performance implementations of a few useful container types, abstract base classes for various kinds of containers, and a utility function for creating name-tuple objects. Each is described in the sections that follow.

deque and defaultdict Two new containers are defined in the collections module: deque and defaultdict. deque[[iterable [, maxlen]]]

Type representing a double-ended queue [deque, pronounced “deck”] object. iterable is an iterable object used to populate the deque. A deque allows items to be inserted or removed from either end of the queue.The implementation has been optimized so that the performance of these operations is approximately the same as [O[1]].This is slightly different from a list where operations at the front of the list may require shifting of all the elements that follow. If the optional maxlen argument is supplied, the resulting deque object becomes a circular buffer of that size.That is, if new items are added, but there is no more space, items are deleted from the opposite end to make room. An instance, d, of deque has the following methods: d.append[x]

Adds x to the right side of d. d.appendleft[x]

Adds x to the left side of d. d.clear[]

Removes all items from d. d.extend[iterable]

Extends d by adding all the items in iterable on the right. d.extendleft[iterable]

Extends d by adding all the items in iterable on the left. Due to the sequence of left appends that occur, items in iterable will appear in reverse order in d. d.pop[]

Returns and removes an item from the right side of d. Raises IndexError if d is empty. d.popleft[]

Returns and removes an item from the left side of d. Raises IndexError if d is empty. d.remove[item]

Removes the first occurrence of item. Raises ValueError if no match is found.

F

h Lib

fL

B

d

ff

collections

263

d.rotate[n]

Rotates all the items n steps to the right. If n is negative, items are rotated to the left. Deques are often overlooked by many Python programmers. However, this type offers many advantages. First, the implementation is highly efficient—even to a level of using internal data structures that provide good processor cache behavior. Appending items at the end is only slightly slower than the built-in list type, whereas inserting items at the front is significantly faster. Operations that add new items to a deque are also thread-safe, making this type appropriate for implementing queues. deques can also be serialized using the pickle module. defaultdict[[default_factory], ...]

A type that is exactly the same as a dictionary except for the handling of missing keys. When a lookup occurs on a key that does not yet exist, the function supplied as default_factory is called to provide a default value which is then saved as the value of the associated key.The remaining arguments to defaultdict are exactly the same as the built-in dict[] function. An instance d of defaultdictionary has the same operations as a built-in dictionary.The attribute d.default_factory contains the function passed as the first argument and can be modified as necessary. A defaultdict object is useful if you are trying to use a dictionary as a container for tracking data. For example, suppose you wanted to keep track of the position of each word in a string s. Here is how you could use a defaultdict to do this easily: >>> from collections import defaultdict >>> s = "yeah but no but yeah but no but yeah" >>> words = s.split[] >>> wordlocations = defaultdict[list] >>> for n, w in enumerate[words]: ... wordlocations[w].append[n] ... >>> wordlocations defaultdict[, {'yeah': [0, 4, 8], 'but': [1, 3, 5, 7], 'no': [2, 6]}] >>>

Trong ví dụ này, các từ ngữ tra cứu [w] sẽ không thành công ngay lần đầu tiên gặp một từ. Tuy nhiên, thay vì nâng cao KeyError, danh sách chức năng được cung cấp dưới dạng default_factory được gọi để tạo ra một giá trị mới. Từ điển tích hợp có một phương thức setDefault [] có thể được sử dụng để đạt được kết quả tương tự, nhưng nó thường làm cho mã khó hiểu để đọc và chạy chậm hơn. Ví dụ: câu lệnh nối một mục mới được hiển thị trước đó có thể được thay thế bằng WordLocations.setDefault [w, []]. như sử dụng một đối tượng DefaultDict.

Các bộ dữ liệu được đặt tên thường xuyên được sử dụng để thể hiện các cấu trúc dữ liệu đơn giản. Ví dụ: địa chỉ mạng có thể được biểu diễn dưới dạng tuple addr = [tên máy chủ, cổng]. Một khiếu nại phổ biến với các bộ dữ liệu là các mục riêng lẻ phải được truy cập bằng chỉ mục số Trong số các giá trị chỉ số có nghĩa là [và vấn đề trở nên tồi tệ hơn, Tuple càng lớn hơn].

F

H lib

fl

B

d

ff

264

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

Mô -đun bộ sưu tập chứa một hàm có tênTuple [] được sử dụng để tạo các lớp con của tuple trong đó tên thuộc tính có thể được sử dụng để truy cập các phần tử Tuple. Được đặt tênTuple [Typename, FieldName [, Verbose]]

Tạo một lớp con của tuple với tên typename. FieldNames là danh sách các tên thuộc tính được chỉ định là chuỗi. Tên trong danh sách này phải là định danh python hợp lệ, không được bắt đầu với dấu gạch dưới và được chỉ định theo cùng thứ tự như các mục xuất hiện trong Tuple, ví dụ, ['Tên máy chủ ','Hải cảng']. Ngoài ra, các tên trường có thể được chỉ định là một chuỗi, chẳng hạn như 'Cổng máy chủ' hoặc 'tên máy chủ, cổng. của Tuples. Cờ dài dòng, nếu được đặt thành True, in định nghĩa lớp kết quả thành đầu ra tiêu chuẩn. Dưới đây là một ví dụ về việc sử dụng chức năng này: >>> từ các bộ sưu tập nhập tên được đặt tên ', 80] >>> a.

>>> isinstance [a, tuple] Đúng >>>

Trong ví dụ này, theo mọi cách, NetworkAddress được đặt tên là từ một tuple bình thường ngoại trừ sự hỗ trợ bổ sung của việc có thể sử dụng Tra cứu thuộc tính như A.Hostname hoặc A.port để truy cập các thành phần Tuple. Việc triển khai cơ bản là hiệu quả Lớp học được tạo không sử dụng từ điển thể hiện hoặc thêm bất kỳ chi phí bộ nhớ bổ sung nào trong một bộ xử lý tích hợp. Tất cả các hoạt động tuple bình thường vẫn hoạt động. Một tuple được đặt tên có thể hữu ích nếu việc xác định các đối tượng thực sự chỉ phục vụ như một cấu trúc dữ liệu. Ví dụ: thay vì xác định một lớp, như thế này: class stock [object]: def _ _init_ _ [self, name, cổ phiếu, giá]: self.name = name self.shares = chia sẻ self

Thay vào đó, bạn có thể xác định một bộ tuple có tên: Bộ sưu tập nhập khẩu = bộ sưu tập.

Cả hai phiên bản sẽ hoạt động theo cách gần như giống hệt nhau. Ví dụ: trong cả hai trường hợp, bạn sẽ truy cập các trường bằng cách viết s.name, s.shares, v.v. Tuy nhiên, lợi ích của bộ tuple được đặt tên là nó hiệu quả hơn về bộ nhớ và hỗ trợ các hoạt động tuple khác nhau như giải nén [ví dụ: nếu bạn có một danh sách các bộ dữ Đối với tên, cổ phiếu,

F

H lib

fl

B

d

ff

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

265

Mô -đun bộ sưu tập chứa một hàm có tênTuple [] được sử dụng để tạo các lớp con của tuple trong đó tên thuộc tính có thể được sử dụng để truy cập các phần tử Tuple. Được đặt tênTuple [Typename, FieldName [, Verbose]]

Các lớp cơ sở trừu tượng Các mô -đun bộ sưu tập xác định một loạt các lớp cơ sở trừu tượng. Mục đích của các lớp này là để mô tả các giao diện lập trình trên các loại container như danh sách, bộ và từ điển. Có hai cách sử dụng chính của các lớp này. Đầu tiên, chúng có thể được sử dụng như một lớp cơ sở cho các đối tượng do người dùng xác định muốn mô phỏng chức năng của các loại container tích hợp. Thứ hai, chúng có thể được sử dụng để kiểm tra loại. Ví dụ: nếu bạn muốn kiểm tra xem S có hoạt động như một chuỗi hay không, bạn có thể sử dụng isinstance [s, com thu. Thùng đựng hàng

Lớp cơ sở cho tất cả các container. Xác định một phương thức trừu tượng duy nhất _ _contains_ _ [], trong đó thực hiện toán tử trong. Hashable

Lớp cơ sở cho các đối tượng có thể được sử dụng làm phím bảng băm. Xác định một phương thức trừu tượng duy nhất _ _hash_ _ []. Có thể lặp lại

Lớp cơ sở cho các đối tượng hỗ trợ giao thức lặp. Xác định một phương thức trừu tượng duy nhất _ _iter_ _ []. Người lặp lại

Lớp cơ sở cho các đối tượng lặp. Xác định phương thức trừu tượng Next [] nhưng cũng kế thừa từ ITable và cung cấp một triển khai mặc định của _ _iter_ _ [] mà đơn giản là không làm gì. Có kích thước

Lớp cơ sở cho các thùng chứa có kích thước có thể được xác định. Xác định phương thức trừu tượng _ _len_ _ []. Có thể gọi được

Lớp cơ sở cho các đối tượng hỗ trợ chức năng gọi. Xác định phương thức trừu tượng _ _call_ _ [].

F

H lib

fl

B

d

ff

266

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

Sự phối hợp

Lớp cơ sở cho các đối tượng trông giống như trình tự. Kế thừa từ container, có thể lặp lại và có kích thước và xác định các phương thức trừu tượng _ _getItem_ _ [] và _ _len_ _ []. Cũng cung cấp một triển khai mặc định của _ _contains_ _ [], _ _iter_ _ [], _ _Reversed_ _ [], index [] và đếm [] Phương pháp. Mutablesequence

Lớp cơ sở cho các chuỗi có thể thay đổi. Kế thừa từ chuỗi và thêm các phương thức trừu tượng _ _setItem_ _ [] và _ _delitem_ _ []. Cũng cung cấp một triển khai mặc định của append [], larter [], extend [], pop [], remove [] và _ _iadd_ _ []. Bộ

Lớp cơ sở cho các đối tượng hoạt động như bộ. Kế thừa từ container, có thể lặp lại và có kích thước và xác định các phương thức trừu tượng _ _len_ _ [], _ _iter_ _ [] và _ _contains_ _ []. Cũng cung cấp một triển khai mặc định của các toán tử đã đặt _ _le_ _ [], _ _lt_ _ [], _ _eq_ _ [], _ _ne_ _ [], _ _gt_ _ [], _ _ _ _ _ [] , _ _or_ _ [], _ _xor_ _ [], _ _sub_ _ [] và isDisjoint []. Mutableset

Lớp cơ sở cho các bộ thay đổi. Kế thừa từ SET và thêm các phương thức trừu tượng thêm [] và loại bỏ []. Cũng cung cấp một triển khai mặc định của Clear [], pop [], Remove [], _ _ior_ _ [], _ _Iand_ _ [], _ _ixor_ _ [] và _ _isub_ _ []. Lập bản đồ

Lớp cơ sở cho các đối tượng hỗ trợ tra cứu ánh xạ [từ điển]. Kế thừa từ kích thước, có thể lặp lại và container và xác định các phương thức trừu tượng _ _getItem_ _ [], _ _len_ _ [] và _ _iter_ _ []. Một triển khai mặc định của _ _contains_ _ [], các khóa [], item [], giá trị [], get [], _ _eq_ _ [] và _ _ne_ _ [] cũng được cung cấp. Đột biến

Lớp cơ sở cho các đối tượng ánh xạ đột biến. Kế thừa từ ánh xạ và thêm các phương thức trừu tượng _ _setItem_ _ [] và _ _delitem_ _ []. Việc triển khai pop [], popitem [], Clear [], Update [] và SetDefault [] cũng được thêm vào. Ánh xạview

Lớp cơ sở để lập bản đồ chế độ xem. Chế độ xem ánh xạ là một đối tượng được sử dụng để truy cập vào bên trong của đối tượng ánh xạ dưới dạng một tập hợp. Ví dụ, chế độ xem khóa là một đối tượng giống như thiết lập hiển thị các phím trong ánh xạ. Xem Phụ lục A, Hồi Python 3 3 để biết thêm chi tiết. Keysview

Lớp cơ sở cho một chế độ xem chính của một ánh xạ. Kế thừa từ LapPingView và Set. MụcView

Lớp cơ sở cho chế độ xem mục của một ánh xạ. Kế thừa từ LapPingView và Set. ValueView

Lớp cơ sở cho chế độ xem [khóa, mục] của ánh xạ. Kế thừa từ LapPingView và Set.

F

H lib

fl

B

d

ff

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

267

Sự phối hợp

Lớp cơ sở cho các đối tượng trông giống như trình tự. Kế thừa từ container, có thể lặp lại và có kích thước và xác định các phương thức trừu tượng _ _getItem_ _ [] và _ _len_ _ []. Cũng cung cấp một triển khai mặc định của _ _contains_ _ [], _ _iter_ _ [], _ _Reversed_ _ [], index [] và đếm [] Phương pháp. Mutablesequence

Lớp cơ sở cho các chuỗi có thể thay đổi. Kế thừa từ chuỗi và thêm các phương thức trừu tượng _ _setItem_ _ [] và _ _delitem_ _ []. Cũng cung cấp một triển khai mặc định của append [], larter [], extend [], pop [], remove [] và _ _iadd_ _ []. Bộ

Một trình trang trí tạo trình quản lý bối cảnh từ một hàm tạo Func. Cách mà bạn sử dụng trình trang trí này như sau: @ContextManager def foo [args]

Khi câu lệnh với FOO [ARGS] dưới dạng giá trị xuất hiện, hàm Trình tạo được thực thi với các đối số được cung cấp cho đến khi đạt được câu lệnh năng suất đầu tiên. Giá trị được trả về bằng năng suất được đặt vào giá trị biến. Tại thời điểm này, cơ thể của tuyên bố thực thi. Sau khi hoàn thành, hàm máy phát tiếp tục. Nếu bất kỳ loại ngoại lệ nào được nâng lên bên trong cơ thể, ngoại lệ đó được nâng lên bên trong hàm máy phát, nơi nó có thể được xử lý khi thích hợp. Nếu lỗi được truyền bá, trình tạo nên sử dụng tăng để tăng cường ngoại lệ. Một ví dụ về việc sử dụng bộ trang trí này có thể được tìm thấy trong phần Quản lý bối cảnh của Chương 5. Nested [MGR1, MGR2, ..., MGRN]

Một chức năng gọi nhiều hơn một trình quản lý bối cảnh MGR1, MGR2, v.v. như là một hoạt động duy nhất. Trả về một tuple chứa các giá trị trả về khác nhau của các câu lệnh. Tuyên bố có lồng nhau [m1, m2] là [x, y]: các câu lệnh giống như

F

H lib

fl

B

d

ff

268

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

Nói với M1 là X: Với M2 là Y: Tuyên bố. Xin lưu ý rằng nếu một trình quản lý bối cảnh bên trong bẫy và triệt tiêu một ngoại lệ, không có thông tin ngoại lệ nào được chuyển cho các nhà quản lý bên ngoài. Đóng [đối tượng]

Tạo trình quản lý bối cảnh tự động thực thi object.close [] khi thực thi rời khỏi phần thân của câu lệnh. Giá trị được trả về bởi câu lệnh với đối tượng.

Các chức năng Mô-đun chức năng chứa các chức năng và bộ trang trí hữu ích để tạo các chức năng bậc cao, lập trình chức năng và trang trí. một phần [hàm [, *args [, ** kwargs]]]]]

Tạo một đối tượng giống như hàm, một phần, khi được gọi, gọi chức năng với các đối số vị trí tranh luận, đối số từ khóa kwargs và bất kỳ đối số vị trí hoặc từ khóa bổ sung nào được cung cấp. Các đối số vị trí bổ sung được thêm vào cuối của ARG và các đối số từ khóa bổ sung được hợp nhất thành kwargs, ghi đè bất kỳ giá trị được xác định trước đó [nếu có]. Một cách sử dụng điển hình của một phần [] là khi thực hiện một số lượng lớn các cuộc gọi chức năng trong đó nhiều đối số được giữ cố định. Ví dụ: từ functools nhập một phần mybutton = partial [nút, root, fg = "black", bg = "white", font = "thời gian", size = "12"] b1 = mybutton [text = "ok"] # Nút gọi [] với text = "ok" và tất cả b2 = mybutton [text = "heas

Một thể hiện P của đối tượng được tạo bởi một phần có các thuộc tính sau: Mục

Sự mô tả

P.Func P.Args

Chức năng được gọi khi p được gọi. Tuple chứa các đối số vị trí ngoài cùng bên trái được cung cấp cho P.Func khi được gọi. Các đối số vị trí bổ sung được nối với cuối giá trị này. Từ điển chứa các đối số từ khóa được cung cấp cho P.Func khi được gọi. Các đối số từ khóa bổ sung được hợp nhất vào từ điển này.

P.Keywords

Sử dụng thận trọng khi sử dụng một đối tượng một phần làm đứng cho hàm chính quy. Kết quả không chính xác giống như hàm bình thường. Chẳng hạn, nếu bạn sử dụng một phần [] bên trong định nghĩa lớp, nó hoạt động giống như một phương thức tĩnh, không phải là phương thức thể hiện. Giảm [chức năng, các mục [, ban đầu]]

Áp dụng một hàm, hàm, tích lũy cho các mục trong các mục có thể lặp lại và trả về một giá trị duy nhất. Chức năng phải lấy hai đối số và đầu tiên được áp dụng cho hai mục đầu tiên của các mục. Kết quả này và các yếu tố tiếp theo của các mặt hàng sau đó được kết hợp một lần theo cách tương tự, cho đến khi tất cả các yếu tố của các mục đã được tiêu thụ. ban đầu là giá trị bắt đầu tùy chọn được sử dụng trong tính toán đầu tiên và khi các mục là

F

H lib

fl

B

d

ff

Chương 15 Cấu trúc dữ liệu, thuật toán và đơn giản hóa mã

269

Nói với M1 là X: Với M2 là Y: Tuyên bố. Xin lưu ý rằng nếu một trình quản lý bối cảnh bên trong bẫy và triệt tiêu một ngoại lệ, không có thông tin ngoại lệ nào được chuyển cho các nhà quản lý bên ngoài. Đóng [đối tượng]

Tạo trình quản lý bối cảnh tự động thực thi object.close [] khi thực thi rời khỏi phần thân của câu lệnh. Giá trị được trả về bởi câu lệnh với đối tượng.

Một người trang trí thực hiện nhiệm vụ tương tự như update_wrapper [] trên hàm mà nó được áp dụng. được chỉ định và cập nhật có cùng ý nghĩa. Một cách sử dụng điển hình của trang trí này là khi viết các trang trí khác. Ví dụ: từ functools nhập Wraps def Debug [func]: @Wraps [func] def wrapping [*args, ** kwargs]: in ["Gọi % s" % func._ _name_ _] r = func [*args, *s

Xem thêm: Chương 6, Chức năng và lập trình chức năng.

Heapq Mô -đun Heapq thực hiện hàng đợi ưu tiên bằng một đống. Thoát đơn giản là danh sách các mục được đặt hàng trong đó điều kiện đống đã được áp đặt. Cụ thể, Heap [N] = B Truth [A] Trả về Đúng nếu A đúng, Sai nếu không Concat [A, B] Trả về A + B cho các chuỗi lặp lại [A, B] Trả về A * B cho chuỗi A và Số nguyên B chứa . Trả về a [b] setitem [a, b, c] a [b] = c delitem [a, b] del a [b] get , c, v] đặt A [b: c] = v delslice [a, b, c] del a [b: c] is_ [a, b] a is b is_not [a, b] a không phải là b lshift [ a, b] rshift [a, b] và_ [a, b] or_ [a, b]

Thoạt nhìn, có thể không rõ ràng tại sao mọi người muốn sử dụng các chức năng này vì các hoạt động mà chúng thực hiện có thể dễ dàng được thực hiện bằng cách nhập cú pháp bình thường. Ở đâu các chức năng này rất hữu ích khi làm việc với mã sử dụng các chức năng gọi lại và nơi bạn có thể Nếu không, được xác định một chức năng ẩn danh với Lambda. Ví dụ: hãy xem xét điểm chuẩn thời gian sau sử dụng hàm functools.reduce []: >>> từ thời gian nhập thời gian >>> timeit ["Giảm [toán tử.add, a]", "toán tử nhập khẩu; A = phạm vi [100 ] "] 12.055853843688965 >>> Thời gian [" Giảm [Lambda X, Y: X+Y, A] "

Trong ví dụ, hãy chú ý cách sử dụng toán tử.ADD khi cuộc gọi lại chạy nhanh hơn gấp đôi so với phiên bản sử dụng lambda X, y: x+y.

F

H lib

fl

B

d

ff

nhà điều hành

275

Mô -đun toán tử cũng xác định các chức năng sau tạo các trình bao bọc xung quanh quyền truy cập thuộc tính, tra cứu vật phẩm và các cuộc gọi phương thức. Attrgetter [tên [, name2 [, ... [, namen]]]]]

Tạo một đối tượng có thể gọi được, F, trong đó một cuộc gọi đến f [obj] trả về obj.name. Nếu có nhiều đối số được đưa ra, một kết quả được trả về. Ví dụ, Attrgetter ['Tên', 'Chia sẻ'] trả về [obj.name, obj.shares] khi được gọi. Tên cũng có thể bao gồm tra cứu chấm bổ sung. Ví dụ: nếu tên là "địa chỉ.hostname", thì f [obj] trả về obj.address.hostname. itemgetter [item [, item2 [, ... [, itemn]]]]]

Tạo một đối tượng có thể gọi được, F, trong đó một cuộc gọi đến F [obj] trả về obj [item]. Nếu có nhiều mục được đưa ra dưới dạng đối số, một cuộc gọi đến f [obj] trả về một tuple chứa [obj [item], obj [item2], ..., obj [itemn]]. MethodCaller [name [, *args [, ** kwargs]]]]

Tạo một đối tượng có thể gọi được, f, trong đó một cuộc gọi đến f [obj] trả về obj.name [*args, ** kwargs].

Các chức năng này cũng hữu ích để tối ưu hóa hiệu suất của các hoạt động liên quan đến chức năng gọi lại, đặc biệt là các chức năng liên quan đến các hoạt động xử lý dữ liệu phổ biến như sắp xếp. Ví dụ: nếu bạn muốn sắp xếp một danh sách các hàng Tuples trên cột 2, bạn có thể sử dụng Sắp xếp [hàng, key = lambda r: r [2]] hoặc sử dụng được sắp xếp [hàng, key = itemgetter [2]]. Phiên bản thứ hai chạy nhanh hơn nhiều vì nó tránh được chi phí liên quan đến Lambda.

F

H lib

fl

B

d

ff

nhà điều hành

F

H lib

fl

B

d

ff

nhà điều hành

Mô -đun toán tử cũng xác định các chức năng sau tạo các trình bao bọc xung quanh quyền truy cập thuộc tính, tra cứu vật phẩm và các cuộc gọi phương thức. Attrgetter [tên [, name2 [, ... [, namen]]]]]

Tạo một đối tượng có thể gọi được, F, trong đó một cuộc gọi đến f [obj] trả về obj.name. Nếu có nhiều đối số được đưa ra, một kết quả được trả về. Ví dụ, Attrgetter ['Tên', 'Chia sẻ'] trả về [obj.name, obj.shares] khi được gọi. Tên cũng có thể bao gồm tra cứu chấm bổ sung. Ví dụ: nếu tên là "địa chỉ.hostname", thì f [obj] trả về obj.address.hostname. itemgetter [item [, item2 [, ... [, itemn]]]]]

Tạo một đối tượng có thể gọi được, F, trong đó một cuộc gọi đến F [obj] trả về obj [item]. Nếu có nhiều mục được đưa ra dưới dạng đối số, một cuộc gọi đến f [obj] trả về một tuple chứa [obj [item], obj [item2], ..., obj [itemn]]. MethodCaller [name [, *args [, ** kwargs]]]]

Tạo một đối tượng có thể gọi được, f, trong đó một cuộc gọi đến f [obj] trả về obj.name [*args, ** kwargs].

Một hàm mã hóa không trạng thái mã hóa chuỗi Unicode S và trả về một tuple [byte, length_consumed]. Byte là một chuỗi 8 bit hoặc mảng byte chứa dữ liệu được mã hóa. LEGET_CONSUMED là số lượng ký tự trong s được mã hóa. Lỗi là chính sách xử lý lỗi và được đặt thành 'nghiêm ngặt' theo mặc định. c.decode [byte [, lỗi]]

Một hàm mã hóa không trạng thái giải mã byte chuỗi byte và trả về một tuple [s, length_consumed]. s là một chuỗi unicode và lewt_consumed là số byte trong byte đã được tiêu thụ trong quá trình giải mã. Lỗi là chính sách xử lý lỗi và được đặt thành 'nghiêm ngặt theo mặc định.

F

H lib

fl

B

d

ff

278

Chương 16 Chuỗi và xử lý văn bản

C.StreamReader [byteStream [, lỗi]]

Trả về một phiên bản StreamReader được sử dụng để đọc dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở ở chế độ nhị phân. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một phiên bản R của StreamReader hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

Sự mô tả

R.Read [[size [, chars [, firstline]]]] trả về hầu hết các ký tự ký tự của văn bản được giải mã. Kích thước là số lượng byte tối đa để đọc từ dòng byte cấp thấp và được sử dụng để kiểm soát bộ đệm bên trong. FirstLine là một lá cờ, nếu được đặt, trả về dòng đầu tiên ngay cả khi xảy ra lỗi giải mã sau đó trong tệp. R.Readline [[Kích thước [, Keepends]]] trả về một dòng văn bản được giải mã. Keepends là một lá cờ kiểm soát liệu các kết thúc dòng có được bảo tồn hay không [đúng theo mặc định]. R.Readlines [[kích thước [, Keepends]]] đọc tất cả các dòng vào một danh sách. R.Reset [] đặt lại bộ đệm bên trong và trạng thái.

C.StreamWriter [byteStream [, lỗi]]

Trả về một thể hiện StreamWriter được sử dụng để ghi dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở trong chế độ byte. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một thể hiện W của Streamwriter hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

Sự mô tả

R.Read [[size [, chars [, firstline]]]] trả về hầu hết các ký tự ký tự của văn bản được giải mã. Kích thước là số lượng byte tối đa để đọc từ dòng byte cấp thấp và được sử dụng để kiểm soát bộ đệm bên trong. FirstLine là một lá cờ, nếu được đặt, trả về dòng đầu tiên ngay cả khi xảy ra lỗi giải mã sau đó trong tệp. R.Readline [[Kích thước [, Keepends]]] trả về một dòng văn bản được giải mã. Keepends là một lá cờ kiểm soát liệu các kết thúc dòng có được bảo tồn hay không [đúng theo mặc định]. R.Readlines [[kích thước [, Keepends]]] đọc tất cả các dòng vào một danh sách. R.Reset [] đặt lại bộ đệm bên trong và trạng thái.

C.StreamWriter [byteStream [, lỗi]]

Trả về một thể hiện StreamWriter được sử dụng để ghi dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở trong chế độ byte. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một thể hiện W của Streamwriter hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

W.Write [S] W.Writelines [dòng] W.Reset []

Sự mô tả

R.Read [[size [, chars [, firstline]]]] trả về hầu hết các ký tự ký tự của văn bản được giải mã. Kích thước là số lượng byte tối đa để đọc từ dòng byte cấp thấp và được sử dụng để kiểm soát bộ đệm bên trong. FirstLine là một lá cờ, nếu được đặt, trả về dòng đầu tiên ngay cả khi xảy ra lỗi giải mã sau đó trong tệp. R.Readline [[Kích thước [, Keepends]]] trả về một dòng văn bản được giải mã. Keepends là một lá cờ kiểm soát liệu các kết thúc dòng có được bảo tồn hay không [đúng theo mặc định]. R.Readlines [[kích thước [, Keepends]]] đọc tất cả các dòng vào một danh sách. R.Reset [] đặt lại bộ đệm bên trong và trạng thái.

C.StreamWriter [byteStream [, lỗi]]

Trả về một thể hiện StreamWriter được sử dụng để ghi dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở trong chế độ byte. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một thể hiện W của Streamwriter hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

F

H lib

fl

B

d

ff

Chương 16 Chuỗi và xử lý văn bản

279

C.StreamReader [byteStream [, lỗi]]

Trả về một phiên bản StreamReader được sử dụng để đọc dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở ở chế độ nhị phân. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một phiên bản R của StreamReader hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

Sự mô tả

R.Read [[size [, chars [, firstline]]]] trả về hầu hết các ký tự ký tự của văn bản được giải mã. Kích thước là số lượng byte tối đa để đọc từ dòng byte cấp thấp và được sử dụng để kiểm soát bộ đệm bên trong. FirstLine là một lá cờ, nếu được đặt, trả về dòng đầu tiên ngay cả khi xảy ra lỗi giải mã sau đó trong tệp. R.Readline [[Kích thước [, Keepends]]] trả về một dòng văn bản được giải mã. Keepends là một lá cờ kiểm soát liệu các kết thúc dòng có được bảo tồn hay không [đúng theo mặc định]. R.Readlines [[kích thước [, Keepends]]] đọc tất cả các dòng vào một danh sách. R.Reset [] đặt lại bộ đệm bên trong và trạng thái.

C.StreamWriter [byteStream [, lỗi]]

Trả về một thể hiện StreamWriter được sử dụng để ghi dữ liệu được mã hóa. ByteStream là một đối tượng giống như tệp đã được mở trong chế độ byte. Lỗi là chính sách xử lý lỗi và theo mặc định 'nghiêm ngặt'. Một thể hiện W của Streamwriter hỗ trợ các hoạt động I/O cấp thấp sau: Phương thức

W.Write [S] W.Writelines [dòng] W.Reset []

Viết một biểu diễn được mã hóa của chuỗi S ghi một danh sách các chuỗi trong các dòng vào tệp đặt lại bộ đệm bên trong và trạng thái

c.incrementalencoder [[lỗi]]

Trả về một phiên bản gia tăng có thể được sử dụng để mã hóa các chuỗi trong nhiều bước. Lỗi là 'nghiêm ngặt' theo mặc định. Một thể hiện e của gia tăng có các phương pháp sau: Phương thức

E.Code [s [, cuối cùng]]

[, lỗi]]

Một hàm máy phát điện tăng dần phân giải tất cả các chuỗi byte trong ITEBLEBELDE theo mã hóa được chỉ định. Lỗi là 'nghiêm ngặt' theo mặc định.

Các hằng số hữu ích Codec định nghĩa các hằng số đánh dấu thứ tự byte sau đây có thể được sử dụng để giúp đỡ

Giải thích các tệp khi bạn không biết bất cứ điều gì về mã hóa cơ bản. Những điều này

F

H lib

fl

B

d

ff

Chương 16 Chuỗi và xử lý văn bản

280

Các điểm đánh dấu thứ tự byte đôi khi được viết ở đầu một tệp để chỉ ra mã hóa ký tự của nó và có thể được sử dụng để chọn một codec thích hợp để sử dụng. Không thay đổi

Sự mô tả

Bom Bom_be

Điểm đánh dấu thứ tự byte gốc cho máy [BOM_BE hoặc BOM_LE] Điểm đánh dấu thứ tự byte lớn ['\ xfe \ xff'] đánh dấu little-endian byte ['\ xff \ xfe'] đánh dấu utf-8 ['\ \ XEF \ xbb \ xbf '] 16 bit UTF-16 Big-Endian Mark -endian đánh dấu ['\ x00 \ x00 \ xfe \ xff'] 32 bit UTF-32 Little-Endian Mark

BOM_LE BOM_UTF8 BOM_UTF16_BE BOM_UTF16_LE BOM_UTF32_BE BOM_UTF32_LE

Mã hóa tiêu chuẩn Sau đây là danh sách một số mã hóa ký tự được sử dụng phổ biến nhất. Tên mã hóa là những gì bạn sẽ chuyển đến các hàm như Open [] hoặc Tra cứu [] khi chỉ định mã hóa. Một danh sách đầy đủ các mã hóa có thể được tìm thấy bằng cách tham khảo tài liệu trực tuyến cho mô -đun Codecs [//docs.python.org/l Library/codecs]. Tên codec

Sự mô tả

Bom Bom_be

Điểm đánh dấu thứ tự byte gốc cho máy [BOM_BE hoặc BOM_LE] Điểm đánh dấu thứ tự byte lớn ['\ xfe \ xff'] đánh dấu little-endian byte ['\ xff \ xfe'] đánh dấu utf-8 ['\ \ XEF \ xbb \ xbf '] 16 bit UTF-16 Big-Endian Mark -endian đánh dấu ['\ x00 \ x00 \ xfe \ xff'] 32 bit UTF-32 Little-Endian Mark

BOM_LE BOM_UTF8 BOM_UTF16_BE BOM_UTF16_LE BOM_UTF32_BE BOM_UTF32_LE

Mã hóa tiêu chuẩn Sau đây là danh sách một số mã hóa ký tự được sử dụng phổ biến nhất. Tên mã hóa là những gì bạn sẽ chuyển đến các hàm như Open [] hoặc Tra cứu [] khi chỉ định mã hóa. Một danh sách đầy đủ các mã hóa có thể được tìm thấy bằng cách tham khảo tài liệu trực tuyến cho mô -đun Codecs [//docs.python.org/l Library/codecs]. Tên codec

Mã hóa tiêu chuẩn Sau đây là danh sách một số mã hóa ký tự được sử dụng phổ biến nhất. Tên mã hóa là những gì bạn sẽ chuyển đến các hàm như Open [] hoặc Tra cứu [] khi chỉ định mã hóa. Một danh sách đầy đủ các mã hóa có thể được tìm thấy bằng cách tham khảo tài liệu trực tuyến cho mô -đun Codecs [//docs.python.org/l Library/codecs]. Tên codec

ASCII CP437 CP1252 LATIN-1, ISO-8859-1 UTF-16 UTF-16-BE UTF-16-LE UTF-32 UTF-32-BE UTF-32-LE UTF-8

F

H lib

fl

B

d

ff

Chương 16 Chuỗi và xử lý văn bản

281

Các điểm đánh dấu thứ tự byte đôi khi được viết ở đầu một tệp để chỉ ra mã hóa ký tự của nó và có thể được sử dụng để chọn một codec thích hợp để sử dụng. Không thay đổi

Sự mô tả

Sự mô tả

Bom Bom_be

Điểm đánh dấu thứ tự byte gốc cho máy [BOM_BE hoặc BOM_LE] Điểm đánh dấu thứ tự byte lớn ['\ xfe \ xff'] đánh dấu little-endian byte ['\ xff \ xfe'] đánh dấu utf-8 ['\ \ XEF \ xbb \ xbf '] 16 bit UTF-16 Big-Endian Mark -endian đánh dấu ['\ x00 \ x00 \ xfe \ xff'] 32 bit UTF-32 Little-Endian Mark

+ ? *? +? ?? {m} {m, n}

{m, n}? [...]

[^...] A|B [...]

continues

F

h Lib

fL

B

d

ff

282

Chapter 16 String and Text Handling

Character[s]

Description

Interprets the letters "a", "i", "L", "m", "s", "u", and "x" as flag settings corresponding to the re.A, re.I, re.L, re.M, re.S, re.U, re.X flag settings given to re.compile[]. "a" only available in Python 3. [?:...] Matches the regular expression inside the parentheses but discards the matched substring. [?P...] Matches the regular expression in the parentheses and creates a named group. The group name must be a valid Python identifier. [?P=name] Matches the same text that was matched by an earlier named group. [?#...] A comment. The contents of the parentheses are ignored. [?=...] Matches the preceding expression only if followed by the pattern in the parentheses. For example, r'Hello [?=World]' matches 'Hello ' only if followed by 'World'. [?!...] Matches the preceding expression only if it’s not followed by the pattern in parentheses. For example, r'Hello [?!World]' matches 'Hello ' only if it’s not followed by 'World'. [? and . POSIX defines the following constants for name: Constant

Description

"PC_ASYNC_IO"

Indicates whether asynchronous I/O can be performed on fd. Indicates whether the chown[] function can be used. If fd refers to a directory, this applies to all files in the directory. Maximum size of a file. Maximum value of the file’s link count. Maximum length of a formatted input line. fd refers to a terminal. Maximum length of an input line. fd refers to a terminal.

"PC_CHOWN_RESTRICTED"

"PC_FILESIZEBITS" "PC_LINK_MAX" "PC_MAX_CANON" "PC_MAX_INPUT"

F

h Lib

fL

B

d

ff

os

383

Constant

Description

"PC_NAME_MAX" "PC_NO_TRUNC"

Maximum length of a filename in a directory. Indicates whether an attempt to create a file with a name longer than PC_NAME_MAX for a directory will fail with an ENAMETOOLONG error. Maximum length of a relative path name when the directory fd is the current working directory. Size of the pipe buffer when fd refers to a pipe or FIFO. Indicates whether priority I/O can be performed on fd. Indicates whether synchronous I/O can be performed on fd. Indicates whether fd allows special-character processing to be disabled. fd must refer to a terminal.

"PC_PATH_MAX" "PC_PIPE_BUF" "PC_PRIO_IO" "PC_SYNC_IO" "PC_VDISABLE"

Not all names are available on all platforms, and some systems may define additional configuration parameters. However, a list of the names known to the operating system can be found in the dictionary os.pathconf_names. If a known configuration name is not included in os.pathconf_names, its integer value can also be passed as name. Even if a name is recognized by Python, this function may still raise an OSError if the host operating system doesn’t recognize the parameter or associate it with the file fd.This function is only available on some versions of UNIX. fstat[fd]

Returns the status for file descriptor fd. Returns the same values as the os.stat[] function [UNIX and Windows]. fstatvfs[fd]

Returns information about the file system containing the file associated with file descriptor fd. Returns the same values as the os.statvfs[] function [UNIX]. fsync[fd]

Forces any unwritten data on fd to be written to disk. Note that if you are using an object with buffered I/O [for example, a Python file object], you should first flush the data before calling fsync[]. Available on UNIX and Windows. ftruncate[fd, length]

Truncates the file corresponding to file descriptor fd so that it’s at most length bytes in size [UNIX]. isatty[fd]

Returns True if fd is associated with a TTY-like device such as a terminal [UNIX]. lseek[fd, pos, how]

Sets the current position of file descriptor fd to position pos.Values of how are as follows: SEEK_SET sets the position relative to the beginning of the file, SEEK_CUR sets it relative to the current position, and SEEK_END sets it relative to the end of the file. In older Python code, it is common to see these constants replaced with their numeric values of 0, 1, or 2, respectively.

F

h Lib

fL

B

d

ff

384

Chapter 19 Operating System Services

open[file [, flags [, mode]]]

Opens the file file. flags is the bitwise OR of the following constant values: Value

Description

O_RDONLY O_WRONLY

Open the file for reading. Open the file for writing. Open for reading and writing [updates]. Append bytes to the end of the file. Create the file if it doesn’t exist. Don’t block on open, read, or write [UNIX]. Same as O_NONBLOCK [UNIX]. Synchronous writes [UNIX]. When opening a device, don’t set controlling terminal [UNIX]. If the file exists, truncates to zero length. Synchronous reads [UNIX]. Synchronous writes [UNIX]. Error if O_CREAT and the file already exists. Set an exclusive lock on the file. Set a shared lock on the file. Enables asynchronous input mode in which a SIGIO signal is generated with input is available. Use direct I/O mode where reads and writes go directly to the disk instead of the operating system read/write caches. Raises an error if the file is not a directory. Don’t follow symbolic links. Don’t update the last access time of the file. Text mode [Windows]. Binary mode [Windows]. File not inherited by child processes [Windows]. Hint to system that the file is used for short-term storage [Windows]. Delete file when closed [Windows]. Hint to system that file will be used for random access [Windows]. Hint to system that file will be accessed sequentially [Windows].

O_rdwr

Các chế độ I/O đồng bộ [O_Sync, O_DSYNC, O_RSYNC] Các hoạt động I/O buộc chặn cho đến khi chúng được hoàn thành ở cấp độ phần cứng [ví dụ: ghi sẽ chặn cho đến khi các byte được ghi vào đĩa]. Tham số chứa các quyền của tệp được biểu thị dưới dạng bitwise hoặc của các giá trị octal sau [được định nghĩa là hằng số trong mô -đun thống kê như đã chỉ ra]: Chế độ

Nghĩa

0100 0200 0400 0700

Người dùng người dùng người dùng

Có đã có

thực thi quyền [stat.s_ixusr]. Viết quyền [stat.s_iwusr]. Đọc quyền [stat.s_irusr]. Đọc/Viết/Quyền thực thi [Stat.S_IRWXU].

F

H lib

fl

B

d

ff

hệ điều hành

Cách thức

Nghĩa

0100 0200 0400 0700

Người dùng người dùng người dùng

Có đã có

385

thực thi quyền [stat.s_ixusr]. Viết quyền [stat.s_iwusr]. Đọc quyền [stat.s_irusr]. Đọc/Viết/Quyền thực thi [Stat.S_IRWXU].

F

H lib

fl

B

d

ff

hệ điều hành

F

H lib

fl

B

d

ff

386

hệ điều hành

Cách thức

0010 0020 0040 0070

Nhóm có quyền thực thi [stat.s_ixgrp]. Nhóm có quyền viết [Stat.S_IWGRP]. Nhóm có quyền đọc [stat.s_irgrp]. Nhóm có quyền đọc/ghi/thực thi [Stat.S_IRWXG]. Những người khác có quyền thực thi [stat.s_ixoth]. Những người khác có quyền viết [stat.s_iwoth]. Những người khác có quyền đọc [stat.s_iroth]. Những người khác có quyền đọc/viết/thực thi [Stat.S_IRWXO]. Đặt chế độ UID [Stat.S_ISUID]. Đặt chế độ GID [stat.s_isgid]. Đặt bit dính [stat.s_isvtx].

0001 0002 0004 0007 4000 2000 1000

Chế độ mặc định của một tệp là [0777 & ˜umask], trong đó cài đặt UMASK được sử dụng để xóa các quyền đã chọn. Ví dụ: UMASK của 0022 sẽ loại bỏ quyền ghi cho các nhóm và các nhóm khác. UMASK có thể được thay đổi bằng hàm os.umask []. Cài đặt UMASK không có tác dụng trên Windows. OpenPty []

Mở một thiết bị đầu cuối psuedo và trả về một cặp mô tả tệp [chủ, nô lệ] cho pty và tty. Có sẵn trên một số phiên bản của Unix. đường ống[]

Tạo một đường ống có thể được sử dụng để thiết lập giao tiếp đơn hướng với một quy trình khác. Trả về một cặp mô tả tệp [R, W] có thể sử dụng để đọc và ghi, hàm này thường được gọi trước khi thực thi hàm fork []. Sau khi nĩa [], quá trình gửi đóng đầu đọc của đường ống và quá trình nhận đóng đầu cuối của đường ống. Tại thời điểm này, đường ống được kích hoạt và dữ liệu có thể được gửi từ quy trình này sang quy trình khác bằng các hàm đọc [] và write [] [UNIX]. Đọc [FD, N]

Đọc nhiều nhất n byte từ bộ mô tả tệp fd. Trả về một chuỗi byte chứa các byte đọc. tcgetpgrp [FD]

Trả về nhóm quy trình được liên kết với thiết bị đầu cuối điều khiển được đưa ra bởi FD [UNIX]. TCSETPGRP [FD, PG]

Nghĩa

stat.uf_nodump

Không đổ tệp. Các tập tin chỉ đọc. Tệp chỉ hỗ trợ các hoạt động phụ lục. Thư mục mờ đục. Các tập tin có thể không bị xóa hoặc đổi tên. Các tập tin có thể được lưu trữ. Các tập tin chỉ đọc. Tệp chỉ hỗ trợ các hoạt động phụ lục. Các tập tin có thể không bị xóa hoặc đổi tên. Tệp là một tệp ảnh chụp nhanh.

stat.uf_immutable stat.uf_append stat.uf_opaque stat.uf_nounlink stat.sf_archived stat.sf_immutable stat.sf_append stat.sf_nounlink stat.sf_snapshot

F

H lib

fl

B

d

ff

hệ điều hành

387

Chmod [đường dẫn, chế độ]

Thay đổi chế độ của đường dẫn. Chế độ có các giá trị tương tự như được mô tả cho hàm Open [] [UNIX và Windows]. Chown [đường dẫn, uid, gid]

Thay đổi chủ sở hữu và ID nhóm của đường dẫn đến UID và GID số. Đặt UID hoặc GID thành -1 khiến tham số đó vẫn không được sửa đổi [UNIX]. LCHFLAGS [đường dẫn, cờ]

Giống như Chflags [], nhưng không theo các liên kết tượng trưng [UNIX]. LCHMOD [đường dẫn, chế độ]

Giống như chmod [] ngoại trừ nếu đường dẫn là một liên kết tượng trưng, ​​nó sẽ tự sửa đổi liên kết, chứ không phải tệp mà liên kết đề cập đến. lchown [đường dẫn, uid, gid]

Giống như Chown [] nhưng không theo các liên kết tượng trưng [UNIX]. liên kết [SRC, DST]

Tạo một liên kết cứng có tên DST chỉ vào SRC [UNIX]. ListDir [Path]

Trả về một danh sách chứa tên của các mục trong đường dẫn thư mục. Danh sách được trả về theo thứ tự tùy ý và không bao gồm các mục đặc biệt của '.' và '..'. Nếu đường dẫn là unicode, danh sách kết quả sẽ chỉ chứa các chuỗi unicode. Xin lưu ý rằng nếu bất kỳ tên tệp nào trong thư mục có thể được mã hóa đúng vào Unicode, chúng sẽ được bỏ qua. Nếu đường dẫn được đưa ra dưới dạng chuỗi byte, thì tất cả các tên tệp được trả về làm danh sách các chuỗi byte. lstat [đường dẫn]

Giống như Stat [] nhưng không theo các liên kết tượng trưng [UNIX]. Makedev [Thiếu tá, Minor]

Tạo một số thiết bị thô được đưa ra số thiết bị chính và nhỏ [UNIX]. Thiếu tá [DeviceNum]

Trả về số thiết bị chính từ số thiết bị thô DeviceNum được tạo bởi makedev []. Minor [Devicenum]

Trả về số thiết bị nhỏ từ số thiết bị thô DeviceNum được tạo bởi makedev []. makedirs [đường dẫn [, chế độ]]

Chức năng tạo thư mục đệ quy. Giống như mkdir [] nhưng làm cho tất cả các thư mục trung gian cần thiết để chứa thư mục lá. Tăng một ngoại lệ Oserror nếu thư mục lá đã tồn tại hoặc không thể được tạo ra.

F

H lib

fl

B

d

ff

388

hệ điều hành

Chmod [đường dẫn, chế độ]

Thay đổi chế độ của đường dẫn. Chế độ có các giá trị tương tự như được mô tả cho hàm Open [] [UNIX và Windows]. Chown [đường dẫn, uid, gid]

Thay đổi chủ sở hữu và ID nhóm của đường dẫn đến UID và GID số. Đặt UID hoặc GID thành -1 khiến tham số đó vẫn không được sửa đổi [UNIX]. LCHFLAGS [đường dẫn, cờ]

Giống như Chflags [], nhưng không theo các liên kết tượng trưng [UNIX]. LCHMOD [đường dẫn, chế độ]

Giống như chmod [] ngoại trừ nếu đường dẫn là một liên kết tượng trưng, ​​nó sẽ tự sửa đổi liên kết, chứ không phải tệp mà liên kết đề cập đến. lchown [đường dẫn, uid, gid]

Giống như Chown [] nhưng không theo các liên kết tượng trưng [UNIX]. liên kết [SRC, DST]

Tạo một liên kết cứng có tên DST chỉ vào SRC [UNIX]. ListDir [Path]

Trả về một danh sách chứa tên của các mục trong đường dẫn thư mục. Danh sách được trả về theo thứ tự tùy ý và không bao gồm các mục đặc biệt của '.' và '..'. Nếu đường dẫn là unicode, danh sách kết quả sẽ chỉ chứa các chuỗi unicode. Xin lưu ý rằng nếu bất kỳ tên tệp nào trong thư mục có thể được mã hóa đúng vào Unicode, chúng sẽ được bỏ qua. Nếu đường dẫn được đưa ra dưới dạng chuỗi byte, thì tất cả các tên tệp được trả về làm danh sách các chuỗi byte. lstat [đường dẫn]

Giống như Stat [] nhưng không theo các liên kết tượng trưng [UNIX]. Makedev [Thiếu tá, Minor]

Tạo một số thiết bị thô được đưa ra số thiết bị chính và nhỏ [UNIX]. Thiếu tá [DeviceNum]

Trả về số thiết bị chính từ số thiết bị thô DeviceNum được tạo bởi makedev []. Minor [Devicenum]

Trả về số thiết bị nhỏ từ số thiết bị thô DeviceNum được tạo bởi makedev []. makedirs [đường dẫn [, chế độ]]

F

H lib

fl

B

d

ff

hệ điều hành

Thuộc tính

Sự mô tả

st_mode st_ino st_dev st_nlink

Chế độ bảo vệ Inode Thiết bị số inode Thiết bị Inode nằm trên số lượng liên kết đến ID người dùng Inode của ID nhóm chủ sở hữu của kích thước tệp chủ sở hữu trong byte thời gian truy cập cuối cùng của thời gian sửa đổi cuối cùng của thay đổi trạng thái cuối cùng

st_uid st_gid st_size st_atime st_mtime st_ctime

389

Tuy nhiên, các thuộc tính bổ sung có thể có sẵn tùy thuộc vào hệ thống. Đối tượng được trả về bởi stat [] cũng trông giống như 10 tuple chứa các tham số [st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime] . Hình thức sau này được cung cấp cho khả năng tương thích ngược. Mô -đun Stat xác định các hằng số được sử dụng để trích xuất các trường từ bộ thuật này. Stat_float_times [[NewValue]]

Trả về đúng nếu thời gian được trả về bởi stat [] là số điểm nổi thay vì số nguyên. Hành vi có thể được thay đổi bằng cách cung cấp giá trị boolean cho newValue. Statvfs [đường dẫn]

Thực hiện lệnh gọi hệ thống statvfs [] trên đường dẫn đã cho để lấy thông tin về hệ thống tệp. Giá trị trả về là một đối tượng có thuộc tính mô tả hệ thống tệp. Các thuộc tính phổ biến bao gồm: thuộc tính

Sự mô tả

st_mode st_ino st_dev st_nlink

Chế độ bảo vệ Inode Thiết bị số inode Thiết bị Inode nằm trên số lượng liên kết đến ID người dùng Inode của ID nhóm chủ sở hữu của kích thước tệp chủ sở hữu trong byte thời gian truy cập cuối cùng của thời gian sửa đổi cuối cùng của thay đổi trạng thái cuối cùng

st_uid st_gid st_size st_atime st_mtime st_ctime

Tuy nhiên, các thuộc tính bổ sung có thể có sẵn tùy thuộc vào hệ thống. Đối tượng được trả về bởi stat [] cũng trông giống như 10 tuple chứa các tham số [st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime] . Hình thức sau này được cung cấp cho khả năng tương thích ngược. Mô -đun Stat xác định các hằng số được sử dụng để trích xuất các trường từ bộ thuật này. Stat_float_times [[NewValue]]

F

H lib

fl

B

d

ff

390

hệ điều hành

Thuộc tính

Sự mô tả

st_mode st_ino st_dev st_nlink

Chế độ bảo vệ Inode Thiết bị số inode Thiết bị Inode nằm trên số lượng liên kết đến ID người dùng Inode của ID nhóm chủ sở hữu của kích thước tệp chủ sở hữu trong byte thời gian truy cập cuối cùng của thời gian sửa đổi cuối cùng của thay đổi trạng thái cuối cùng

st_uid st_gid st_size st_atime st_mtime st_ctime

Tuy nhiên, các thuộc tính bổ sung có thể có sẵn tùy thuộc vào hệ thống. Đối tượng được trả về bởi stat [] cũng trông giống như 10 tuple chứa các tham số [st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime] . Hình thức sau này được cung cấp cho khả năng tương thích ngược. Mô -đun Stat xác định các hằng số được sử dụng để trích xuất các trường từ bộ thuật này. Stat_float_times [[NewValue]]

Trả về đúng nếu thời gian được trả về bởi stat [] là số điểm nổi thay vì số nguyên. Hành vi có thể được thay đổi bằng cách cung cấp giá trị boolean cho newValue. Statvfs [đường dẫn]

Thực hiện lệnh gọi hệ thống statvfs [] trên đường dẫn đã cho để lấy thông tin về hệ thống tệp. Giá trị trả về là một đối tượng có thuộc tính mô tả hệ thống tệp. Các thuộc tính phổ biến bao gồm: thuộc tính

f_bsize f_frsize f_blocks f_bfree f_bavail f_files f_ffree f_favail f_flag f_namemax

Kích thước khối hệ thống ưa thích Tệp cơ bản Kích thước khối Hệ thống Tổng số khối trong hệ thống tệp Tổng số khối miễn phí Các khối miễn phí có sẵn cho tổng số tệp không phải là người đăng ký tổng số tệp miễn phí vào các nút miễn phí có sẵn cho một cờ không phải là người quản lý [phụ thuộc vào hệ thống] Độ dài tên tệp tối đa

Đối tượng được trả về cũng hoạt động giống như một tuple chứa các thuộc tính này theo thứ tự được liệt kê. Mô -đun tiêu chuẩn StatVfs xác định các hằng số có thể được sử dụng để trích xuất thông tin từ dữ liệu STATVFS được trả về [UNIX]. Symlink [SRC, DST]

F

H lib

fl

B

d

ff

hệ điều hành

391

Thuộc tính

Sự mô tả

st_mode st_ino st_dev st_nlink

Giống như ExecVP [] nhưng với một biến môi trường bổ sung như trong hàm exec []. _exit [n]

Thoát ngay lập tức đến hệ thống với trạng thái N, mà không thực hiện bất kỳ hành động dọn dẹp nào. Điều này thường chỉ được thực hiện trong các quy trình con được tạo bởi fork []. Điều này cũng khác với việc gọi sys.exit [], thực hiện tắt máy thông dịch. Cho biết thành công, trong khi một giá trị khác cho biết một lỗi thuộc loại nào đó. Tùy thuộc vào hệ thống, một số giá trị mã thoát tiêu chuẩn có thể được xác định: giá trị

Sự mô tả

Ex_ok ex_usage ex_dataerr ex_noinput ex_nouser ex_nohost ex_notfound ex_unavailable ex_software ex_oserr ex_osfile ex_cantcreat ex_ioerr ex_tempfail ex_protocol ex_noperm ex_config

Không có lỗi. Sử dụng lệnh không chính xác. Dữ liệu đầu vào không chính xác. Thiếu đầu vào. Người dùng không tồn tại. Chủ nhà không tồn tại. Không tìm thấy. Dịch vụ Không sẵn có. Lỗi phần mềm nội bộ. Lỗi hệ điều hành. Lỗi hệ thống tệp. Có thể tạo ra đầu ra. Lỗi IO. Thất bại tạm thời. Lỗi giao thức. Không đủ quyền. Lỗi cấu hình.

cái nĩa[]

Tạo ra một quá trình trẻ em. Trả về 0 trong quy trình trẻ em mới được tạo và ID quy trình trẻ con trong quy trình ban đầu. Quá trình con là bản sao của quy trình ban đầu và chia sẻ nhiều tài nguyên như tệp mở [UNIX].

F

H lib

fl

B

d

ff

392

Chương 19 Dịch vụ hệ điều hành

forkpty []

Tạo một quá trình trẻ em bằng cách sử dụng một thiết bị đầu cuối giả mới làm thiết bị đầu cuối kiểm soát trẻ con. Trả về một cặp [PID, FD], trong đó PID là 0 ở trẻ và FD là bộ mô tả tệp của đầu chính của đầu pseudo. Hàm này chỉ có sẵn trong một số phiên bản nhất định của Unix. Giết [Pid, Sig]

Gửi quá trình pid tín hiệu sig. Một danh sách các tên tín hiệu có thể được tìm thấy trong mô -đun tín hiệu [UNIX]. KillPG [PGID, SIG]

Gửi nhóm quy trình pgid tín hiệu sig. Một danh sách các tên tín hiệu có thể được tìm thấy trong mô -đun tín hiệu [UNIX]. Đẹp [gia tăng]

Thêm một sự gia tăng vào mức độ ưu tiên lập lịch [tính tốt đẹp của quy trình] của quy trình. Trả về độ độc đáo mới. Về cơ bản, người dùng chỉ có thể giảm mức độ ưu tiên của một quy trình vì tăng mức độ ưu tiên đòi hỏi phải tiếp cận root. Hiệu quả của việc thay đổi mức độ ưu tiên là phụ thuộc vào hệ thống, nhưng việc giảm ưu tiên thường được thực hiện để thực hiện quá trình chạy trong nền theo cách mà nó không ảnh hưởng đáng kể đến hiệu suất của các quy trình khác [UNIX]. PLOCK [OP]

Các phân đoạn chương trình khóa vào bộ nhớ, ngăn chúng không bị hoán đổi. Giá trị của OP là một số nguyên xác định các phân đoạn nào bị khóa. Giá trị của OP là dành riêng cho nền tảng nhưng thường là một trong những phần mở khóa, cofflock, txtlock hoặc datlock. Các hằng số này không được xác định bởi Python nhưng có thể được tìm thấy trong tệp tiêu đề. Hàm này không có sẵn trên tất cả các nền tảng và thường chỉ có thể được thực hiện bởi một quy trình với ID người dùng hiệu quả là 0 [root] [UNIX]. popen [lệnh [, mode [, bufsize]]]]

Mở một đường ống đến hoặc từ một lệnh. Giá trị trả về là một đối tượng tệp mở được kết nối với đường ống, có thể được đọc hoặc viết tùy thuộc vào liệu chế độ là 'r' [mặc định] hoặc 'w'. bufSize có cùng ý nghĩa như trong hàm Open in [] tích hợp. Trạng thái thoát của lệnh được trả về bằng phương thức đóng [] của đối tượng tệp được trả về, ngoại trừ khi trạng thái thoát là 0, không có phương thức nào được trả về. Spawnv [chế độ, đường dẫn, args]

Thực hiện đường dẫn chương trình trong một quy trình mới, truyền các đối số được chỉ định trong Args dưới dạng các tham số dòng lệnh. Args có thể là một danh sách hoặc một tuple. Yếu tố đầu tiên của args phải là tên của chương trình. Chế độ là một trong những hằng số sau: hằng số

Sự mô tả

P_WAIT

Thực hiện chương trình và chờ nó chấm dứt. Trả về mã thoát của chương trình. Thực hiện chương trình và trả về xử lý quy trình. Giống như p_nowait.

P_nowait p_nowaito

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

393

forkpty []

Sự mô tả

Tạo một quá trình trẻ em bằng cách sử dụng một thiết bị đầu cuối giả mới làm thiết bị đầu cuối kiểm soát trẻ con. Trả về một cặp [PID, FD], trong đó PID là 0 ở trẻ và FD là bộ mô tả tệp của đầu chính của đầu pseudo. Hàm này chỉ có sẵn trong một số phiên bản nhất định của Unix. Giết [Pid, Sig]

Gửi quá trình pid tín hiệu sig. Một danh sách các tên tín hiệu có thể được tìm thấy trong mô -đun tín hiệu [UNIX]. KillPG [PGID, SIG]

Gửi nhóm quy trình pgid tín hiệu sig. Một danh sách các tên tín hiệu có thể được tìm thấy trong mô -đun tín hiệu [UNIX]. Đẹp [gia tăng]

Thêm một sự gia tăng vào mức độ ưu tiên lập lịch [tính tốt đẹp của quy trình] của quy trình. Trả về độ độc đáo mới. Về cơ bản, người dùng chỉ có thể giảm mức độ ưu tiên của một quy trình vì tăng mức độ ưu tiên đòi hỏi phải tiếp cận root. Hiệu quả của việc thay đổi mức độ ưu tiên là phụ thuộc vào hệ thống, nhưng việc giảm ưu tiên thường được thực hiện để thực hiện quá trình chạy trong nền theo cách mà nó không ảnh hưởng đáng kể đến hiệu suất của các quy trình khác [UNIX]. PLOCK [OP]

Các phân đoạn chương trình khóa vào bộ nhớ, ngăn chúng không bị hoán đổi. Giá trị của OP là một số nguyên xác định các phân đoạn nào bị khóa. Giá trị của OP là dành riêng cho nền tảng nhưng thường là một trong những phần mở khóa, cofflock, txtlock hoặc datlock. Các hằng số này không được xác định bởi Python nhưng có thể được tìm thấy trong tệp tiêu đề. Hàm này không có sẵn trên tất cả các nền tảng và thường chỉ có thể được thực hiện bởi một quy trình với ID người dùng hiệu quả là 0 [root] [UNIX]. popen [lệnh [, mode [, bufsize]]]]

Mở một đường ống đến hoặc từ một lệnh. Giá trị trả về là một đối tượng tệp mở được kết nối với đường ống, có thể được đọc hoặc viết tùy thuộc vào liệu chế độ là 'r' [mặc định] hoặc 'w'. bufSize có cùng ý nghĩa như trong hàm Open in [] tích hợp. Trạng thái thoát của lệnh được trả về bằng phương thức đóng [] của đối tượng tệp được trả về, ngoại trừ khi trạng thái thoát là 0, không có phương thức nào được trả về. Spawnv [chế độ, đường dẫn, args]

Giống như Spawnve [] ngoại trừ các đối số được cung cấp dưới dạng tham số. Tham số cuối cùng là ánh xạ chứa các biến môi trường. Spawnlp [chế độ, tệp, arg1, ..., argn]

Giống như spawnl [] nhưng tìm tệp bằng cách sử dụng cài đặt của biến môi trường đường dẫn [UNIX]. Spawnlpe [chế độ, tệp, arg1, ..., argn, env]

Giống như Spawnle [] nhưng tìm tệp bằng cách sử dụng cài đặt của biến môi trường đường dẫn [UNIX]. Spawnvp [chế độ, tệp, args]

Giống như Spawnv [] nhưng tìm tệp bằng cách sử dụng các cài đặt của biến môi trường đường dẫn [UNIX]. Spawnvpe [chế độ, tệp, args, env]

Giống như Spawnve [] nhưng tìm tệp bằng cách sử dụng cài đặt của biến môi trường đường dẫn [UNIX]. startfile [đường dẫn [, hoạt động]]

Khởi chạy ứng dụng được liên kết với đường dẫn tệp. Điều này thực hiện hành động tương tự như sẽ xảy ra nếu bạn nhấp đúp vào tệp trong Windows Explorer. Hàm trả về ngay khi ứng dụng được khởi chạy. Hơn nữa, không có cách nào để chờ hoàn thành hoặc để có được mã thoát khỏi ứng dụng. Đường dẫn là một liên quan đến thư mục hiện tại. Hoạt động là một chuỗi tùy chọn chỉ định hành động để thực hiện khi mở đường dẫn. Theo mặc định, nó được đặt thành 'Mở, nhưng nó có thể được đặt thành' In ',' Chỉnh sửa ',' Khám phá 'hoặc' Tìm '[danh sách chính xác phụ thuộc vào loại đường dẫn [Windows]]. hệ thống [lệnh]

Thực thi lệnh [một chuỗi] trong một vỏ bọc. Trên UNIX, giá trị trả về là trạng thái thoát của quy trình được trả về bằng Wait []. Trên Windows, mã thoát luôn là 0. Mô -đun phụ cung cấp năng lượng đáng kể hơn đáng kể và là cách ưa thích để khởi chạy các quy trình con.

F

H lib

fl

B

d

ff

394

Chương 19 Dịch vụ hệ điều hành

lần []

Trả về một số điểm nổi 5-Tuple biểu thị thời gian tích lũy tính bằng giây. Trên Unix, bộ tuple chứa thời gian người dùng, thời gian hệ thống, thời gian người dùng của trẻ em, thời gian hệ thống trẻ em và thời gian thực đã trôi qua theo thứ tự đó. Trên Windows, bộ tuple chứa thời gian người dùng, thời gian hệ thống và số không cho ba giá trị khác. Chờ [[PID]]

Chờ hoàn thành quy trình con và trả về một tuple chứa ID quy trình và trạng thái thoát. Trạng thái thoát là số 16 bit có số tín hiệu đã giết chết quá trình và byte cao là trạng thái thoát [nếu Số tín hiệu bằng không]. Bit cao của byte thấp được đặt nếu một tệp lõi được tạo ra. PID, nếu được đưa ra, chỉ định quá trình để chờ đợi. Nếu nó bị bỏ qua, hãy chờ [] trả về khi bất kỳ quy trình con nào thoát [UNIX]. Waitpid [PID, Tùy chọn]

Chờ thay đổi trạng thái của quy trình con được đưa ra bởi PID ID quy trình và trả về một tuple chứa ID quy trình và chỉ báo trạng thái thoát, được mã hóa như để chờ []. Các tùy chọn phải là 0 cho hoạt động bình thường hoặc wnohang để tránh treo nếu không có trạng thái quy trình con ngay lập tức. Hàm này cũng có thể được sử dụng để thu thập thông tin về các quy trình con chỉ ngừng thực hiện vì một số lý do. Đặt các tùy chọn để thu thập thông tin từ một đứa trẻ khi nó tiếp tục hoạt động sau khi bị dừng thông qua kiểm soát công việc. Đặt các tùy chọn để tìm kiếm thông tin từ một đứa trẻ đã bị dừng, nhưng từ đó chưa có thông tin trạng thái nào được báo cáo. Wait3 [[Tùy chọn]]

Giống như waitpid [] ngoại trừ chức năng chờ thay đổi trong bất kỳ quy trình con nào. Trả về 3-Tuple [PID, Trạng thái, RUSAGE], trong đó PID là ID quy trình con, Trạng thái là mã trạng thái thoát và RUSAGE chứa thông tin sử dụng tài nguyên được trả về bởi Resource.getRusage []. Tham số tùy chọn có cùng ý nghĩa Đối với Waitpid []. Wait4 [PID, Tùy chọn]

Giống như Waitpid [] ngoại trừ kết quả trả về có cùng bộ thuật được trả về bởi Wait3 []. Các chức năng sau đây có mã trạng thái quy trình được trả về bởi WaitPid [], Wait3 [] hoặc Wait4 [] và được sử dụng để kiểm tra trạng thái của quy trình [UNIX]. Wcoredump [trạng thái]

Trả về true nếu quá trình bỏ lõi. Widexited [trạng thái]

Trả về true nếu quá trình thoát ra bằng cách sử dụng lệnh gọi hệ thống thoát []. Wexitstatus [trạng thái]

Nếu wifexited [trạng thái] là đúng, tham số số nguyên cho cuộc gọi hệ thống thoát [] được trả về. Nếu không, giá trị trả về là vô nghĩa.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

395

lần []

Trả về một số điểm nổi 5-Tuple biểu thị thời gian tích lũy tính bằng giây. Trên Unix, bộ tuple chứa thời gian người dùng, thời gian hệ thống, thời gian người dùng của trẻ em, thời gian hệ thống trẻ em và thời gian thực đã trôi qua theo thứ tự đó. Trên Windows, bộ tuple chứa thời gian người dùng, thời gian hệ thống và số không cho ba giá trị khác. Chờ [[PID]]

Chờ hoàn thành quy trình con và trả về một tuple chứa ID quy trình và trạng thái thoát. Trạng thái thoát là số 16 bit có số tín hiệu đã giết chết quá trình và byte cao là trạng thái thoát [nếu Số tín hiệu bằng không]. Bit cao của byte thấp được đặt nếu một tệp lõi được tạo ra. PID, nếu được đưa ra, chỉ định quá trình để chờ đợi. Nếu nó bị bỏ qua, hãy chờ [] trả về khi bất kỳ quy trình con nào thoát [UNIX]. Waitpid [PID, Tùy chọn]

Chờ thay đổi trạng thái của quy trình con được đưa ra bởi PID ID quy trình và trả về một tuple chứa ID quy trình và chỉ báo trạng thái thoát, được mã hóa như để chờ []. Các tùy chọn phải là 0 cho hoạt động bình thường hoặc wnohang để tránh treo nếu không có trạng thái quy trình con ngay lập tức. Hàm này cũng có thể được sử dụng để thu thập thông tin về các quy trình con chỉ ngừng thực hiện vì một số lý do. Đặt các tùy chọn để thu thập thông tin từ một đứa trẻ khi nó tiếp tục hoạt động sau khi bị dừng thông qua kiểm soát công việc. Đặt các tùy chọn để tìm kiếm thông tin từ một đứa trẻ đã bị dừng, nhưng từ đó chưa có thông tin trạng thái nào được báo cáo. Wait3 [[Tùy chọn]]

Giống như waitpid [] ngoại trừ chức năng chờ thay đổi trong bất kỳ quy trình con nào. Trả về 3-Tuple [PID, Trạng thái, RUSAGE], trong đó PID là ID quy trình con, Trạng thái là mã trạng thái thoát và RUSAGE chứa thông tin sử dụng tài nguyên được trả về bởi Resource.getRusage []. Tham số tùy chọn có cùng ý nghĩa Đối với Waitpid []. Wait4 [PID, Tùy chọn]

Giống như Waitpid [] ngoại trừ kết quả trả về có cùng bộ thuật được trả về bởi Wait3 []. Các chức năng sau đây có mã trạng thái quy trình được trả về bởi WaitPid [], Wait3 [] hoặc Wait4 [] và được sử dụng để kiểm tra trạng thái của quy trình [UNIX]. Wcoredump [trạng thái]

Trả về true nếu quá trình bỏ lõi. Widexited [trạng thái]

Trả về một biến cấu hình hệ thống có giá trị chuỗi. Tên là một chuỗi chỉ định tên của biến. Các tên có thể chấp nhận được là dành riêng cho nền tảng, nhưng một từ điển của các tên đã biết cho hệ thống máy chủ được tìm thấy trong OS.confstr_names. Nếu giá trị cấu hình cho một tên được chỉ định không được xác định, chuỗi trống sẽ được trả về. Nếu tên không rõ, valueError sẽ được nâng lên. Oserror cũng có thể được nâng lên nếu hệ thống máy chủ không hỗ trợ tên cấu hình. Các tham số được trả về bởi chức năng này chủ yếu liên quan đến môi trường xây dựng trên máy chủ và bao gồm các đường dẫn của các tiện ích hệ thống, các tùy chọn trình biên dịch cho các cấu hình chương trình khác nhau [ví dụ: ví dụ: , Hỗ trợ 32 bit, 64 bit và tệp lớn] và các tùy chọn liên kết [UNIX]. GetLoadAvg []

Trả về một 3-tuple chứa số lượng mục trung bình trong hệ thống chạy trong số 1, 5 và 15 phút [UNIX] cuối cùng. sysconf [tên]

Trả về một biến cấu hình hệ thống có giá trị nguyên. Tên là một chuỗi chỉ định tên của biến. Các tên được xác định trên hệ thống máy chủ có thể được tìm thấy trong từ điển Os.SysConf_Names. Trả về -1 nếu tên cấu hình được biết nhưng giá trị không được xác định. Nếu không, một giá trịerror hoặc Oserror có thể được nâng lên. Một số hệ thống có thể xác định hơn 100 tham số hệ thống khác nhau. Tuy nhiên, danh sách sau đây chi tiết các tham số được xác định bởi POSIX.1 nên có sẵn trên hầu hết các hệ thống Unix: tham số

Sự mô tả

"SC_ARG_MAX" "SC_CHILD_MAX" "SC_CLK_TCK" "SC_NGLOUPS_MAX" "SC_STREAM_MAX"

Độ dài tối đa của các đối số có thể được sử dụng với Exec []. Số lượng quy trình tối đa cho mỗi ID người dùng. Số lượng ve đồng hồ mỗi giây. Số lượng tối đa của ID nhóm bổ sung đồng thời. Số lượng luồng tối đa mà một quá trình có thể mở cùng một lúc.

F

H lib

fl

B

d

ff

396

Chương 19 Dịch vụ hệ điều hành

Tham số

Sự mô tả

"SC_ARG_MAX" "SC_CHILD_MAX" "SC_CLK_TCK" "SC_NGLOUPS_MAX" "SC_STREAM_MAX"

Độ dài tối đa của các đối số có thể được sử dụng với Exec []. Số lượng quy trình tối đa cho mỗi ID người dùng. Số lượng ve đồng hồ mỗi giây. Số lượng tối đa của ID nhóm bổ sung đồng thời. Số lượng luồng tối đa mà một quá trình có thể mở cùng một lúc.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

Tham số

"SC_TZNAME_MAX" "SC_OPEN_MAX" "SC_JOB_CONTROL" "SC_SAVED_IDS"

Số lượng byte tối đa trong tên múi giờ. Số lượng tệp tối đa Một quá trình có thể mở cùng một lúc. Hệ thống hỗ trợ kiểm soát công việc. Cho biết liệu mỗi quá trình có một ID người dùng được lưu và ID nhóm đã lưu hay không.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

397

Tham số

"SC_TZNAME_MAX" "SC_OPEN_MAX" "SC_JOB_CONTROL" "SC_SAVED_IDS"

Số lượng byte tối đa trong tên múi giờ. Số lượng tệp tối đa Một quá trình có thể mở cùng một lúc. Hệ thống hỗ trợ kiểm soát công việc. Cho biết liệu mỗi quá trình có một ID người dùng được lưu và ID nhóm đã lưu hay không.

Urandom [n]

Trả về một chuỗi chứa n byte ngẫu nhiên được tạo bởi hệ thống [ví dụ: /dev /urandom trên unix]. Các byte được trả về phù hợp cho mật mã.

Các ngoại lệ Mô -đun HĐH xác định một ngoại lệ duy nhất để biểu thị lỗi. lỗi

Trả về kích thước tệp trong byte. isabs [đường dẫn]

Trả về đúng nếu đường dẫn là một tên đường dẫn tuyệt đối [bắt đầu bằng một dấu gạch chéo]. isfile [đường dẫn]

Trả về đúng nếu đường dẫn là một tệp thông thường. Hàm này tuân theo các liên kết tượng trưng, ​​do đó cả isLink [] và isfile [] có thể đúng cho cùng một đường dẫn. ISDIR [đường dẫn]

Trả về đúng nếu đường dẫn là một thư mục. Theo các liên kết tượng trưng. isLink [đường dẫn]

Trả về đúng nếu đường dẫn đề cập đến một liên kết tượng trưng. Trả về sai nếu các liên kết tượng trưng không được hỗ trợ. ismount [đường dẫn]

Trả về đúng nếu đường dẫn là một điểm gắn kết. tham gia [path2 [, path2 [, ...]]]]

Thông minh tham gia một hoặc nhiều thành phần đường dẫn vào một tên đường dẫn. Ví dụ: tham gia ['Trang chủ', 'Beazley', 'Python'] trả lại 'Trang chủ/Beazley/Python'. Lexists [Path]

Trả về đúng nếu đường dẫn tồn tại. Trả về đúng cho tất cả các liên kết tượng trưng, ​​ngay cả khi liên kết bị hỏng.

F

H lib

fl

B

d

ff

398

Chương 19 Dịch vụ hệ điều hành

Vỏ [đường dẫn]

Bình thường hóa trường hợp của một tên đường dẫn. Trên các hệ thống tệp không nhạy cảm với trường hợp, điều này chuyển đổi đường dẫn thành chữ thường. Trên Windows, dấu gạch chéo về phía trước cũng được chuyển đổi thành dấu gạch chéo ngược. Normpet [đường dẫn]

Bình thường hóa một tên đường dẫn. Điều này thu gọn các dấu phân cách dự phòng và các tài liệu tham khảo cấp độ lên để 'a // b', 'a /./ b' và 'a/foo /../ b' tất cả đều trở thành 'a/b'. Trên Windows, dấu gạch chéo phía trước được chuyển đổi thành dấu gạch chéo ngược. RealPath [Path]

Trả về đường dẫn thực sự, loại bỏ các liên kết tượng trưng nếu có [UNIX]. relpath [đường dẫn [, bắt đầu]]

Trả về một đường dẫn tương đối đến đường dẫn từ thư mục làm việc hiện tại. Bắt đầu có thể được cung cấp để chỉ định một thư mục bắt đầu khác nhau. giống như [path2, path2]

Trả về true nếu path2 và path2 đề cập đến cùng một tệp hoặc thư mục [unix]. SameOpenFile [FP1, FP2]

Trả về true nếu các đối tượng tệp mở FP1 và FP2 đề cập đến cùng một tệp [UNIX]. Samestat [STAT1, STAT2]

Trả về đúng nếu các bộ dữ liệu Stat Stat1 và Stat2 được trả về bởi fstat [], lstat [] hoặc stat [] tham khảo cùng một tệp [unix]. Chia [đường dẫn]

Chia đường dẫn vào một cặp [đầu, đuôi], trong đó đuôi là thành phần đường dẫn cuối cùng và đầu là tất cả mọi thứ dẫn đến điều đó. Ví dụ: '/home/user/foo' được chia thành ['/home/user', 'foo']. Tuple này giống như sẽ được trả về bởi [dirname [], basename []]. SplitDrive [Path]

Chia đường dẫn vào một cặp [ổ đĩa, tên tệp] trong đó ổ đĩa là đặc tả ổ đĩa hoặc chuỗi trống. Ổ đĩa luôn là chuỗi trống trên máy mà không có thông số kỹ thuật của ổ đĩa. splitext [đường dẫn]

Chia một tên đường dẫn vào một tên tệp cơ sở và hậu tố. Ví dụ: splitext ['foo.txt'] trả về ['foo', '.txt']. Sắp xếp [đường dẫn]

Chia một tên đường dẫn thành một cặp [UNC, phần còn lại] trong đó UNC là một điểm gắn kết UNC [quy ước đặt tên phổ quát] và nghỉ ngơi phần còn lại của đường dẫn [Windows]. Hỗ trợ_unicode_filenames

Biến được đặt thành true nếu hệ thống tệp cho phép tên tệp unicode.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

399

Vỏ [đường dẫn]

Bình thường hóa trường hợp của một tên đường dẫn. Trên các hệ thống tệp không nhạy cảm với trường hợp, điều này chuyển đổi đường dẫn thành chữ thường. Trên Windows, dấu gạch chéo về phía trước cũng được chuyển đổi thành dấu gạch chéo ngược. Normpet [đường dẫn]

Bình thường hóa một tên đường dẫn. Điều này thu gọn các dấu phân cách dự phòng và các tài liệu tham khảo cấp độ lên để 'a // b', 'a /./ b' và 'a/foo /../ b' tất cả đều trở thành 'a/b'. Trên Windows, dấu gạch chéo phía trước được chuyển đổi thành dấu gạch chéo ngược. RealPath [Path]

Trả về đường dẫn thực sự, loại bỏ các liên kết tượng trưng nếu có [UNIX]. relpath [đường dẫn [, bắt đầu]]

Trả về một đường dẫn tương đối đến đường dẫn từ thư mục làm việc hiện tại. Bắt đầu có thể được cung cấp để chỉ định một thư mục bắt đầu khác nhau. giống như [path2, path2]

Trả về true nếu path2 và path2 đề cập đến cùng một tệp hoặc thư mục [unix]. SameOpenFile [FP1, FP2]

Trả về true nếu các đối tượng tệp mở FP1 và FP2 đề cập đến cùng một tệp [UNIX]. Samestat [STAT1, STAT2]

Trả về đúng nếu các bộ dữ liệu Stat Stat1 và Stat2 được trả về bởi fstat [], lstat [] hoặc stat [] tham khảo cùng một tệp [unix]. Chia [đường dẫn]

Đặt bộ hẹn giờ bên trong để tạo tín hiệu sau vài giây và liên tục sau đó mỗi giây. Cả hai tham số này được chỉ định là số điểm nổi. Tham số nào là một trong những ITIMER_REAL, ITIMER_VIRTUAL hoặc ITIMER_PROF. Sự lựa chọn xác định tín hiệu nào được tạo sau khi hết thời gian. Sigalrm được tạo cho itimer_real, sigvtalrm được tạo cho

F

H lib

fl

B

d

ff

400

Chương 19 Dịch vụ hệ điều hành

Itimer_virtual và sigprof được tạo cho itimer_prof. Đặt giây thành 0 để xóa bộ hẹn giờ. Trả về một tuple [giây, khoảng thời gian] với các cài đặt trước đó của

hẹn giờ. Siginterrupt [SignalNum, Flag]

Đặt hành vi khởi động lại cuộc gọi hệ thống cho một số tín hiệu nhất định. Nếu cờ là sai, các cuộc gọi hệ thống bị gián đoạn bởi tín hiệu tín hiệu sẽ được tự động khởi động lại. Nếu đặt đúng, cuộc gọi hệ thống sẽ bị gián đoạn. Một cuộc gọi hệ thống bị gián đoạn thường sẽ dẫn đến ngoại lệ oserror hoặc ioerror trong đó số lỗi liên quan được đặt thành errno.eintr hoặc errno.eagain. Tín hiệu [SignalNum, Handler]

Đặt bộ xử lý tín hiệu cho tín hiệu tín hiệu cho trình xử lý hàm. Handler phải là một đối tượng Python có thể gọi được lấy hai đối số: số tín hiệu và đối tượng khung. SIG_IGN hoặc SIG_DFL cũng có thể được đưa ra để bỏ qua tín hiệu hoặc sử dụng trình xử lý tín hiệu mặc định, tương ứng. Giá trị trả về là trình xử lý tín hiệu trước đó, sig_ign hoặc sig_dfl. Khi các luồng được bật, chức năng này chỉ có thể được gọi từ luồng chính. Nếu không, một ngoại lệ giá trị được nâng lên. Các tín hiệu riêng lẻ được xác định bằng cách sử dụng các hằng số biểu tượng của biểu mẫu SIG*. Tên này tương ứng với các giá trị số nguyên là các giá trị cụ thể của máy

Sự mô tả

Sigabrt sigalrm sigbus sigchld sigcld sigcont sigfpe Sighup sigill sigint sigio sigiot sarkill sigpipe

Kết thúc bất thường Báo động Bus Lỗi thay đổi trong thay đổi trạng thái trẻ em trong tình trạng trẻ em Tiếp tục lỗi dấu phẩy Chấm dứt phần cứng phần cứng đầu cuối dừng ký tự điều khiển tty

Sigquit Sigsegv Sigstop Sigterm SigTrap SigTStp Sigttin

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

Itimer_virtual và sigprof được tạo cho itimer_prof. Đặt giây thành 0 để xóa bộ hẹn giờ. Trả về một tuple [giây, khoảng thời gian] với các cài đặt trước đó của

Sự mô tả

Sigabrt sigalrm sigbus sigchld sigcld sigcont sigfpe Sighup sigill sigint sigio sigiot sarkill sigpipe

Kết thúc bất thường Báo động Bus Lỗi thay đổi trong thay đổi trạng thái trẻ em trong tình trạng trẻ em Tiếp tục lỗi dấu phẩy Chấm dứt phần cứng phần cứng đầu cuối dừng ký tự điều khiển tty

Sigquit Sigsegv Sigstop Sigterm SigTrap SigTStp Sigttin

401

dấu hiệu

Sự mô tả

Sigabrt sigalrm sigbus sigchld sigcld sigcont sigfpe Sighup sigill sigint sigio sigiot sarkill sigpipe

Kết thúc bất thường Báo động Bus Lỗi thay đổi trong thay đổi trạng thái trẻ em trong tình trạng trẻ em Tiếp tục lỗi dấu phẩy Chấm dứt phần cứng phần cứng đầu cuối dừng ký tự điều khiển tty

Sigquit Sigsegv Sigstop Sigterm SigTrap SigTStp Sigttin

dấu hiệu

Tên tín hiệu

Sigttou sigurg sigusr1 sigusr2

Tên tín hiệu

Sigttou sigurg sigusr1 sigusr2

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

402

Sigttou sigurg sigusr1 sigusr2

Sigttou sigurg sigusr1 sigusr2

Kiểm soát điều kiện khẩn cấp tty Người dùng xác định Người dùng xác định Người dùng Xác định Thời gian ảo Kích thước cửa sổ Thay đổi CPU Giới hạn vượt quá giới hạn kích thước tệp

Bộ xử lý phụ Mô -đun phụ chứa các hàm và đối tượng khái quát hóa nhiệm vụ tạo các quy trình mới, kiểm soát các luồng đầu vào và đầu ra và xử lý mã trả về. Mô -đun tập trung chức năng chứa trong một loạt các mô -đun khác như OS, Popen2 và các lệnh. Popen [args, ** parms]

Thực thi một lệnh mới như một quy trình con và trả về một đối tượng popen đại diện cho quy trình mới. Lệnh được chỉ định trong Args là một chuỗi, chẳng hạn như 'ls -l' hoặc dưới dạng danh sách các chuỗi, chẳng hạn như ['ls', '-l']. PARMS đại diện cho một tập hợp các đối số từ khóa có thể được đặt để kiểm soát các thuộc tính khác nhau của quy trình con. Các tham số từ khóa sau đây được hiểu: Từ khóa

Sự mô tả

bufsize

Chỉ định hành vi đệm, trong đó 0 không được bảo vệ, 1 được đệm dòng, giá trị âm sử dụng mặc định hệ thống và các giá trị dương khác chỉ định kích thước bộ đệm gần đúng. Giá trị mặc định là 0. Nếu đúng, tất cả các mô tả tệp ngoại trừ 0, 1 và 2 được đóng trước khi thực hiện quy trình con. Giá trị mặc định là sai. Chỉ định cờ tạo quá trình trên Windows. Cờ duy nhất hiện có là created_new_console. Giá trị mặc định là 0. Thư mục trong đó lệnh sẽ thực thi. Thư mục hiện tại của quá trình con được thay đổi thành CWD trước khi thực hiện. Giá trị mặc định là không có, sử dụng thư mục hiện tại của quy trình cha. Từ điển của các biến môi trường cho quy trình mới. Giá trị mặc định là không có, sử dụng các biến môi trường của quy trình cha. Chỉ định tên của chương trình thực thi để sử dụng. Điều này hiếm khi cần thiết bởi vì tên chương trình đã được bao gồm trong Args. Nếu shell đã được đưa ra, tham số này chỉ định tên của shell sẽ sử dụng. Giá trị mặc định là không có. Chỉ định một hàm sẽ được gọi trong quy trình con ngay trước khi lệnh được thực thi. Hàm không có đối số. Nếu đúng, lệnh được thực thi bằng cách sử dụng shell unix như hàm os.system []. Shell mặc định là /bin /sh, nhưng điều này có thể được thay đổi bằng cách đặt thực thi. Giá trị mặc định của shell là không có.

Close_fds Creation_flags

CWD

Env

thực thi

preexec_fn

vỏ bọc

F

H lib

fl

B

d

ff

quá trình phụ

Từ khóa

403

Sự mô tả

bufsize

Chỉ định hành vi đệm, trong đó 0 không được bảo vệ, 1 được đệm dòng, giá trị âm sử dụng mặc định hệ thống và các giá trị dương khác chỉ định kích thước bộ đệm gần đúng. Giá trị mặc định là 0. Nếu đúng, tất cả các mô tả tệp ngoại trừ 0, 1 và 2 được đóng trước khi thực hiện quy trình con. Giá trị mặc định là sai. Chỉ định cờ tạo quá trình trên Windows. Cờ duy nhất hiện có là created_new_console. Giá trị mặc định là 0. Thư mục trong đó lệnh sẽ thực thi. Thư mục hiện tại của quá trình con được thay đổi thành CWD trước khi thực hiện. Giá trị mặc định là không có, sử dụng thư mục hiện tại của quy trình cha. Từ điển của các biến môi trường cho quy trình mới. Giá trị mặc định là không có, sử dụng các biến môi trường của quy trình cha. Chỉ định tên của chương trình thực thi để sử dụng. Điều này hiếm khi cần thiết bởi vì tên chương trình đã được bao gồm trong Args. Nếu shell đã được đưa ra, tham số này chỉ định tên của shell sẽ sử dụng. Giá trị mặc định là không có. Chỉ định một hàm sẽ được gọi trong quy trình con ngay trước khi lệnh được thực thi. Hàm không có đối số. Nếu đúng, lệnh được thực thi bằng cách sử dụng shell unix như hàm os.system []. Shell mặc định là /bin /sh, nhưng điều này có thể được thay đổi bằng cách đặt thực thi. Giá trị mặc định của shell là không có.

Close_fds Creation_flags

CWD

Env

thực thi

preexec_fn

Gửi tín hiệu đến quy trình con. Tín hiệu là số tín hiệu như được định nghĩa trong mô -đun tín hiệu. Trên Windows, tín hiệu được hỗ trợ duy nhất là Sigterm.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

404

p.erminate []

Chấm dứt quy trình con bằng cách gửi tín hiệu Sigterm trên UNIX hoặc gọi hàm chấm dứt API Win32 trên Windows. p.wait []

Chờ P chấm dứt và trả về mã trả lại. P.Pid

Xử lý ID của quá trình trẻ em. P.ReturnCode

Mã trả lại số của quá trình. Nếu không có, quá trình chưa chấm dứt. Nếu âm, nó chỉ ra quá trình đã bị chấm dứt bởi tín hiệu [UNIX]. P.Stdin, P.Stdout, P.Stderr

Ba thuộc tính này được đặt để mở các đối tượng tệp bất cứ khi nào luồng I/O tương ứng được mở dưới dạng đường ống [ví dụ: đặt đối số stdout trong popen [] thành đường ống]. Các đối tượng tệp này được cung cấp để đường ống có thể được kết nối với Các quy trình phụ khác. Các thuộc tính này được đặt thành không có nếu các đường ống không được sử dụng.

Ví dụ # Thực hiện một lệnh hệ thống cơ bản. Giống như OS.System [] ret = SubProcess.Call ["ls -l", shell = true] Mở ["/dev/null"]] ] # Thực thi lệnh, nhưng gửi đầu vào và nhận đầu ra p = subprocess.popen ["wc", shell = true Giao tiếp [s] # Gửi chuỗi S đến quy trình # Tạo hai quy trình con và liên kết chúng với nhau thông qua ống p1 = subprocess.popen ["ls -l", shell = true, stdout = subprocess.pipe] "WC", shell = true, stdin = p1.stdout, stdout = subprocess.pipe] out = p2.stdout.read []

Ghi chú n

Theo nguyên tắc chung, tốt hơn là cung cấp dòng lệnh làm danh sách các chuỗi thay vì một chuỗi duy nhất với lệnh shell [ví dụ: ['wc', 'tên tệp'] thay vì 'tên tệp wc']. Trên nhiều hệ thống, thông thường các tên tệp bao gồm các ký tự và không gian vui nhộn [ví dụ: tài liệu và cài đặt của Google trên Windows]. Nếu bạn gắn bó với việc cung cấp các đối số lệnh làm danh sách, mọi thứ sẽ hoạt động bình thường. Nếu bạn cố gắng tạo ra một lệnh shell, bạn sẽ phải thực hiện các bước bổ sung để đảm bảo các ký tự và không gian đặc biệt được thoát ra đúng.

F

H lib

fl

B

d

ff

Chương 19 Dịch vụ hệ điều hành

p.erminate []

p.erminate []

405

Chấm dứt quy trình con bằng cách gửi tín hiệu Sigterm trên UNIX hoặc gọi hàm chấm dứt API Win32 trên Windows. p.wait []

Chờ P chấm dứt và trả về mã trả lại. P.Pid

Xử lý ID của quá trình trẻ em. P.ReturnCode

Mã trả lại số của quá trình. Nếu không có, quá trình chưa chấm dứt. Nếu âm, nó chỉ ra quá trình đã bị chấm dứt bởi tín hiệu [UNIX]. P.Stdin, P.Stdout, P.Stderr

Ba thuộc tính này được đặt để mở các đối tượng tệp bất cứ khi nào luồng I/O tương ứng được mở dưới dạng đường ống [ví dụ: đặt đối số stdout trong popen [] thành đường ống]. Các đối tượng tệp này được cung cấp để đường ống có thể được kết nối với Các quy trình phụ khác. Các thuộc tính này được đặt thành không có nếu các đường ống không được sử dụng.

Ví dụ # Thực hiện một lệnh hệ thống cơ bản. Giống như OS.System [] ret = SubProcess.Call ["ls -l", shell = true] Mở ["/dev/null"]] ] # Thực thi lệnh, nhưng gửi đầu vào và nhận đầu ra p = subprocess.popen ["wc", shell = true Giao tiếp [s] # Gửi chuỗi S đến quy trình # Tạo hai quy trình con và liên kết chúng với nhau thông qua ống p1 = subprocess.popen ["ls -l", shell = true, stdout = subprocess.pipe] "WC", shell = true, stdin = p1.stdout, stdout = subprocess.pipe] out = p2.stdout.read []

Ghi chú n

Theo nguyên tắc chung, tốt hơn là cung cấp dòng lệnh làm danh sách các chuỗi thay vì một chuỗi duy nhất với lệnh shell [ví dụ: ['wc', 'tên tệp'] thay vì 'tên tệp wc']. Trên nhiều hệ thống, thông thường các tên tệp bao gồm các ký tự và không gian vui nhộn [ví dụ: tài liệu và cài đặt của Google trên Windows]. Nếu bạn gắn bó với việc cung cấp các đối số lệnh làm danh sách, mọi thứ sẽ hoạt động bình thường. Nếu bạn cố gắng tạo ra một lệnh shell, bạn sẽ phải thực hiện các bước bổ sung để đảm bảo các ký tự và không gian đặc biệt được thoát ra đúng.

thời gian

N

F

H lib

fl

B

d

ff

406

Chương 19 Dịch vụ hệ điều hành

p.erminate []

Chấm dứt quy trình con bằng cách gửi tín hiệu Sigterm trên UNIX hoặc gọi hàm chấm dứt API Win32 trên Windows. p.wait []

Giá trị

TM_YEAR TM_MON TM_MDAY TM_HOUR TM_MIN TM_SEC TM_WDAY TM_YDAY TM_ISDST

Giá trị bốn chữ số như 1998 1-12 1-31 0-23 0-59 0-61 0-6 [0 = Thứ Hai] 1-366 -1, 0, 1

Thuộc tính TM_ISDST là 1 nếu DST có hiệu lực, 0 nếu không và -1 nếu không có thông tin. Nếu Secs bị bỏ qua hoặc không có, thời gian hiện tại được sử dụng. Đối với khả năng tương thích ngược, đối tượng Struct_time được trả về cũng hoạt động giống như 9-tuple chứa các giá trị thuộc tính trước theo cùng thứ tự như được liệt kê. giờ địa phương [[giây]]

Trả về một đối tượng struct_time như với gmtime [], nhưng tương ứng với múi giờ cục bộ. Nếu Secs bị bỏ qua hoặc không có, thời gian hiện tại được sử dụng. Mktime [Tuple]

Hàm này có một đối tượng hoặc bộ tple struct_time đại diện cho một thời gian trong múi giờ cục bộ [ở cùng định dạng được trả về bởi localtime []] và trả về một số điểm nổi đại diện cho số giây kể từ thời đại. Một ngoại lệ của Overflowerror được nâng lên nếu giá trị đầu vào không phải là thời điểm hợp lệ. Ngủ [Secs]

Đặt quy trình hiện tại vào giấc ngủ trong giây giây. SECS là một số điểm nổi. Strftime [định dạng [, TM]]

Chuyển đổi một đối tượng struct_time TM biểu thị thời gian được trả về bởi gmtime [] hoặc localtime [] thành một chuỗi [để tương thích ngược, TM cũng có thể là một tuple đại diện cho giá trị thời gian]. Định dạng là một chuỗi định dạng trong đó các mã định dạng sau có thể được nhúng: Chỉ thị

Nghĩa

%a %a %b %b %c %d %h

Tên của Locale Tên tuần trong tuần của Locale Tên trong tuần của Locale Tên Tháng tên của Locale Tên đầy đủ của Locale Ngày đại diện ngày và thời gian thích hợp trong tháng là số thập phân [01-31] ​​giờ [đồng hồ 24 giờ] là số thập phân [00-23 ]

F

H lib

fl

B

d

ff

thời gian

Chỉ thị

Nghĩa

%a %a %b %b %c %d %h

Tên của Locale Tên tuần trong tuần của Locale Tên trong tuần của Locale Tên Tháng tên của Locale Tên đầy đủ của Locale Ngày đại diện ngày và thời gian thích hợp trong tháng là số thập phân [01-31] ​​giờ [đồng hồ 24 giờ] là số thập phân [00-23 ]

F

407

H lib

fl

B

d

ff

thời gian

F

H lib

fl

B

d

ff

thời gian

408

Chỉ thị

%I %j %m %m

Giờ [đồng hồ 12 giờ] là một số thập phân [01-12] ngày trong năm dưới dạng số thập phân [001-366] tháng dưới dạng số thập phân [01-12] phút như một số thập phân [00-59] Tương đương với số giây AM hoặc PM dưới dạng số thập phân [00-61] số tuần của năm [00-53] [Chủ nhật là ngày đầu tiên] trong tuần là số thập phân [0-6] [0 = Chủ nhật] Số tuần Năm [thứ Hai là ngày đầu tiên] ngày đại diện cho năm đại diện địa phương của địa phương năm không có thế kỷ như một số thập phân [00-99] với thế kỷ như một tên múi giờ số thập phân [hoặc không có ký tự nếu không có múi giờ] % tính cách

%p %s %u %w %w %x %x %y %y %z %%

Các mã định dạng có thể bao gồm chiều rộng và độ chính xác theo cách tương tự như được sử dụng với toán tử % trên chuỗi. ValueError được nâng lên nếu bất kỳ trường Tuple nằm ngoài phạm vi. Nếu tuple bị bỏ qua, thời gian tương ứng với thời gian hiện tại được sử dụng. Strptime [Chuỗi [, định dạng]]

Đóng một khóa đăng ký đã mở trước đó với khóa xử lý. Connectologistry [máy tính_name, khóa]

Trả về một tay cầm cho khóa đăng ký được xác định trước trên máy tính khác. Computer_name là tên của máy từ xa dưới dạng chuỗi của \ computerame. Nếu máy tính_name không có, sổ đăng ký cục bộ được sử dụng. Khóa là một tay cầm được xác định trước như người dùng HKEY_CILRENT_USER hoặc HKEY_. Tăng Môi trường HER

HKEY_CLASSES_ROOT

N

HKEY_CURRENT_CONFIG

N

HKEY_CURRENT_CONFIG

N

HKEY_CURRENT_CONFIG

N

HKEY_CURRENT_CONFIG

N

HKEY_CURRENT_CONFIG

N

HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER

HKEY_DYN_DATA

HKEY_LOCAL_MACHINE

HKEY_PERFORMCE_DATA

HKEY_USERS

CreatedKey [khóa, sub_key]

Tạo hoặc mở một khóa và trả về một tay cầm. Khóa là khóa được mở trước đó hoặc khóa được xác định trước được xác định bởi hằng số HKEY_*. Sub_Key là tên của khóa sẽ được mở hoặc tạo. Nếu khóa là khóa được xác định trước, sub_key có thể không có, trong trường hợp đó, khóa được trả về.

F

H lib

409

fl

B

d

ff

Winreg

Xóa [khóa, sub_key]

Xóa sub_key. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. sub_key là một chuỗi xác định khóa để xóa. sub_key không được có bất kỳ máy phụ nào; Nếu không, Môi trường Hàng hóa được nuôi dưỡng. XóaValue [khóa, giá trị]

Xóa một giá trị được đặt tên khỏi khóa đăng ký. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. Giá trị là một chuỗi chứa tên của giá trị để xóa. Enumey [Key, Index]

Trả về tên của một subkey theo chỉ mục. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. Chỉ mục là một số nguyên chỉ định khóa để truy xuất. Nếu chỉ số nằm ngoài phạm vi, một môi trường có thể được nâng lên. EnumValue [Key, Index]

Trả về một giá trị của một khóa mở. Khóa là khóa mở hoặc hằng số hkey_* được xác định trước. Chỉ mục là một số nguyên chỉ định giá trị để truy xuất. Hàm trả về một tuple [tên, dữ liệu, loại] trong tên là tên giá trị, dữ liệu là một đối tượng giữ dữ liệu giá trị và loại là một số nguyên chỉ định loại của loại của Dữ liệu giá trị. Các mã loại sau đây hiện đang được xác định: Mã

Sự mô tả

Reg_binary reg_dword reg_dword_little_endian reg_dword_big_endian reg_expand_sz

Dữ liệu nhị phân 32 bit Số 32 bit Little-endian Số 32 bit ở định dạng lớn Chuỗi kết thúc null với các tham chiếu chưa được giới thiệu về các biến môi trường -Kết thúc chuỗi

HKEY_LOCAL_MACHINE

HKEY_PERFORMCE_DATA

HKEY_USERS

CreatedKey [khóa, sub_key]

Tạo hoặc mở một khóa và trả về một tay cầm. Khóa là khóa được mở trước đó hoặc khóa được xác định trước được xác định bởi hằng số HKEY_*. Sub_Key là tên của khóa sẽ được mở hoặc tạo. Nếu khóa là khóa được xác định trước, sub_key có thể không có, trong trường hợp đó, khóa được trả về.

F

410

H lib

fl

B

d

N

ff

N

Winreg

N

Xóa [khóa, sub_key]

N

Xóa sub_key. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. sub_key là một chuỗi xác định khóa để xóa. sub_key không được có bất kỳ máy phụ nào; Nếu không, Môi trường Hàng hóa được nuôi dưỡng. XóaValue [khóa, giá trị]

N

Xóa một giá trị được đặt tên khỏi khóa đăng ký. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. Giá trị là một chuỗi chứa tên của giá trị để xóa. Enumey [Key, Index]

N

Trả về tên của một subkey theo chỉ mục. Khóa là khóa mở hoặc một trong các hằng số HKEY_* được xác định trước. Chỉ mục là một số nguyên chỉ định khóa để truy xuất. Nếu chỉ số nằm ngoài phạm vi, một môi trường có thể được nâng lên. EnumValue [Key, Index]

N

Trả về một giá trị của một khóa mở. Khóa là khóa mở hoặc hằng số hkey_* được xác định trước. Chỉ mục là một số nguyên chỉ định giá trị để truy xuất. Hàm trả về một tuple [tên, dữ liệu, loại] trong tên là tên giá trị, dữ liệu là một đối tượng giữ dữ liệu giá trị và loại là một số nguyên chỉ định loại của loại của Dữ liệu giá trị. Các mã loại sau đây hiện đang được xác định: Mã

N

Sự mô tả

N

Reg_binary reg_dword reg_dword_little_endian reg_dword_big_endian reg_expand_sz

Dữ liệu nhị phân 32 bit Số 32 bit Little-endian Số 32 bit ở định dạng lớn Chuỗi kết thúc null với các tham chiếu chưa được giới thiệu về các biến môi trường -Kết thúc chuỗi

Reg_link reg_multi_sz reg_none reg_resource_list reg_sz

Mở rộng Môi trường

Mở rộng chuỗi môi trường của mẫu % tên % trong chuỗi unicode s. Flushkey [Key]

Trả về một tuple [giá trị, loại] chứa giá trị dữ liệu và loại cho một khóa. Khóa là một khóa mở hoặc hkey_* hằng số. value_name là tên của giá trị để trả về. Loại được trả về là một trong các mã số nguyên như được mô tả cho hàm enumValue []. SaveKey [khóa, tên tệp]

Lưu khóa và tất cả các phân nhóm của nó vào một tệp. Khóa là khóa mở hoặc hằng số hkey_* được xác định trước. Tên tệp không được tồn tại và không nên bao gồm tiện ích mở rộng tên tệp. Hơn nữa, người gọi phải có đặc quyền sao lưu để hoạt động thành công.

F

H lib

fl

B

d

ff

Winreg

411

SetValue [khóa, sub_key, loại, giá trị]

Đặt giá trị của một khóa. Khóa là một khóa mở hoặc hkey_* hằng số. sub_key là tên của subkey để liên kết giá trị. Loại là mã loại số nguyên, hiện bị giới hạn ở reg_sz. Giá trị là một chuỗi chứa dữ liệu giá trị. Nếu sub_key không tồn tại, nó sẽ được tạo ra. Khóa phải đã được mở với quyền truy cập key_set_value cho chức năng này thành công. SetValueEx [khóa, value_name, bảo lưu, loại, giá trị]

Đặt trường giá trị của một khóa. Khóa là khóa mở hoặc hằng số HKEY_*. value_name là tên của giá trị. Loại là mã loại số nguyên như được mô tả cho hàm enumValue []. Giá trị là một chuỗi chứa giá trị mới. Khi các giá trị của các loại số [ví dụ: reg_dword] đang được đặt, giá trị vẫn là một chuỗi chứa dữ liệu thô. Chuỗi này có thể được tạo bằng mô -đun cấu trúc. Dự trữ hiện đang bị bỏ qua và có thể được đặt thành bất cứ điều gì [giá trị không được sử dụng].

Ghi chú n

Các chức năng trả về đối tượng Windows HKEY Trả về đối tượng tay cầm đăng ký đặc biệt được mô tả bởi lớp pyhkey. Đối tượng này có thể được chuyển đổi thành giá trị tay cầm Windows bằng int []. Đối tượng này cũng có thể được sử dụng với giao thức quản lý ngữ cảnh để tự động đóng Ví dụ, tay cầm cơ bản

F

H lib

fl

B

d

ff

Winreg

F

H lib

fl

B

d

ff

Winreg

SetValue [khóa, sub_key, loại, giá trị]

Đặt giá trị của một khóa. Khóa là một khóa mở hoặc hkey_* hằng số. sub_key là tên của subkey để liên kết giá trị. Loại là mã loại số nguyên, hiện bị giới hạn ở reg_sz. Giá trị là một chuỗi chứa dữ liệu giá trị. Nếu sub_key không tồn tại, nó sẽ được tạo ra. Khóa phải đã được mở với quyền truy cập key_set_value cho chức năng này thành công. SetValueEx [khóa, value_name, bảo lưu, loại, giá trị]

F

h Lib

fL

B

d

ff

414

Chapter 20 Threads and Concurrency

When multiple processes or threads are used, the host operating system is responsible for scheduling their work.This is done by giving each process [or thread] a small time slice and rapidly cycling between all of the active tasks—giving each a portion of the available CPU cycles. For example, if your system had 10 active processes running, the operating system would allocate approximately 1/10th of its CPU time to each process and cycle between processes in rapid succession. On systems with more than one CPU core, the operating system can schedule processes so that each CPU is kept busy, executing processes in parallel. Writing programs that take advantage of concurrent execution is something that is intrinsically complicated. A major source of complexity concerns synchronization and access to shared data. In particular, attempts to update a data structure by multiple tasks at approximately the same time can lead to a corrupted and inconsistent program state [a problem formally known as a race condition].To fix these problems, concurrent programs must identify critical sections of code and protect them using mutual-exclusion locks and other similar synchronization primitives. For example, if different threads were trying to write data to the same file at the same time, you might use a mutual exclusion lock to synchronize their operation so that once one of the threads starts writing, the other threads have to wait until it has finished before they are allowed to start writing. The code for this scenario typically looks like this: write_lock = Lock[] ... # Critical section where writing occurs write_lock.acquire[] f.write["Here's some data.\n"] f.write["Here's more data.\n"] ... write_lock.release[]

There’s a joke attributed to Jason Whittington that goes as like this: “Why did the multithreaded chicken cross the road? to To other side. get the”.This joke typifies the kinds of problems that arise with task synchronization and concurrent programming. If you’re scratching your head saying, “I don’t get it,” then it might be wise to do a bit more reading before diving into the rest of this chapter.

Concurrent Programming and Python Python supports both message passing and thread-based concurrent programming on most systems. Although most programmers tend to be familiar with the thread interface, Python threads are actually rather restricted. Although minimally thread-safe, the Python interpreter uses an internal global interpreter lock [the GIL] that only allows a single Python thread to execute at any given moment.This restricts Python programs to run on a single processor regardless of how many CPU cores might be available on the system. Although the GIL is often a heated source of debate in the Python community, it is unlikely to be removed at any time in the foreseeable future. The presence of the GIL has a direct impact on how many Python programmers address concurrent programming problems. If an application is mostly I/O bound, it is generally fine to use threads because extra processors aren’t going to do much to help a program that spends most of its time waiting for events. For applications that involve heavy amounts of CPU processing, using threads to subdivide work doesn’t provide any benefit and will make the program run slower [often much slower than you would guess]. For this, you’ll want to rely on subprocesses and message passing.

F

h Lib

fL

B

d

ff

multiprocessing

415

Even when threads are used, many programmers find their scaling properties to be rather mysterious. For example, a threaded network server that works fine with 100 threads may have horrible performance if it’s scaled up to 10,000 threads. As a general rule, you really don’t want to be writing programs with 10,000 threads because each thread requires its own system resources and the overhead associated with thread context switching, locking, and other matters starts to become significant [not to mention the fact that all threads are constrained to run on a single CPU].To deal with this, it is somewhat common to see such applications restructured as asynchronous eventhandling systems. For example, a central event loop might monitor all of the I/O sources using the select module and dispatch asynchronous events to a large collection of I/O handlers.This is the basis for library modules such as asyncore as well as popular third-party modules such as Twisted [//twistedmatrix/com]. Looking forward, message passing is a concept that you should probably embrace for any kind of concurrent programming in Python. Even when working with threads, an often-recommended approach is to structure your application as a collection of independent threads that exchange data through message queues.This particular approach tends to be less error-prone because it greatly reduces the need to use locks and other synchronization primitives. Message passing also naturally extends into networking and distributed systems. For example, if part of a program starts out as a thread to which you send messages, that component can later be migrated to a separate process or onto a different machine by sending the messages over a network connection.The message passing abstraction is also tied to advanced Python features such as coroutines. For example, a coroutine is a function that can receive and processe messages that are sent to it. So, by embracing message passing, you will find that you can write programs that have a great deal of flexibility. The remainder of this chapter looks at different library modules for supporting concurrent programming. At the end, more detailed information on common programming idioms is provided.

Đa xử lý mô -đun đa xử lý cung cấp hỗ trợ cho việc khởi chạy các tác vụ trong quá trình phụ, truyền đạt và chia sẻ dữ liệu và thực hiện các hình thức đồng bộ hóa khác nhau. Giao diện lập trình có nghĩa là bắt chước giao diện lập trình cho các luồng trong mô -đun luồng. Tuy nhiên, không giống như các luồng, điều quan trọng là phải nhấn mạnh rằng các quy trình không có trạng thái được chia sẻ nào. Vì vậy, nếu một quy trình sửa đổi dữ liệu, sự thay đổi đó chỉ là cục bộ cho quá trình đó. Các tính năng của mô-đun đa xử lý là rất lớn, làm cho nó trở thành một trong những thư viện tích hợp lớn hơn và tiên tiến nhất. Bao gồm mọi chi tiết của mô -đun là không thể ở đây, nhưng các phần thiết yếu của nó cùng với các ví dụ sẽ được đưa ra. Các lập trình viên có kinh nghiệm sẽ có thể lấy các ví dụ và mở rộng chúng sang các vấn đề lớn hơn.

Các quy trình Tất cả các tính năng của mô -đun đa xử lý được tập trung vào các quy trình. Chúng được mô tả bởi lớp sau.

F

H lib

fl

B

d

ff

416

Chương 20 Chủ đề và đồng thời

Quy trình [[Nhóm [, Target [, Tên [, Args [, Kwargs]]]]]]]]]

Một lớp đại diện cho một nhiệm vụ chạy trong một quy trình con. Các đối số trong hàm tạo phải luôn được chỉ định bằng cách sử dụng các đối số từ khóa. Target là một đối tượng có thể gọi được sẽ thực thi khi quá trình bắt đầu, Args là một phần của các đối số vị trí được truyền cho Target và KWARGS là một từ điển của các đối số từ khóa được truyền đến Target. Nếu Args và Kwargs bị bỏ qua, Target được gọi không có đối số. Tên là một chuỗi đưa ra một tên mô tả cho quá trình. Nhóm không được sử dụng và luôn luôn được đặt thành không. Sự hiện diện của nó ở đây chỉ đơn giản là để xây dựng một quá trình bắt chước việc tạo ra một luồng trong mô -đun luồng. Một trường hợp P của quy trình có các phương thức sau: p.is_alive []

Trả về true nếu P vẫn đang chạy. P.Join [[thời gian chờ]]

Chờ quá trình P chấm dứt. Thời gian chờ chỉ định một khoảng thời gian chờ tùy chọn. Một quy trình có thể được tham gia nhiều lần như bạn muốn, nhưng đó là một lỗi cho một quy trình để thử và tham gia chính nó. p.run []

Phương pháp chạy khi quá trình bắt đầu. Theo mặc định, điều này gọi mục tiêu đã được truyền cho hàm tạo quy trình. Thay vào đó, một quy trình có thể được xác định bằng cách kế thừa từ quá trình và thực hiện lại chạy []. P.start []

Bắt đầu quá trình. Điều này khởi chạy quy trình con đại diện cho quá trình và gọi p.run [] trong quy trình con đó. p.erminate []

Kết thúc mạnh mẽ quá trình. Nếu điều này được gọi, quá trình P bị chấm dứt ngay lập tức mà không thực hiện bất kỳ loại hành động dọn dẹp nào. Nếu quá trình P tạo ra các quy trình con của riêng mình, các quy trình đó sẽ biến thành zombie. Một số quan tâm là bắt buộc khi sử dụng phương pháp này. Nếu P giữ khóa hoặc có liên quan đến giao tiếp giữa các quá trình, việc chấm dứt nó có thể gây bế tắc hoặc I/O bị hỏng. Một phiên bản quy trình P cũng có các thuộc tính dữ liệu sau: P.Authkey

Khóa xác thực quá trình. Trừ khi được thiết lập rõ ràng, đây là chuỗi 32 ký tự được tạo bởi Os.urandom []. Mục đích của khóa này là cung cấp bảo mật cho giao tiếp giữa các phương tiện cấp thấp liên quan đến các kết nối mạng. Các kết nối như vậy chỉ hoạt động nếu cả hai đầu có cùng một khóa xác thực. P.Daemon

Một lá cờ Boolean cho biết liệu quá trình này có phải là Daemonic hay không. Một quy trình daemon được tự động chấm dứt khi quá trình Python tạo ra nó chấm dứt. Ngoài ra, một quy trình daemon được cấm tự tạo ra các quy trình mới. Giá trị của P.Daemon phải được đặt trước khi một quá trình được bắt đầu bằng p.start [].

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

417

Quy trình [[Nhóm [, Target [, Tên [, Args [, Kwargs]]]]]]]]]

Một lớp đại diện cho một nhiệm vụ chạy trong một quy trình con. Các đối số trong hàm tạo phải luôn được chỉ định bằng cách sử dụng các đối số từ khóa. Target là một đối tượng có thể gọi được sẽ thực thi khi quá trình bắt đầu, Args là một phần của các đối số vị trí được truyền cho Target và KWARGS là một từ điển của các đối số từ khóa được truyền đến Target. Nếu Args và Kwargs bị bỏ qua, Target được gọi không có đối số. Tên là một chuỗi đưa ra một tên mô tả cho quá trình. Nhóm không được sử dụng và luôn luôn được đặt thành không. Sự hiện diện của nó ở đây chỉ đơn giản là để xây dựng một quá trình bắt chước việc tạo ra một luồng trong mô -đun luồng. Một trường hợp P của quy trình có các phương thức sau: p.is_alive []

Trả về true nếu P vẫn đang chạy. P.Join [[thời gian chờ]]

Chờ quá trình P chấm dứt. Thời gian chờ chỉ định một khoảng thời gian chờ tùy chọn. Một quy trình có thể được tham gia nhiều lần như bạn muốn, nhưng đó là một lỗi cho một quy trình để thử và tham gia chính nó. p.run []

Phương pháp chạy khi quá trình bắt đầu. Theo mặc định, điều này gọi mục tiêu đã được truyền cho hàm tạo quy trình. Thay vào đó, một quy trình có thể được xác định bằng cách kế thừa từ quá trình và thực hiện lại chạy []. P.start []

In both examples, the time should be printed by the subprocess every 15 seconds. It is important to emphasize that for cross-platform portability, new processes should only be created by the main program as shown. Although this is optional on UNIX, it is required on Windows. It should also be noted that on Windows, you will probably need to run the preceding examples in the command shell [command.exe] instead of a Python IDE, such as IDLE.

Interprocess Communication Two primary forms of interprocess communication are supported by the multiprocessing module: pipes and queues. Both methods are implemented using message passing. However, the queue interface is meant to mimic the use of queues commonly used with thread programs.

F

h Lib

fL

B

d

ff

418

Chapter 20 Threads and Concurrency

Queue[[maxsize]]

Creates a shared process queue. maxsize is the maximum number of items allowed in the queue. If omitted, there is no size limit.The underlying queue is implemented using pipes and locks. In addition, a support thread is launched in order to feed queued data into the underlying pipe. An instance q of Queue has the following methods: q.cancel_join_thread[]

Don’t automatically join the background thread on process exit.This prevents the join_thread[] method from blocking. q.close[]

Closes the queue, preventing any more data from being added to it.When this is called, the background thread will continue to write any queued data not yet written but will shut down as soon as this is complete.This method is called automatically if q is garbage-collected. Closing a queue does not generate any kind of end-of-data signal or exception in queue consumers. For example, if a consumer is blocking on a get[] operation, closing the queue in the producer does not cause the get[] to return with an error. q.empty[]

Returns True if q is empty at the time of the call. If other processes or threads are being used to add queue items, be aware that the result is not reliable [e.g., new items could have been added to the queue in between the time that the result is returned and used]. q.full[]

Returns True if q is full.The result is also not reliable due to threads [see q.empty[]]. q.get[[block [, timeout]]]

Returns an item from q. If q is empty, blocks until a queue item becomes available. block controls the blocking behavior and is True by default. If set to False, a Queue.Empty exception [defined in the Queue library module] is raised if the queue is empty. timeout is an optional timeout to use in blocking mode. If no items become available in the specified time interval, a Queue.Empty exception is raised. q.get_nowait[]

The same as q.get[False]. q.join_thread[]

Joins the queue’s background thread.This is used to wait for all queue items to be consumed after q.close[] has been called.This method gets called by default in all processes that are not the original creator of q.This behavior can be disabled by called q.cancel_join_thread[]. q.put[item [, block [, timeout]]]

Puts item onto the queue. If the queue is full, block until space becomes available. block controls the blocking behavior and is True by default. If set to False, a Queue.Full exception [defined in the Queue library module] is raised if the queue is full. timeout specifies how long to wait for space to become available in blocking mode. A Queue.Full exception is raised on timeout.

F

h Lib

fL

B

d

ff

multiprocessing

419

q.put_nowait[item]

The same as q.put[item, False]. q.qsize[]

Returns the approximate number of items currently in the queue.The result of this function is not reliable because items may have been added or removed from the queue in between the time the result is returned and later used in a program. On some systems, this method may raise an NotImplementedError. JoinableQueue[[maxsize]]

Creates a joinable shared process queue.This is just like a Queue except that the queue allows a consumer of items to notify the producer that the items have been successfully been processed.The notification process is implemented using a shared semaphore and condition variable. An instance q of JoinableQueue has the same methods as Queue, but it has the following additional methods: q.task_done[]

Used by a consumer to signal that an enqueued item returned by q.get[] has been processed. A ValueError exception is raised if this is called more times than have been removed from the queue. q.join[]

Used by a producer to block until all items placed in a queue have been processed.This blocks until q.task_done[] is called for every item placed into the queue. The following example shows how you set up a process that runs forever, consuming and processing items on a queue.The producer feeds items into the queue and waits for them to be processed. import multiprocessing def consumer[input_q]: while True: item = input_q.get[] # Process item print[item] # Replace with useful work # Signal task completion input_q.task_done[] def producer[sequence, output_q]: for item in sequence: # Put the item on the queue output_q.put[item] # Set up if _ _name_ _ == '_ _main_ _': q = multiprocessing.JoinableQueue[] # Launch the consumer process cons_p = multiprocessing.Process[target=consumer,args=[q,]] cons_p.daemon=True cons_p.start[] # Produce items. sequence represents a sequence of items to # be sent to the consumer. In practice, this could be the output

F

H lib

fl

B

d

ff

420

Chương 20 Chủ đề và đồng thời

# của một máy phát điện hoặc được sản xuất theo một số cách khác. Trình tự = [1,2,3,4] Nhà sản xuất [Trình tự, Q] # Đợi tất cả các mặt hàng được xử lý Q.Join []

Trong ví dụ này, quy trình người tiêu dùng được đặt thành Daemonic vì nó chạy mãi mãi và chúng tôi muốn nó chấm dứt khi chương trình chính kết thúc [nếu bạn quên điều này, chương trình sẽ bị treo]. Một người tham gia đang được sử dụng để nhà sản xuất thực sự biết khi nào tất cả các mặt hàng được đặt trong hàng đợi đã được xử lý thành công. Hoạt động tham gia [] đảm bảo điều này; Nếu bạn quên bước này, người tiêu dùng sẽ bị chấm dứt trước khi có thời gian để hoàn thành tất cả công việc của mình. Nếu muốn, nhiều quy trình có thể đặt và nhận các mục từ cùng một hàng đợi. Ví dụ: nếu bạn muốn có một nhóm các quy trình tiêu dùng, bạn chỉ có thể viết mã như thế này: nếu _ _name_ _ == '_ _main_ _': q = Multiprocessing.joinablequeue [] # khởi chạy một số quy trình tiêu dùng cons_p1 = đa xử lý. Quá trình [Target = Người tiêu dùng, ARGS = [Q,]] Cons_P1.Daemon = true Cons_P1.Start [] Cons_P2 = Multiprocessing.Process [Target = Người tiêu dùng, Args = [Q,]] # Sản xuất các mặt hàng. Trình tự đại diện cho một chuỗi các mục đến # được gửi cho người tiêu dùng. Trong thực tế, đây có thể là đầu ra của một máy phát điện hoặc được sản xuất theo một cách khác. Trình tự = [1,2,3,4] Nhà sản xuất [Trình tự, Q] # Đợi tất cả các mặt hàng được xử lý Q.Join []

Khi viết mã như thế này, hãy lưu ý rằng mọi mục được đặt vào hàng đợi đều được ngâm và gửi đến quy trình qua kết nối đường ống hoặc ổ cắm. Theo nguyên tắc chung, tốt hơn là gửi ít đối tượng lớn hơn nhiều đối tượng nhỏ. Trong một số ứng dụng nhất định, nhà sản xuất có thể muốn báo hiệu cho người tiêu dùng rằng sẽ không có thêm mặt hàng nào được sản xuất và họ nên tắt. Để làm điều này, bạn nên viết mã sử dụng Sentinel, một giá trị đặc biệt cho thấy hoàn thành. Dưới đây là một ví dụ minh họa khái niệm này bằng cách sử dụng không có làm Sentinel: Nhập Multiprocessing Def Consumer [input_q]: Trong khi true: item = input_q.get [] nếu mục không có: break # process print [mục] # Thay thế bằng công việc hữu ích # Shutdown Print ["Người tiêu dùng đã hoàn thành"] Nhà sản xuất def [trình tự, output_q]: Đối với mục trong chuỗi:

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

421

# của một máy phát điện hoặc được sản xuất theo một số cách khác. Trình tự = [1,2,3,4] Nhà sản xuất [Trình tự, Q] # Đợi tất cả các mặt hàng được xử lý Q.Join []

Trong ví dụ này, quy trình người tiêu dùng được đặt thành Daemonic vì nó chạy mãi mãi và chúng tôi muốn nó chấm dứt khi chương trình chính kết thúc [nếu bạn quên điều này, chương trình sẽ bị treo]. Một người tham gia đang được sử dụng để nhà sản xuất thực sự biết khi nào tất cả các mặt hàng được đặt trong hàng đợi đã được xử lý thành công. Hoạt động tham gia [] đảm bảo điều này; Nếu bạn quên bước này, người tiêu dùng sẽ bị chấm dứt trước khi có thời gian để hoàn thành tất cả công việc của mình. Nếu muốn, nhiều quy trình có thể đặt và nhận các mục từ cùng một hàng đợi. Ví dụ: nếu bạn muốn có một nhóm các quy trình tiêu dùng, bạn chỉ có thể viết mã như thế này: nếu _ _name_ _ == '_ _main_ _': q = Multiprocessing.joinablequeue [] # khởi chạy một số quy trình tiêu dùng cons_p1 = đa xử lý. Quá trình [Target = Người tiêu dùng, ARGS = [Q,]] Cons_P1.Daemon = true Cons_P1.Start [] Cons_P2 = Multiprocessing.Process [Target = Người tiêu dùng, Args = [Q,]] # Sản xuất các mặt hàng. Trình tự đại diện cho một chuỗi các mục đến # được gửi cho người tiêu dùng. Trong thực tế, đây có thể là đầu ra của một máy phát điện hoặc được sản xuất theo một cách khác. Trình tự = [1,2,3,4] Nhà sản xuất [Trình tự, Q] # Đợi tất cả các mặt hàng được xử lý Q.Join []

Khi viết mã như thế này, hãy lưu ý rằng mọi mục được đặt vào hàng đợi đều được ngâm và gửi đến quy trình qua kết nối đường ống hoặc ổ cắm. Theo nguyên tắc chung, tốt hơn là gửi ít đối tượng lớn hơn nhiều đối tượng nhỏ. Trong một số ứng dụng nhất định, nhà sản xuất có thể muốn báo hiệu cho người tiêu dùng rằng sẽ không có thêm mặt hàng nào được sản xuất và họ nên tắt. Để làm điều này, bạn nên viết mã sử dụng Sentinel, một giá trị đặc biệt cho thấy hoàn thành. Dưới đây là một ví dụ minh họa khái niệm này bằng cách sử dụng không có làm Sentinel: Nhập Multiprocessing Def Consumer [input_q]: Trong khi true: item = input_q.get [] nếu mục không có: break # process print [mục] # Thay thế bằng công việc hữu ích # Shutdown Print ["Người tiêu dùng đã hoàn thành"] Nhà sản xuất def [trình tự, output_q]: Đối với mục trong chuỗi:

Đa xử lý

# Đặt mục trên hàng đợi đầu ra_q.put [mục] nếu _ _name_ _ == '_ _main_ _': q = multiprocessing.queue [] Q,]] Cons_P.start [] # Sản xuất các mục SEQUENCE = [1,2,3,4] Nhà sản xuất [Trình tự, Q] # Hoàn thành tín hiệu bằng cách đặt Sentinel lên hàng đợi Q.Put [Không có] # Chờ người tiêu dùng Xử lý để tắt tin Cons_P.Join []

Nếu bạn đang sử dụng Sentinels như trong ví dụ này, hãy lưu ý rằng bạn sẽ cần đặt một sentinel lên hàng đợi cho mỗi người tiêu dùng. Ví dụ, nếu có ba quy trình tiêu dùng tiêu thụ các mặt hàng trên hàng đợi, nhà sản xuất cần đặt ba sentinels lên hàng đợi để khiến tất cả người tiêu dùng đóng cửa. Thay thế cho việc sử dụng hàng đợi, một đường ống có thể được sử dụng để thực hiện thông báo đi qua giữa các quy trình. Ống [[song công]]

Tạo một đường ống giữa các quá trình và trả về một tuple [Conn1, Conn2] trong đó Conn1 và Conn2 là các đối tượng kết nối đại diện cho các đầu của đường ống. Theo mặc định, đường ống là hai chiều. Nếu song công được đặt sai, thì Conn1 chỉ có thể được sử dụng để nhận và chỉ có thể sử dụng Conn2 để gửi. PIPE [] phải được gọi trước khi tạo và khởi chạy bất kỳ đối tượng quy trình nào sử dụng đường ống. Một thể hiện C của một đối tượng kết nối được trả về bởi Ống [] có các phương thức và thuộc tính sau: c.close []

Đóng kết nối. Được gọi là tự động nếu C là rác được thu thập. C.Fileno []

F

H lib

fl

B

d

ff

422

Chương 20 Chủ đề và đồng thời

C.RECV_BYTES_INTO [bộ đệm [, bù]]]

Nhận được một thông báo byte hoàn chỉnh và lưu trữ nó trong bộ đệm đối tượng, hỗ trợ giao diện bộ đệm có thể ghi [ví dụ: đối tượng bytearray hoặc tương tự]. Offset Chỉ định độ lệch byte vào bộ đệm nơi đặt tin nhắn. Trả về số byte nhận được. Tăng Buffertooshort nếu độ dài của tin nhắn vượt quá không gian bộ đệm có sẵn. C.Send [OBJ]

Gửi một đối tượng thông qua kết nối. OBJ là bất kỳ đối tượng nào tương thích với dưa chua. c.send_bytes [bộ đệm [, offset [, kích thước]]]]

Gửi một bộ đệm dữ liệu byte thông qua kết nối. Bộ đệm là bất kỳ đối tượng nào hỗ trợ giao diện bộ đệm, bù là phần bù byte vào bộ đệm và kích thước là số byte để gửi. ]. Ống có thể được sử dụng theo cách tương tự như hàng đợi. Dưới đây là một ví dụ cho thấy vấn đề người tiêu dùng nhà sản xuất trước đó được triển khai bằng cách sử dụng các đường ống: Nhập đa xử lý # Tiêu thụ các mặt hàng trên đường ống. Def Consumer [PIPE]: OUTPUT_P, INPUT_P = PIPE INPUT_P.CLOSE [] # Đóng đầu vào của đường ống trong khi true: thử: item = output_p.recv [] Công việc hữu ích # in tắt in ["người tiêu dùng đã hoàn thành"] # sản xuất các mục và đặt hàng đợi. Trình tự là một số ít có thể đại diện cho các mục được xử lý. Nhà sản xuất def [trình tự, input_p]: Đối với mục theo trình tự: # đặt mục vào hàng đợi input_p.send [item] nếu _ _name_ _ == '_ _main_ _': [output_p, input_p] Khởi chạy quá trình tiêu dùng Cons_p = Multiprocessing. , 2,3,4] Nhà sản xuất [Trình tự, Input_P] # Hoàn thành tín hiệu bằng cách đóng ống đầu vào input_p.close [] # Đợi quy trình người tiêu dùng tắt tin Cons_p.join []

F

H lib

fl

B

d

ff

Đa xử lý

423

Cần chú ý rất nhiều đến việc quản lý thích hợp các điểm cuối đường ống. Nếu một trong các đầu của đường ống không được sử dụng trong nhà sản xuất hoặc người tiêu dùng, nó sẽ được đóng lại. Điều này giải thích, ví dụ, tại sao đầu ra của đường ống được đóng trong nhà sản xuất và đầu vào của đường ống được đóng ở người tiêu dùng. Nếu bạn quên một trong các bước này, chương trình có thể treo trên hoạt động recv [] trong người tiêu dùng. Các đường ống được tham chiếu được tính bởi hệ điều hành và phải đóng trong tất cả các quy trình để tạo ra ngoại lệ Eoferror. Vì vậy, đóng đường ống trong nhà sản xuất không có bất kỳ tác dụng nào trừ khi người tiêu dùng cũng đóng cùng một đầu của đường ống. Các đường ống có thể được sử dụng để giao tiếp hai chiều. Điều này có thể được sử dụng để viết các chương trình tương tác với một quy trình bằng mô hình yêu cầu/phản hồi thường được liên kết với điện toán máy khách/máy chủ hoặc cuộc gọi thủ tục từ xa. Dưới đây là một ví dụ: Nhập đa bộ xử lý # một máy chủ quy trình def adder [pip server_p.send [result] # in shutdown in ["máy chủ xong"] nếu _ _name_ _ == '_ _main_ _': [server_p, client_p] = adder, args = [[server_p, client_p],]] adder_p.start [] # Đóng ống máy chủ trong máy khách server_p.close [] . Đóng ống khách_p.close [] # Đợi quy trình người tiêu dùng tắt adder_p.join []

Trong ví dụ này, hàm adder [] chạy dưới dạng máy chủ đang chờ tin nhắn đến cuối đường ống. Khi nhận được, nó thực hiện một số xử lý và gửi kết quả trở lại trên đường ống. Hãy nhớ rằng Send [] và recv [] sử dụng mô -đun Pickle để tuần tự hóa các đối tượng. Trong ví dụ, máy chủ nhận được một tuple [x, y] làm đầu vào và trả về kết quả x + y. Tuy nhiên, đối với các ứng dụng nâng cao hơn sử dụng cuộc gọi thủ tục từ xa, bạn nên sử dụng nhóm quy trình như được mô tả tiếp theo.

F

H lib

fl

B

d

ff

424

Đa xử lý

Cần chú ý rất nhiều đến việc quản lý thích hợp các điểm cuối đường ống. Nếu một trong các đầu của đường ống không được sử dụng trong nhà sản xuất hoặc người tiêu dùng, nó sẽ được đóng lại. Điều này giải thích, ví dụ, tại sao đầu ra của đường ống được đóng trong nhà sản xuất và đầu vào của đường ống được đóng ở người tiêu dùng. Nếu bạn quên một trong các bước này, chương trình có thể treo trên hoạt động recv [] trong người tiêu dùng. Các đường ống được tham chiếu được tính bởi hệ điều hành và phải đóng trong tất cả các quy trình để tạo ra ngoại lệ Eoferror. Vì vậy, đóng đường ống trong nhà sản xuất không có bất kỳ tác dụng nào trừ khi người tiêu dùng cũng đóng cùng một đầu của đường ống. Các đường ống có thể được sử dụng để giao tiếp hai chiều. Điều này có thể được sử dụng để viết các chương trình tương tác với một quy trình bằng mô hình yêu cầu/phản hồi thường được liên kết với điện toán máy khách/máy chủ hoặc cuộc gọi thủ tục từ xa. Dưới đây là một ví dụ: Nhập đa bộ xử lý # một máy chủ quy trình def adder [pip server_p.send [result] # in shutdown in ["máy chủ xong"] nếu _ _name_ _ == '_ _main_ _': [server_p, client_p] = adder, args = [[server_p, client_p],]] adder_p.start [] # Đóng ống máy chủ trong máy khách server_p.close [] . Đóng ống khách_p.close [] # Đợi quy trình người tiêu dùng tắt adder_p.join []

Trong ví dụ này, hàm adder [] chạy dưới dạng máy chủ đang chờ tin nhắn đến cuối đường ống. Khi nhận được, nó thực hiện một số xử lý và gửi kết quả trở lại trên đường ống. Hãy nhớ rằng Send [] và recv [] sử dụng mô -đun Pickle để tuần tự hóa các đối tượng. Trong ví dụ, máy chủ nhận được một tuple [x, y] làm đầu vào và trả về kết quả x + y. Tuy nhiên, đối với các ứng dụng nâng cao hơn sử dụng cuộc gọi thủ tục từ xa, bạn nên sử dụng nhóm quy trình như được mô tả tiếp theo.

Executes func[*args, **kwargs] in one of the pool workers and returns the result. It is important to emphasize this does not execute func in parallel in all pool workers. If you want func to execute concurrently with different arguments, you either have to call p.apply[] from different threads or use p.apply_async[]. p.apply_async[func [, args [, kwargs [, callback]]]]

Executes func[*args, **kwargs] in one of the pool workers and returns the result asynchronously.The result of this method is an instance of AsyncResult which can be used to obtain the final result at a later time. callback is a callable object that accepts a single input argument.When the result of func becomes available, it is immediately passed to callback. callback should not perform any blocking operations or else it will block the reception of results in other asynchronous operations. p.close[]

Closes the process pool, preventing any further operations. If any operations are still pending, they will be completed before the worker processes terminate. p.join[]

Waits for all worker processes to exit.This can only be called after close[] or terminate[]. p.imap[func, iterable [, chunksize]]

A version of map[] that returns an iterator instead of a list of results. p.imap_unordered[func, iterable [, chunksize]]]

The same as imap[] except that the results are returned in an arbitrary order based on when they are received from the worker processes. p.map[func, iterable [, chunksize]]

Applies the callable object func to all of the items in iterable and returns the result as a list.The operation is carried out in parallel by splitting iterable into chunks and farming out the work to the worker processes. chunksize specifies the number of items in each chunk. For large amounts of data, increasing the chunksize will improve performance.

F

h Lib

fL

B

d

ff

multiprocessing

425

p.map_async[func, iterable [, chunksize [, callback]]]

The same as map[] except that the result is returned asynchronously.The return value is an instance of AsyncResult that can be used to later obtain the result. callback is a callable object accepting a single argument. If supplied, callback is called with the result when it becomes available. p.terminate[]

Immediately terminates all of the worker processes without performing any cleanup or finishing any pending work. If p is garbage-collected, this is called. The methods apply_async[] and map_async[] return an AsyncResult instance as a result. An instance a of AsyncResult has the following methods: a.get[[timeout]]

Returns the result, waiting for it to arrive if necessary. timeout is an optional timeout. If the result does not arrive in the given time, a multiprocessing.TimeoutError exception is raised. If an exception was raised in the remote operation, it is reraised when this method is called. a.ready[]

Returns True if the call has completed. a.sucessful[]

Returns True if the call completed without any exceptions. An AssertionError is raised if this method is called prior to the result being ready. a.wait[[timeout]]

Waits for the result to become available. timeout is an optional timeout. The following example illustrates the use of a process pool to build a dictionary mapping filenames to SHA512 digest values for an entire directory of files: import os import multiprocessing import hashlib # Some parameters you can tweak BUFSIZE = 8192 # Read buffer size POOLSIZE = 2 # Number of workers def compute_digest[filename]: try: f = open[filename,"rb"] except IOError: return None digest = hashlib.sha512[] while True: chunk = f.read[BUFSIZE] if not chunk: break digest.update[chunk] f.close[] return filename, digest.digest[] def build_digest_map[topdir]: digest_pool = multiprocessing.Pool[POOLSIZE]

F

h Lib

fL

B

d

ff

426

Chapter 20 Threads and Concurrency

allfiles = [os.path.join[path,name] for path, dirs, files in os.walk[topdir] for name in files] digest_map = dict[digest_pool.imap_unordered[compute_digest,allfiles,20]] digest_pool.close[] return digest_map # Try it out. Change the directory name as desired. if _ _name_ _ == '_ _main_ _': digest_map = build_digest_map["/Users/beazley/Software/Python-3.0"] print[len[digest_map]]

In the example, a sequence of pathnames for all files in a directory tree is specified using a generator expression.This sequence is then chopped up and farmed out to a process pool using the imap_unordered[] function. Each pool worker computes a SHA512 digest value for its files using the compute_digest[] function.The results are sent back to the master and collected into a Python dictionary. Although it’s by no means a scientific result, this example gives a 75 percent speedup over a single-process solution when run on the author’s dual-core Macbook. Keep in mind that it only makes sense to use a process pool if the pool workers perform enough work to justify the extra communication overhead. As a general rule, it would not make sense to use a pool for simple calculations such as just adding two numbers together.

Dữ liệu được chia sẻ và đồng bộ hóa bình thường, các quá trình được hoàn thành được cách ly với nhau với các phương tiện liên lạc duy nhất là hàng đợi hoặc đường ống. Tuy nhiên, hai đối tượng có thể được sử dụng để biểu diễn dữ liệu được chia sẻ. Bên dưới nắp, các đối tượng này sử dụng bộ nhớ chia sẻ [thông qua MMAP] để có thể truy cập trong nhiều quy trình. Giá trị [Typecode, Arg1, ... Argn, ​​Lock]

Tạo một đối tượng CTYPES trong bộ nhớ chia sẻ. Typecode là một chuỗi chứa một mã loại được sử dụng bởi mô -đun mảng [ví dụ: 'I', 'd', v.v.] hoặc một đối tượng loại từ mô -đun CTYPES [ví dụ: ctypes.c_int, ctypes.c_double, v.v. ]. Tất cả các đối số vị trí bổ sung Arg1, Arg2, ... Argn được chuyển cho hàm tạo cho loại đã cho. Khóa là một đối số chỉ dành cho từ khóa mà nếu được đặt thành true [mặc định], khóa mới được tạo để bảo vệ quyền truy cập vào giá trị. Nếu bạn vượt qua khóa hiện có như khóa hoặc phiên bản rlock, thì khóa đó được sử dụng để đồng bộ hóa. Nếu v là một thể hiện của giá trị được chia sẻ được tạo bởi giá trị, thì giá trị cơ bản được truy cập V.Value. Ví dụ: đọc V.Value sẽ nhận được giá trị và gán V.Value sẽ thay đổi giá trị. RawValue [typecode, arg1, ..., argn]

Giống như giá trị ngoại trừ không có khóa. Mảng [kiểu chữ, khởi tạo, khóa]

Tạo một mảng CTYPE trong bộ nhớ chia sẻ. Typecode mô tả nội dung của mảng và có cùng ý nghĩa như được mô tả cho giá trị []. Khởi tạo là một số nguyên đặt kích thước ban đầu của mảng hoặc một chuỗi các mục có giá trị và kích thước được sử dụng để khởi tạo mảng. Khóa là một đối số chỉ có từ khóa với cùng ý nghĩa như được mô tả cho value []. Nếu A là một thể hiện của một mảng được chia sẻ được tạo bởi mảng, thì bạn

F

H lib

fl

B

d

ff

Đa xử lý

427

Truy cập nội dung của nó bằng cách sử dụng các hoạt động lập chỉ mục, cắt và lặp tiêu chuẩn, mỗi hoạt động được đồng bộ hóa bởi khóa. Đối với chuỗi byte, A cũng sẽ có thuộc tính a.Value để truy cập toàn bộ mảng dưới dạng một chuỗi. RawArray [Typecode, Infitor]

Giống như mảng ngoại trừ không có khóa. Nếu bạn đang viết các chương trình phải thao tác một số lượng lớn các mục mảng cùng một lúc, hiệu suất sẽ tốt hơn đáng kể nếu bạn sử dụng kiểu dữ liệu này cùng với một khóa riêng để đồng bộ hóa [nếu cần]. Ngoài các giá trị được chia sẻ được tạo bằng cách sử dụng giá trị [] và mảng [], mô -đun đa xử lý cung cấp các phiên bản chia sẻ của các nguyên thủy đồng bộ hóa sau: nguyên thủy

Sự mô tả

Khóa rlock

Khóa loại trừ Mutual Khóa loại trừ lẫn nhau [có thể có được nhiều lần theo cùng một quy trình mà không chặn] Biến điều kiện sự kiện Semaphore bị ràng buộc Semaphore

Điều kiện sự kiện Boundedsemaphore Semaphore

Hành vi của các đối tượng này bắt chước các nguyên thủy đồng bộ hóa được xác định trong mô -đun luồng với các tên giống hệt nhau. Vui lòng tham khảo tài liệu luồng để biết thêm chi tiết. Cần lưu ý rằng với đa xử lý, thông thường không cần thiết phải lo lắng về việc đồng bộ hóa mức độ thấp với các khóa, semaphores hoặc các cấu trúc tương tự ở cùng mức độ như với các luồng. Trong một phần, các hoạt động gửi [] và nhận [] trên các đường ống và các hoạt động đặt [] và get [] trên hàng đợi đã cung cấp đồng bộ hóa. Tuy nhiên, các giá trị và khóa được chia sẻ có thể có sử dụng trong một số cài đặt chuyên dụng nhất định. Dưới đây là một ví dụ gửi một danh sách python phao đến một quy trình khác bằng cách sử dụng một mảng được chia sẻ thay vì một đường ống: Nhập lớp đa bộ xử lý Floatchannel [Object]: def _ _init_ _ [self, MaxSize] d ', maxsize] self.buffer_len = multiprocessing.Value [' i '] self.empty = multiprocessing.semaphore [1] self.full = multiprocessing.semaphore [0] def send [self, giá trị]: self.empty.acquire . là full def recv [self]: self.full.acquire [] # chỉ tiến hành nếu bộ đệm đầy đủ giá trị = self.buffer [: self.buffer_len.Value] # sao chép giá trị self.empty.release [] Trả về giá trị

F

H lib

fl

B

d

ff

428

Đa xử lý

Truy cập nội dung của nó bằng cách sử dụng các hoạt động lập chỉ mục, cắt và lặp tiêu chuẩn, mỗi hoạt động được đồng bộ hóa bởi khóa. Đối với chuỗi byte, A cũng sẽ có thuộc tính a.Value để truy cập toàn bộ mảng dưới dạng một chuỗi. RawArray [Typecode, Infitor]

Nghiên cứu sâu hơn về ví dụ này được để lại cho người đọc. Tuy nhiên, trong một bài kiểm tra hiệu suất trên máy tác giả, việc gửi một danh sách lớn các phao qua floatchannel nhanh hơn khoảng 80 % so với việc gửi danh sách qua một đường ống [phải pickle và giải nén tất cả các giá trị].

Các đối tượng được quản lý Không giống như các luồng, các quy trình không hỗ trợ các đối tượng được chia sẻ. Mặc dù bạn có thể tạo các giá trị và mảng được chia sẻ như trong phần trước, nhưng điều này không hoạt động cho các đối tượng Python nâng cao hơn như từ điển, danh sách hoặc phiên bản của các lớp do người dùng xác định. Làm việc với các đối tượng được chia sẻ nếu chúng chạy dưới sự kiểm soát của một người quản lý được gọi là. Trình quản lý là một quy trình con riêng biệt nơi các đối tượng thực tồn tại và hoạt động như một máy chủ. Các quy trình khác truy cập vào các đối tượng được chia sẻ thông qua việc sử dụng các proxy hoạt động như máy khách của máy chủ Trình quản lý. Cách đơn giản nhất để làm việc với các đối tượng được quản lý đơn giản là sử dụng hàm trình quản lý []. Người quản lý[]

Tạo một máy chủ Trình quản lý đang chạy trong một quy trình riêng biệt. Trả về một thể hiện của loại đồng bộ hóa loại được xác định trong mô hình phân nhóm đa xử lý. Một phiên bản m của SyncManager được trả về bởi Manager [] có một loạt các phương thức để tạo các đối tượng được chia sẻ và trả về một proxy có thể được sử dụng để truy cập chúng. Thông thường, bạn sẽ tạo một trình quản lý và sử dụng các phương thức này để tạo các đối tượng được chia sẻ trước khi khởi chạy bất kỳ quy trình mới nào.

Tạo một thể hiện mảng được chia sẻ trên máy chủ và trả về một proxy cho nó. Xem phần Dữ liệu được chia sẻ và đồng bộ hóa trên mạng để biết mô tả về các đối số. M.BoundedSemaphore [[Giá trị]]

Tạo một chuỗi được chia sẻ. Phiên bản phân chia trên máy chủ và trả về một proxy cho nó.

F

H lib

fl

B

d

ff

Đa xử lý

429

M.Condition [[khóa]]

Tạo một ví dụ được chia sẻ. Khóa là một ví dụ proxy được tạo bởi M.Lock [] hoặc M.Rlock []. m.dict [[args]]

Tạo một phiên bản dict được chia sẻ trên máy chủ và trả về một proxy cho nó. Các đối số cho phương thức này giống như đối với hàm Dict [] tích hợp. m.event []

Tạo một luồng được chia sẻ.Event trên máy chủ và trả về một proxy cho nó. M.List [[Trình tự]]

Tạo một thể hiện danh sách được chia sẻ trên máy chủ và trả về proxy cho nó. Các đối số cho phương thức này giống như đối với hàm Danh sách tích hợp []. M.Lock []

Tạo một ví dụ được chia sẻ. Khlock trên máy chủ và trả về một proxy cho nó. không gian m.namespace []

Tạo một đối tượng không gian tên được chia sẻ trên máy chủ và trả về một proxy cho nó. Một không gian tên là một đối tượng có phần giống với mô -đun Python. Ví dụ: nếu n là proxy không gian tên, bạn có thể gán và đọc các thuộc tính bằng cách sử dụng [.], Chẳng hạn như n.name = value hoặc value = n.name. Tuy nhiên, sự lựa chọn của tên là đáng kể. Nếu tên bắt đầu bằng một chữ cái, thì giá trị đó là một phần của đối tượng được chia sẻ do người quản lý nắm giữ và có thể truy cập trong tất cả các quy trình khác. Nếu tên bắt đầu bằng dấu gạch dưới, nó chỉ là một phần của đối tượng proxy và không được chia sẻ. m.queue []

Tạo một đối tượng hàng đợi được chia sẻ trên máy chủ và trả về một proxy cho nó. m.rlock []

Tạo một đối tượng rening.Rlock được chia sẻ trên máy chủ và trả về một proxy cho nó. M.Semaphore [[Giá trị]]

Tạo một đối tượng chuỗi được chia sẻ.Semaphore trên máy chủ và trả về một proxy cho nó. M.Value [Typecode, Value]

Tạo một đối tượng giá trị được chia sẻ trên máy chủ và trả về một proxy cho nó. Xem phần Dữ liệu được chia sẻ và đồng bộ hóa trên mạng để biết mô tả về các đối số. Ví dụ sau đây cho thấy cách bạn sẽ sử dụng Trình quản lý để tạo từ điển được chia sẻ giữa các quy trình. Nhập đa bộ xử lý Thời gian nhập # in ra D Bất cứ khi nào sự kiện được thông qua được đặt def Watch [d, evt]: trong khi true: evt.wait [] print [d] evt.clear []

F

H lib

fl

B

d

ff

430

Đa xử lý

M.Condition [[khóa]]

Tạo một ví dụ được chia sẻ. Khóa là một ví dụ proxy được tạo bởi M.Lock [] hoặc M.Rlock []. m.dict [[args]]

Base class used to create custom manager servers for user-defined objects. address is an optional tuple [hostname, port] that specifies a network address for the server. If omitted, the operating system will simply assign an address corresponding to some free port number. authkey is a string that is used to authenticate clients connecting to the server. If omitted, the value of current_process[].authkey is used. If mgrclass is a class that inherits from BaseManager, the following class method is used to create methods for returning proxies to shared objects. mgrclass.register[typeid [, callable [, proxytype [, exposed [, method_to_typeid [, create_method]]]]]]

Registers a new data type with the manager class. typeid is a string that is used to name a particular kind of shared object.This string should be a valid Python identifier. callable is a callable object that creates or returns the instance to be shared. proxytype is a class that provides the implementation of the proxy objects to be used in clients. Normally, these classes are generated by default so this is normally set to None. exposed is a sequence of method names on the shared object that will be exposed to proxy objects. If omitted, the value of proxytype._exposed_ is used and if that is undefined, then all public methods [all callable methods that don’t start with an underscore [_] are used]. method_to_typeid is a mapping from method names to type IDS that is used to specify which methods should return their results using proxy objects. If

F

h Lib

fL

B

d

ff

multiprocessing

431

a method is not found in this mapping, the return value is copied and returned. If method_to_typeid is None, the value of proxytype._method_to_typeid_ is used if it is defined. create_method is a Boolean flag that specifies whether a method with the name typeid should be created in mgrclass. By default, this is True. An instance m of a manager derived from BaseManager must be manually started to operate.The following attributes and methods are related to this: m.address

A tuple [hostname, port] that has the address being used by the manager server. m.connect[]

Connects to a remote manager object, the address of which was given to the BaseManager constructor. m.serve_forever[]

Runs the manager server in the current process. m.shutdown[]

Shuts down a manager server launched by the m.start[] method. m.start[]

Starts a separate subprocess and starts the manager server in that process. The following example shows how to create a manager for a user-defined class: import multiprocessing from multiprocessing.managers import BaseManager class A[object]: def _ _init_ _[self,value]: self.x = value def _ _repr_ _[self]: return "A[%s]" % self.x def getX[self]: return self.x def setX[self,value]: self.x = value def _ _iadd_ _[self,value]: self.x += value return self class MyManager[BaseManager]: pass MyManager.register["A",A] if _ _name_ _ == '_ _main_ _': m = MyManager[] m.start[] # Create a managed object a = m.A[37] ...

In this example, the last statement creates an instance of A that lives on the manager server.The variable a in the previous code is only a proxy for this instance.The behavior of this proxy is similar to [but not completely identical to] referent, the object on the

F

h Lib

fL

B

d

ff

432

Chapter 20 Threads and Concurrency

server. First, you will find that data attributes and properties cannot be accessed. Instead, you have to use access functions: >>> a.x Traceback [most recent call last]: File "", line 1, in AttributeError: 'AutoProxy[A]' object has no attribute 'x' >>> a.getX[] 37 >>> a.setX[42] >>>

With proxies, the repr[] function returns a string representing the proxy, whereas str[] returns the output of _ _repr_ _[] on the referent. For example: >>> a

>>> print[a] A[37] >>>

Special methods and any method starting with an underscore [_] are not accessible on proxies. For example, if you tried to invoke a._ _iadd_ _[], it doesn’t work: >>> a += 37 Traceback [most recent call last]: File "", line 1, in TypeError: unsupported operand type[s] for +=: 'AutoProxy[A]' and 'int' >>> a._ _iadd_ _[37] Traceback [most recent call last]: File "", line 1, in AttributeError: 'AutoProxy[A]' object has no attribute '_ _iadd_ _' >>>

In more advanced applications, it is possible to customize proxies to more carefully control access.This is done by defining a class that inherits from BaseProxy, which is defined in multiprocessing.managers.The following code shows how you could make a custom proxy to the A class in the previous example that properly exposes the _ _iadd_ _[] method and which uses a property to expose the x attribute: from multiprocessing.managers import BaseProxy class AProxy[BaseProxy]: # A list of all methods exposed on the referent _exposed_ = ['_ _iadd_ _','getX','setX'] # Implement the public interface of the proxy def _ _iadd_ _[self,value]: self._callmethod['_ _iadd_ _',[value,]] return self @property def x[self]: return self._callmethod['getX',[]] @x.setter def x[self,value]: self._callmethod['setX',[value,]] class MyManager[BaseManager]: pass MyManager.register["A", A, proxytype=AProxy]

Một proxy thể hiện của một lớp có nguồn gốc từ Baseproxy có các phương pháp sau:

F

H lib

fl

B

d

ff

Đa xử lý

433

proxy._CallMethod [Tên [, Args [, Kwargs]]]]

Gọi tên phương thức trên đối tượng giới thiệu Proxy. Tên là một chuỗi có tên phương thức, Args là một tuple chứa các đối số vị trí và kwargs là một từ điển của các đối số từ khóa. Tên phương thức phải được phơi bày rõ ràng. Thông thường, điều này được thực hiện bằng cách bao gồm tên trong thuộc tính lớp _Exposed_ của lớp proxy. proxy._GetValue []

Trả về một bản sao của người giới thiệu trong người gọi. Nếu cuộc gọi này được thực hiện trong một quy trình khác, đối tượng giới thiệu sẽ được ngâm, gửi cho người gọi và không được giải thích. Một ngoại lệ được nâng lên nếu người giới thiệu có thể được ngâm.

Các chương trình kết nối sử dụng mô -đun đa xử lý có thể thực hiện thông báo truyền với các quy trình khác chạy trên cùng một máy hoặc với các quy trình nằm trên các hệ thống từ xa. Điều này có thể hữu ích nếu bạn muốn thực hiện một chương trình được viết để làm việc trên một hệ thống và mở rộng nó hoạt động một cụm điện toán. Mô hình phân nhóm đa bộ xử lý.

Kết nối với một quy trình khác phải nghe tại địa chỉ địa chỉ. Địa chỉ là một tuple [tên máy chủ, cổng] đại diện cho địa chỉ mạng, tên tệp đại diện cho ổ cắm tên miền unix hoặc chuỗi của biểu mẫu r '\\ servername \ pipe \ pipEname' đại diện cho một đường ống có tên là đường ống trên hệ thống từ xa [ Sử dụng một tên Servern của '.' cho máy cục bộ]. Gia đình là một chuỗi đại diện cho định dạng bổ sung và thường là một trong 'AF_Inet', 'AF_UNIX' hoặc 'AF_PIPE'. Nếu bị bỏ qua, gia đình được suy ra từ định dạng địa chỉ. Xác thực là một lá cờ Boolean chỉ định xem xác thực tiêu hóa có được sử dụng hay không. AuthKey là một chuỗi chứa khóa xác thực. Nếu bị bỏ qua, thì giá trị của current_process []. kết nối.listener [[địa chỉ [, gia đình [, tồn đọng [, xác thực [, authkey]]]]]]]

Một lớp thực hiện một máy chủ để nghe và xử lý các kết nối được thực hiện bởi hàm của máy khách []. Backlog là một số nguyên tương ứng với giá trị được truyền cho phương thức nghe [] của ổ cắm nếu tham số địa chỉ chỉ định kết nối mạng. Theo mặc định, tồn đọng là 1. Nếu địa chỉ bị bỏ qua, thì địa chỉ mặc định được chọn. Nếu cả địa chỉ và gia đình đều bị bỏ qua, thì sơ đồ liên lạc nhanh nhất có sẵn trên hệ thống địa phương được chọn. Một phiên bản của người nghe hỗ trợ các phương thức và thuộc tính sau: s.accept []

Chấp nhận kết nối mới và trả về một đối tượng kết nối. Tăng xác thựcerRor nếu xác thực thất bại. S.Address

Địa chỉ mà người nghe đang sử dụng.

F

H lib

fl

B

d

ff

434

Đa xử lý

proxy._CallMethod [Tên [, Args [, Kwargs]]]]

Gọi tên phương thức trên đối tượng giới thiệu Proxy. Tên là một chuỗi có tên phương thức, Args là một tuple chứa các đối số vị trí và kwargs là một từ điển của các đối số từ khóa. Tên phương thức phải được phơi bày rõ ràng. Thông thường, điều này được thực hiện bằng cách bao gồm tên trong thuộc tính lớp _Exposed_ của lớp proxy. proxy._GetValue []

Trả về một bản sao của người giới thiệu trong người gọi. Nếu cuộc gọi này được thực hiện trong một quy trình khác, đối tượng giới thiệu sẽ được ngâm, gửi cho người gọi và không được giải thích. Một ngoại lệ được nâng lên nếu người giới thiệu có thể được ngâm.

Các chương trình kết nối sử dụng mô -đun đa xử lý có thể thực hiện thông báo truyền với các quy trình khác chạy trên cùng một máy hoặc với các quy trình nằm trên các hệ thống từ xa. Điều này có thể hữu ích nếu bạn muốn thực hiện một chương trình được viết để làm việc trên một hệ thống và mở rộng nó hoạt động một cụm điện toán. Mô hình phân nhóm đa bộ xử lý.

Kết nối với một quy trình khác phải nghe tại địa chỉ địa chỉ. Địa chỉ là một tuple [tên máy chủ, cổng] đại diện cho địa chỉ mạng, tên tệp đại diện cho ổ cắm tên miền unix hoặc chuỗi của biểu mẫu r '\\ servername \ pipe \ pipEname' đại diện cho một đường ống có tên là đường ống trên hệ thống từ xa [ Sử dụng một tên Servern của '.' cho máy cục bộ]. Gia đình là một chuỗi đại diện cho định dạng bổ sung và thường là một trong 'AF_Inet', 'AF_UNIX' hoặc 'AF_PIPE'. Nếu bị bỏ qua, gia đình được suy ra từ định dạng địa chỉ. Xác thực là một lá cờ Boolean chỉ định xem xác thực tiêu hóa có được sử dụng hay không. AuthKey là một chuỗi chứa khóa xác thực. Nếu bị bỏ qua, thì giá trị của current_process []. kết nối.listener [[địa chỉ [, gia đình [, tồn đọng [, xác thực [, authkey]]]]]]]

Một lớp thực hiện một máy chủ để nghe và xử lý các kết nối được thực hiện bởi hàm của máy khách []. Backlog là một số nguyên tương ứng với giá trị được truyền cho phương thức nghe [] của ổ cắm nếu tham số địa chỉ chỉ định kết nối mạng. Theo mặc định, tồn đọng là 1. Nếu địa chỉ bị bỏ qua, thì địa chỉ mặc định được chọn. Nếu cả địa chỉ và gia đình đều bị bỏ qua, thì sơ đồ liên lạc nhanh nhất có sẵn trên hệ thống địa phương được chọn. Một phiên bản của người nghe hỗ trợ các phương thức và thuộc tính sau: s.accept []

Chấp nhận kết nối mới và trả về một đối tượng kết nối. Tăng xác thựcerRor nếu xác thực thất bại. S.Address

Địa chỉ mà người nghe đang sử dụng.

Chương 20 Chủ đề và đồng thời

s.close []

Đóng ống hoặc ổ cắm đang được người nghe sử dụng. s.last_accepted

F

H lib

fl

B

d

ff

Đa xử lý

435

proxy._CallMethod [Tên [, Args [, Kwargs]]]]

Gọi tên phương thức trên đối tượng giới thiệu Proxy. Tên là một chuỗi có tên phương thức, Args là một tuple chứa các đối số vị trí và kwargs là một từ điển của các đối số từ khóa. Tên phương thức phải được phơi bày rõ ràng. Thông thường, điều này được thực hiện bằng cách bao gồm tên trong thuộc tính lớp _Exposed_ của lớp proxy. proxy._GetValue []

Đặt tên của Python thực thi được sử dụng để thực thi các quy trình con. Điều này chỉ được xác định trên Windows.

Lời khuyên chung về đa xử lý mô -đun đa xử lý là một trong những mô -đun tiên tiến và mạnh mẽ nhất trong thư viện Python. Dưới đây là một số lời khuyên chung để giữ cho đầu của bạn không bùng nổ: n đọc cẩn thận tài liệu trực tuyến trước khi xây dựng một ứng dụng lớn. Mặc dù phần này đã đề cập đến những điều cơ bản thiết yếu, nhưng tài liệu chính thức bao gồm một số vấn đề lén lút hơn có thể phát sinh. n Đảm bảo rằng tất cả dữ liệu được truyền giữa các quy trình đều tương thích với Pickle. n Tránh dữ liệu được chia sẻ và học cách yêu thông điệp truyền tải và hàng đợi. Với thông điệp truyền tải, bạn không phải lo lắng rất nhiều về đồng bộ hóa, khóa và các vấn đề khác. Nó cũng có xu hướng cung cấp quy mô tốt hơn khi số lượng quy trình tăng lên. n don lồng sử dụng các biến toàn cầu bên trong các hàm có nghĩa là để chạy trong các quy trình riêng biệt. Thay vào đó, tốt hơn là vượt qua các tham số. n Cố gắng không trộn các luồng và đa xử lý với nhau trong cùng một chương trình trừ khi bạn cố gắng cải thiện bảo mật công việc của mình [hoặc giảm nó tùy thuộc vào người đang thực hiện đánh giá mã]. n chú ý rất cẩn thận đến cách các quá trình ngừng hoạt động. Theo nguyên tắc chung, bạn sẽ muốn đóng các quy trình rõ ràng và có một kế hoạch chấm dứt được xác định rõ ràng thay vì chỉ dựa vào thu thập rác hoặc phải chấm dứt mạnh mẽ trẻ em bằng cách sử dụng hoạt động chấm dứt []. n Việc sử dụng các nhà quản lý và proxy có liên quan chặt chẽ với nhiều khái niệm khác nhau trong điện toán phân tán [ví dụ: các đối tượng phân tán]. Một cuốn sách điện toán phân tán tốt có thể là một tài liệu tham khảo hữu ích. n Mô-đun đa xử lý có nguồn gốc từ thư viện của bên thứ ba được gọi là pyprocessing. Tìm kiếm các mẹo sử dụng và thông tin trên thư viện này có thể là một tài nguyên hữu ích. Mặc dù mô -đun này hoạt động trên Windows, bạn nên đọc kỹ tài liệu chính thức để biết nhiều chi tiết tinh tế. Ví dụ, để khởi chạy một quy trình mới trên Windows, mô -đun đa xử lý thực hiện bản sao của chính nó của hoạt động Unix Fork [], trong đó trạng thái quy trình được sao chép vào quy trình con trên đường ống. Theo nguyên tắc chung, mô -đun này được điều chỉnh nhiều hơn cho các hệ thống UNIX. Trên hết, hãy cố gắng giữ mọi thứ đơn giản nhất có thể.

F

H lib

fl

B

d

ff

436

Chương 20 Chủ đề và đồng thời

Việc luồng mô -đun luồng cung cấp một lớp luồng và một loạt các nguyên thủy đồng bộ hóa để viết các chương trình đa luồng.

Đối tượng luồng Lớp luồng được sử dụng để biểu diễn một luồng điều khiển riêng biệt. Một luồng mới có thể được tạo như sau: Chủ đề [nhóm = Không, Target = none, name = none, args = [], kwargs = {}]

Điều này tạo ra một thể hiện chủ đề mới. Nhóm là không và được dành riêng cho các phần mở rộng trong tương lai. Mục tiêu là một đối tượng có thể gọi được gọi bằng phương thức Run [] khi luồng bắt đầu. Theo mặc định, nó không có, có nghĩa là không có gì được gọi. Tên là tên chủ đề. Theo mặc định, một tên duy nhất của biểu mẫu "Thread-N" được tạo. Args là một bộ phận của các đối số được truyền đến hàm đích. KWARGS là một từ điển của các đối số từ khóa được truyền đến mục tiêu. Một phiên bản chủ đề T hỗ trợ các phương thức và thuộc tính sau: t.start []

Bắt đầu luồng bằng cách gọi phương thức chạy [] trong một luồng điều khiển riêng biệt. Phương thức này chỉ có thể được gọi một lần. T.Run []

Phương pháp này được gọi là khi luồng bắt đầu. Theo mặc định, nó gọi hàm đích được truyền trong hàm tạo. Phương thức này cũng có thể được xác định lại trong các lớp con của luồng. T.Join [[thời gian chờ]]

Chờ cho đến khi luồng kết thúc hoặc thời gian chờ xảy ra. Thời gian chờ là một số điểm nổi chỉ định thời gian chờ tính bằng giây. Một chủ đề không thể tự tham gia và nó là một lỗi khi tham gia một luồng trước khi nó được bắt đầu. t.is_alive []

Trả về true nếu chủ đề còn sống và sai nếu không. Một luồng còn sống từ thời điểm phương thức start [] trả về cho đến khi phương thức chạy [] của nó chấm dứt. T.Asalive [] là bí danh cho phương thức này trong mã cũ. T.Name

Tên luồng. Đây là một chuỗi được sử dụng chỉ để nhận dạng và có thể được thay đổi thành một giá trị có ý nghĩa hơn nếu muốn [có thể đơn giản hóa việc gỡ lỗi]. Trong mã cũ hơn, t.getName [] và t.setName [tên] được sử dụng để thao tác tên luồng. t.ident

Một định danh chủ đề số nguyên. Nếu chủ đề chưa bắt đầu, giá trị là không có. T.Daemon

Dòng cờ Boolean Daemonic. Điều này phải được đặt trước khi Gọi Start [] và giá trị ban đầu được kế thừa từ trạng thái Daemonic của chuỗi Tạo. Toàn bộ chương trình Python thoát ra khi không còn chủ đề không hoạt động. Tất cả các chương trình đều có

F

H lib

fl

B

d

ff

luồng

437

Chủ đề đại diện cho chủ đề ban đầu của điều khiển và không phải là daemonic. Trong mã cũ hơn, t.setdaemon [cờ] và t.isdaemon [] được sử dụng để thao tác giá trị này. Dưới đây là một ví dụ cho thấy cách tạo và khởi chạy một hàm [hoặc có thể gọi khác] dưới dạng luồng: Nhập luồng thời gian nhập thời gian [khoảng] ] thời gian.s ngủ [khoảng] t = Threading.Thread [Target = Clock, Args = [15,]] T.Daemon = true t.start []

Dưới đây là một ví dụ cho thấy cách xác định cùng một luồng với một lớp: Nhập luồng nhập Lớp thời gian ClockThread [Threading.Thread]: def _ _init_ _ [self, intercal]: Threading.Thread._ _init_ _ [self] self. daemon = true self.Interval = intercal def chạy [tự]: trong khi đúng: in ["Thời gian là % s" % thời gian.ctime []] thời gian []

Nếu bạn xác định một luồng là một lớp và xác định phương thức _ _init_ _ [] của riêng bạn, điều cực kỳ quan trọng là gọi chuỗi cấu trúc lớp cơ sở._ _init_ _ [] như được hiển thị. Nếu bạn quên điều này, bạn sẽ nhận được một lỗi khó chịu. Khác với Run [], đó là một lỗi khi ghi đè bất kỳ phương thức nào khác đã được xác định cho một luồng. Cài đặt của thuộc tính daemon trong các ví dụ này là một tính năng phổ biến của các luồng sẽ chạy mãi mãi trong nền. Thông thường, Python chờ tất cả các luồng chấm dứt trước khi trình thông dịch thoát ra. Tuy nhiên, đối với các nhiệm vụ nền không kết thúc, hành vi này thường không mong muốn. Đặt cờ daemon làm cho trình thông dịch bỏ ngay sau khi chương trình chính thoát ra. Trong trường hợp này, các chủ đề daemon đơn giản bị phá hủy.

Đối tượng hẹn giờ Một đối tượng hẹn giờ được sử dụng để thực hiện một hàm sau đó. Hẹn giờ [khoảng, func [, args [, kwargs]]]]]

Tạo một đối tượng hẹn giờ chạy chức năng func sau khi khoảng giây đã trôi qua. Args và kwargs cung cấp các đối số và từ khóa đối số được truyền cho FUNC.METHER Timer không bắt đầu cho đến khi phương thức bắt đầu [] được gọi.

F

H lib

fl

B

d

ff

438

luồng

Chủ đề đại diện cho chủ đề ban đầu của điều khiển và không phải là daemonic. Trong mã cũ hơn, t.setdaemon [cờ] và t.isdaemon [] được sử dụng để thao tác giá trị này. Dưới đây là một ví dụ cho thấy cách tạo và khởi chạy một hàm [hoặc có thể gọi khác] dưới dạng luồng: Nhập luồng thời gian nhập thời gian [khoảng] ] thời gian.s ngủ [khoảng] t = Threading.Thread [Target = Clock, Args = [15,]] T.Daemon = true t.start []

Dưới đây là một ví dụ cho thấy cách xác định cùng một luồng với một lớp: Nhập luồng nhập Lớp thời gian ClockThread [Threading.Thread]: def _ _init_ _ [self, intercal]: Threading.Thread._ _init_ _ [self] self. daemon = true self.Interval = intercal def chạy [tự]: trong khi đúng: in ["Thời gian là % s" % thời gian.ctime []] thời gian []

Nếu bạn xác định một luồng là một lớp và xác định phương thức _ _init_ _ [] của riêng bạn, điều cực kỳ quan trọng là gọi chuỗi cấu trúc lớp cơ sở._ _init_ _ [] như được hiển thị. Nếu bạn quên điều này, bạn sẽ nhận được một lỗi khó chịu. Khác với Run [], đó là một lỗi khi ghi đè bất kỳ phương thức nào khác đã được xác định cho một luồng. Cài đặt của thuộc tính daemon trong các ví dụ này là một tính năng phổ biến của các luồng sẽ chạy mãi mãi trong nền. Thông thường, Python chờ tất cả các luồng chấm dứt trước khi trình thông dịch thoát ra. Tuy nhiên, đối với các nhiệm vụ nền không kết thúc, hành vi này thường không mong muốn. Đặt cờ daemon làm cho trình thông dịch bỏ ngay sau khi chương trình chính thoát ra. Trong trường hợp này, các chủ đề daemon đơn giản bị phá hủy.

Đối tượng hẹn giờ Một đối tượng hẹn giờ được sử dụng để thực hiện một hàm sau đó. Hẹn giờ [khoảng, func [, args [, kwargs]]]]]

Tạo một đối tượng hẹn giờ chạy chức năng func sau khi khoảng giây đã trôi qua. Args và kwargs cung cấp các đối số và từ khóa đối số được truyền cho FUNC.METHER Timer không bắt đầu cho đến khi phương thức bắt đầu [] được gọi.

Chương 20 Chủ đề và đồng thời

Đối tượng hẹn giờ, T, có các phương thức sau: T.start []

Bắt đầu bộ hẹn giờ. Hàm func được cung cấp cho Timer [] sẽ được thực hiện sau khoảng thời gian hẹn giờ được chỉ định. T.Cancel []

Hủy bỏ bộ hẹn giờ nếu hàm chưa được thực hiện.

Khóa đối tượng Khóa nguyên thủy [hoặc khóa loại trừ lẫn nhau] là một nguyên thủy đồng bộ hóa mà trong một trong hai phương thức bị khóa hoặc khóa đã mở khóa. Nếu trạng thái bị khóa, các cố gắng để có được khóa sẽ bị chặn cho đến khi khóa được giải phóng. Nếu có nhiều hơn một luồng đang chờ để có được khóa, chỉ có một luồng được phép tiến hành khi khóa được giải phóng. Thứ tự được phát hành không xác định. Một thể hiện khóa mới được tạo bằng cách sử dụng Trình xây dựng sau: Lock []

F

H lib

fl

B

d

ff

luồng

439

Chủ đề đại diện cho chủ đề ban đầu của điều khiển và không phải là daemonic. Trong mã cũ hơn, t.setdaemon [cờ] và t.isdaemon [] được sử dụng để thao tác giá trị này. Dưới đây là một ví dụ cho thấy cách tạo và khởi chạy một hàm [hoặc có thể gọi khác] dưới dạng luồng: Nhập luồng thời gian nhập thời gian [khoảng] ] thời gian.s ngủ [khoảng] t = Threading.Thread [Target = Clock, Args = [15,]] T.Daemon = true t.start []

Dưới đây là một ví dụ cho thấy cách xác định cùng một luồng với một lớp: Nhập luồng nhập Lớp thời gian ClockThread [Threading.Thread]: def _ _init_ _ [self, intercal]: Threading.Thread._ _init_ _ [self] self. daemon = true self.Interval = intercal def chạy [tự]: trong khi đúng: in ["Thời gian là % s" % thời gian.ctime []] thời gian []

Nếu bạn xác định một luồng là một lớp và xác định phương thức _ _init_ _ [] của riêng bạn, điều cực kỳ quan trọng là gọi chuỗi cấu trúc lớp cơ sở._ _init_ _ [] như được hiển thị. Nếu bạn quên điều này, bạn sẽ nhận được một lỗi khó chịu. Khác với Run [], đó là một lỗi khi ghi đè bất kỳ phương thức nào khác đã được xác định cho một luồng. Cài đặt của thuộc tính daemon trong các ví dụ này là một tính năng phổ biến của các luồng sẽ chạy mãi mãi trong nền. Thông thường, Python chờ tất cả các luồng chấm dứt trước khi trình thông dịch thoát ra. Tuy nhiên, đối với các nhiệm vụ nền không kết thúc, hành vi này thường không mong muốn. Đặt cờ daemon làm cho trình thông dịch bỏ ngay sau khi chương trình chính thoát ra. Trong trường hợp này, các chủ đề daemon đơn giản bị phá hủy.

Tạo một semaphore mới. Giá trị là giá trị ban đầu cho bộ đếm. Nếu bị bỏ qua, bộ đếm được đặt thành giá trị là 1. một trường hợp semaphore, s, hỗ trợ các phương thức sau: s.acquire [[chặn]]

Mua lại semaphore. Nếu bộ đếm bên trong lớn hơn 0 khi nhập, phương pháp này sẽ giảm 1 và trả về ngay lập tức. Nếu nó không có, phương thức này sẽ chặn cho đến khi một luồng khác gọi ra []. Đối số chặn có hành vi tương tự như được mô tả cho các đối tượng khóa và rlock. s.release []

Phát hành một semaphore bằng cách tăng bộ đếm bên trong 1. Nếu bộ đếm bằng không và một luồng khác đang chờ, chủ đề đó bị đánh thức. Nếu nhiều luồng đang chờ, chỉ có một luồng sẽ được trả lại từ cuộc gọi Accomire [] của nó. Thứ tự trong đó các luồng được giải phóng không phải là xác định. Bị ràng buộc [giá trị]]

Tạo một semaphore mới. Giá trị là giá trị ban đầu cho bộ đếm. Nếu giá trị bị bỏ qua, bộ đếm được đặt thành giá trị là 1. Bị ràng buộc hoạt động giống hệt như một semaphore ngoại trừ số lượng hoạt động phát hành [] không thể vượt quá số lượng hoạt động Accord []. Một sự khác biệt tinh tế giữa semaphore và khóa mutex là một semaphore có thể được sử dụng để báo hiệu. Ví dụ, các phương thức Acquire [] và Release [] có thể được gọi từ các luồng khác nhau để giao tiếp giữa các chủ đề của người sản xuất và người tiêu dùng. được sản xuất = Threading.Semaphore [0] được tiêu thụ = Threading.Semaphore [1] def Produce []: trong khi đúng: tiêu thụ.acquire [] sản xuất_item [] sản xuất.Release [] def Consumer []: trong khi đúng item = get_item [] tiêu thụ.Release []

F

H lib

fl

B

d

ff

440

Chương 20 Chủ đề và đồng thời

Loại tín hiệu được hiển thị trong ví dụ này thường được thực hiện bằng cách sử dụng các biến điều kiện, sẽ được mô tả trong thời gian ngắn.

Sự kiện các sự kiện được sử dụng để giao tiếp giữa các chủ đề. Một chủ đề báo hiệu một sự kiện của người Viking, và một hoặc nhiều chủ đề khác chờ đợi nó. Một thể hiện sự kiện quản lý một cờ bên trong có thể được đặt thành True với phương thức SET [] và đặt lại thành Sai với phương thức Clear []. Phương thức chờ [] chặn cho đến khi cờ là đúng. Biến cố[]

Tạo một thể hiện sự kiện mới với cờ bên trong được đặt thành sai. Một thể hiện sự kiện, E, hỗ trợ các phương thức sau: e.is_set []

Trả về chỉ đúng nếu cờ nội bộ là đúng. Phương thức này được gọi là isset [] trong mã cũ. E.Set []

Đặt cờ bên trong thành true. Tất cả các chủ đề đang chờ nó trở thành sự thật đều được đánh thức. e.clear []

Đặt lại cờ nội bộ thành sai. E.Wait [[thời gian chờ]]

Khối cho đến khi cờ bên trong là đúng. Nếu cờ bên trong đúng khi nhập, phương thức này sẽ quay lại ngay lập tức. Mặt khác, nó chặn cho đến khi một luồng khác gọi [] để đặt cờ thành true hoặc cho đến khi thời gian chờ tùy chọn xảy ra. Thời gian chờ là một số điểm nổi chỉ định khoảng thời gian chờ tính bằng giây. Mặc dù các đối tượng sự kiện có thể được sử dụng để báo hiệu các luồng khác, nhưng chúng không nên được sử dụng để thực hiện loại thông báo điển hình trong các vấn đề của nhà sản xuất/người tiêu dùng. Ví dụ: bạn nên tránh mã như thế này: evt = event [] def preative [] # Tiêu thụ mục ... # Xóa sự kiện và đợi lại evt.clear []

Mã này không hoạt động đáng tin cậy vì nhà sản xuất có thể tạo ra một mặt hàng mới ở giữa các hoạt động EVT.WAIT [] và EVT.CLEAR []. Tuy nhiên, bằng cách xóa sự kiện này, mặt hàng mới này đã giành được bởi người tiêu dùng cho đến khi nhà sản xuất tạo ra một mặt hàng mới. Trong trường hợp tốt nhất, chương trình sẽ trải qua một trục trặc nhỏ trong đó việc xử lý

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

441

Loại tín hiệu được hiển thị trong ví dụ này thường được thực hiện bằng cách sử dụng các biến điều kiện, sẽ được mô tả trong thời gian ngắn.

Sự kiện các sự kiện được sử dụng để giao tiếp giữa các chủ đề. Một chủ đề báo hiệu một sự kiện của người Viking, và một hoặc nhiều chủ đề khác chờ đợi nó. Một thể hiện sự kiện quản lý một cờ bên trong có thể được đặt thành True với phương thức SET [] và đặt lại thành Sai với phương thức Clear []. Phương thức chờ [] chặn cho đến khi cờ là đúng. Biến cố[]

Tạo một thể hiện sự kiện mới với cờ bên trong được đặt thành sai. Một thể hiện sự kiện, E, hỗ trợ các phương thức sau: e.is_set []

Trả về chỉ đúng nếu cờ nội bộ là đúng. Phương thức này được gọi là isset [] trong mã cũ. E.Set []

Phát hành khóa cơ bản. Phương thức này gọi phương thức phát hành [] tương ứng trên khóa bên dưới. cv.wait [[thời gian chờ]]

Chờ cho đến khi được thông báo hoặc cho đến khi thời gian chờ xảy ra. Phương thức này được gọi sau khi luồng gọi đã có được khóa. cuộc gọi được thực hiện trên biến điều kiện bởi một luồng khác. Sau khi đánh thức, luồng làm lại khóa và phương thức trả về. Thời gian chờ là một số điểm nổi tính bằng giây. Nếu thời gian này hết hạn, luồng được đánh thức, khóa được phản ứng lại và điều khiển được trả về. cv.notify [[n]]

Đánh thức một hoặc nhiều luồng đang chờ trên biến điều kiện này. Phương thức này chỉ được gọi sau khi luồng gọi đã có được khóa và nó không làm gì nếu không có chủ đề nào đang chờ. n chỉ định số lượng luồng để thức tỉnh và mặc định là 1. Các luồng bị đánh thức không trả lại từ cuộc gọi chờ [] cho đến khi chúng có thể làm lại khóa. cv.notify_all []

Đánh thức tất cả các luồng đang chờ trên điều kiện này. Phương thức này được gọi là notifyall [] trong mã cũ. Dưới đây là một ví dụ cung cấp một mẫu sử dụng các biến điều kiện: CV = Threading.Condition [] def Production []: Trong khi đúng: cv.acquire [] sản xuất_item [] cv.notify [] cv.Release []

F

H lib

fl

B

d

ff

442

Chương 20 Chủ đề và đồng thời

Def Consumer []: Trong khi đúng: cv.acquire [] trong khi không phải item_is_available []: cv.wait [] # Chờ một mục hiển thị cv.Release [] tiêu thụ_item []

Một khía cạnh tinh tế của việc sử dụng các biến điều kiện là nếu có nhiều luồng đang chờ theo cùng một điều kiện, hoạt động thông báo [] có thể đánh thức một hoặc nhiều trong số chúng [hành vi này thường phụ thuộc vào hệ điều hành cơ bản]. Bởi vì điều này, luôn có khả năng một chủ đề sẽ chỉ thức dậy để thấy rằng điều kiện quan tâm không còn giữ nữa. Chẳng hạn, điều này giải thích, tại sao một vòng lặp được sử dụng trong hàm tiêu dùng []. Nếu chủ đề thức tỉnh, nhưng mặt hàng được sản xuất đã biến mất, nó sẽ quay lại chờ tín hiệu tiếp theo.

Làm việc với các khóa phải cẩn thận khi làm việc với bất kỳ nguyên thủy khóa nào như khóa, RLOCK hoặc Semaphore. Quản lý sai của khóa là một nguồn bế tắc thường xuyên hoặc điều kiện chủng tộc. Mã dựa trên khóa phải luôn luôn đảm bảo các khóa được phát hành đúng ngay cả khi các ngoại lệ xảy ra. Mã chính thức trông như thế này: Hãy thử: Lock.acquire [] # Câu lệnh Phần quan trọng ... Cuối cùng: Lock.Release []

Ngoài ra, tất cả các khóa cũng hỗ trợ giao thức quản lý ngữ cảnh, một chút sạch hơn: với khóa: # Câu lệnh Phần quan trọng ...

Trong ví dụ cuối cùng này, khóa được tự động có được bởi câu lệnh với câu lệnh và được phát hành khi luồng điều khiển rời khỏi bối cảnh. Ngoài ra, như một nguyên tắc chung, bạn nên tránh viết mã trong đó có nhiều hơn một khóa được mua tại bất kỳ thời điểm nào. Ví dụ: với Lock_a: # Câu lệnh quan trọng ... với Lock_B: # Phần quan trọng trên các câu lệnh B ...

Đây thường là một cách tốt để ứng dụng của bạn bế tắc bí ẩn. Mặc dù có những chiến lược để tránh điều này [ví dụ: khóa phân cấp], nhưng bạn thường không viết mã nào tránh được điều này hoàn toàn.

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

443

Def Consumer []: Trong khi đúng: cv.acquire [] trong khi không phải item_is_available []: cv.wait [] # Chờ một mục hiển thị cv.Release [] tiêu thụ_item []

Một khía cạnh tinh tế của việc sử dụng các biến điều kiện là nếu có nhiều luồng đang chờ theo cùng một điều kiện, hoạt động thông báo [] có thể đánh thức một hoặc nhiều trong số chúng [hành vi này thường phụ thuộc vào hệ điều hành cơ bản]. Bởi vì điều này, luôn có khả năng một chủ đề sẽ chỉ thức dậy để thấy rằng điều kiện quan tâm không còn giữ nữa. Chẳng hạn, điều này giải thích, tại sao một vòng lặp được sử dụng trong hàm tiêu dùng []. Nếu chủ đề thức tỉnh, nhưng mặt hàng được sản xuất đã biến mất, nó sẽ quay lại chờ tín hiệu tiếp theo.

Các chức năng tiện ích Các chức năng tiện ích sau đây có sẵn: Active_Count []

Trả về số lượng đối tượng luồng hiện đang hoạt động. current_thread []

Trả về đối tượng luồng tương ứng với luồng điều khiển của người gọi. liệt kê []

Trả về một danh sách tất cả các đối tượng chủ đề hiện đang hoạt động. địa phương[]

Trả về một đối tượng cục bộ cho phép lưu trữ dữ liệu địa lý địa chỉ. Đối tượng này được đảm bảo là duy nhất trong mỗi luồng.

F

H lib

fl

B

d

ff

444

Chương 20 Chủ đề và đồng thời

setProfile [func]

Đặt chức năng cấu hình sẽ được sử dụng cho tất cả các luồng được tạo. Func được truyền cho sys.setprofile [] trước khi mỗi luồng bắt đầu chạy. SetTrace [FUNC]

Đặt chức năng theo dõi sẽ được sử dụng cho tất cả các luồng được tạo. FUNC được truyền cho sys.settrace [] trước khi mỗi luồng bắt đầu chạy. stack_size [[kích thước]]

Trả về kích thước ngăn xếp được sử dụng khi tạo các luồng mới. Nếu một kích thước số nguyên tùy chọn được đưa ra, nó sẽ đặt kích thước ngăn xếp được sử dụng để tạo các luồng mới. Kích thước có thể là một giá trị là 32768 [32kb] trở lên và bội số của 4096 [4kb] cho tính di động tối đa. Một ngoại lệ của ThreadError được nâng lên nếu hoạt động này không được hỗ trợ trên hệ thống.

Trình thông dịch toàn cầu khóa trình thông dịch Python được bảo vệ bởi khóa chỉ cho phép một luồng thực thi tại một thời điểm ngay cả khi có nhiều bộ xử lý có sẵn. Điều này giới hạn nghiêm trọng tính hữu ích của các luồng trong các chương trình chuyên sâu tính toán trên thực tế, việc sử dụng các luồng Sẽ thường làm cho các chương trình liên kết CPU chạy tồi tệ hơn đáng kể so với trường hợp nếu chúng chỉ thực hiện tuần tự công việc tương tự. Vì vậy, các chủ đề thực sự chỉ được dành riêng cho các chương trình chủ yếu liên quan đến I/O như máy chủ mạng. Để biết thêm các tác vụ chuyên sâu tính toán, thay vào đó hãy xem xét sử dụng các mô-đun mở rộng C hoặc mô-đun đa xử lý. Các tiện ích mở rộng C có tùy chọn phát hành khóa phiên dịch và chạy song song, miễn là họ không tương tác với trình thông dịch khi khóa được giải phóng. Các trang trại mô -đun đa xử lý hoạt động với các quy trình phụ độc lập mà không bị hạn chế bởi khóa.

Lập trình với các chủ đề Mặc dù có thể viết các chương trình đa luồng rất truyền thống bằng Python bằng cách sử dụng các kết hợp khác nhau của các khóa và đồng bộ hóa, có một phong cách lập trình được khuyến nghị trên tất cả các chương trình khác và đó là thử và tổ chức các chương trình đa luồng như một bộ sưu tập độc lập Các nhiệm vụ giao tiếp qua hàng đợi tin nhắn. Điều này được mô tả trong phần tiếp theo [mô -đun hàng đợi] cùng với một ví dụ.

Hàng đợi, xếp hàng mô -đun hàng đợi [được đặt tên hàng đợi trong Python 2] thực hiện các hàng đợi đa nhân, đa nhân có thể được sử dụng để trao đổi thông tin một cách an toàn giữa nhiều luồng thực thi. Mô -đun hàng đợi xác định ba lớp hàng đợi khác nhau: Hàng đợi [[MaxSize]]

Tạo hàng đợi FIFO [đầu tiên đến]. Tối đa là số lượng mục tối đa có thể được đặt trong hàng đợi. Nếu tối đa hóa bị bỏ qua hoặc 0, kích thước hàng đợi là vô hạn. Lifoqueue [[Maxsize]]

Tạo hàng đợi LIFO [cuối cùng, đầu tiên] [còn được gọi là ngăn xếp].

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

445

setProfile [func]

Đặt chức năng cấu hình sẽ được sử dụng cho tất cả các luồng được tạo. Func được truyền cho sys.setprofile [] trước khi mỗi luồng bắt đầu chạy. SetTrace [FUNC]

Đặt chức năng theo dõi sẽ được sử dụng cho tất cả các luồng được tạo. FUNC được truyền cho sys.settrace [] trước khi mỗi luồng bắt đầu chạy. stack_size [[kích thước]]

Trả về kích thước ngăn xếp được sử dụng khi tạo các luồng mới. Nếu một kích thước số nguyên tùy chọn được đưa ra, nó sẽ đặt kích thước ngăn xếp được sử dụng để tạo các luồng mới. Kích thước có thể là một giá trị là 32768 [32kb] trở lên và bội số của 4096 [4kb] cho tính di động tối đa. Một ngoại lệ của ThreadError được nâng lên nếu hoạt động này không được hỗ trợ trên hệ thống.

Trình thông dịch toàn cầu khóa trình thông dịch Python được bảo vệ bởi khóa chỉ cho phép một luồng thực thi tại một thời điểm ngay cả khi có nhiều bộ xử lý có sẵn. Điều này giới hạn nghiêm trọng tính hữu ích của các luồng trong các chương trình chuyên sâu tính toán trên thực tế, việc sử dụng các luồng Sẽ thường làm cho các chương trình liên kết CPU chạy tồi tệ hơn đáng kể so với trường hợp nếu chúng chỉ thực hiện tuần tự công việc tương tự. Vì vậy, các chủ đề thực sự chỉ được dành riêng cho các chương trình chủ yếu liên quan đến I/O như máy chủ mạng. Để biết thêm các tác vụ chuyên sâu tính toán, thay vào đó hãy xem xét sử dụng các mô-đun mở rộng C hoặc mô-đun đa xử lý. Các tiện ích mở rộng C có tùy chọn phát hành khóa phiên dịch và chạy song song, miễn là họ không tương tác với trình thông dịch khi khóa được giải phóng. Các trang trại mô -đun đa xử lý hoạt động với các quy trình phụ độc lập mà không bị hạn chế bởi khóa.

Lập trình với các chủ đề Mặc dù có thể viết các chương trình đa luồng rất truyền thống bằng Python bằng cách sử dụng các kết hợp khác nhau của các khóa và đồng bộ hóa, có một phong cách lập trình được khuyến nghị trên tất cả các chương trình khác và đó là thử và tổ chức các chương trình đa luồng như một bộ sưu tập độc lập Các nhiệm vụ giao tiếp qua hàng đợi tin nhắn. Điều này được mô tả trong phần tiếp theo [mô -đun hàng đợi] cùng với một ví dụ.

Hàng đợi, xếp hàng mô -đun hàng đợi [được đặt tên hàng đợi trong Python 2] thực hiện các hàng đợi đa nhân, đa nhân có thể được sử dụng để trao đổi thông tin một cách an toàn giữa nhiều luồng thực thi. Mô -đun hàng đợi xác định ba lớp hàng đợi khác nhau: Hàng đợi [[MaxSize]]

Tạo hàng đợi FIFO [đầu tiên đến]. Tối đa là số lượng mục tối đa có thể được đặt trong hàng đợi. Nếu tối đa hóa bị bỏ qua hoặc 0, kích thước hàng đợi là vô hạn. Lifoqueue [[Maxsize]]

Tạo hàng đợi LIFO [cuối cùng, đầu tiên] [còn được gọi là ngăn xếp].

Hàng đợi, hàng đợi

Các khối cho đến khi tất cả các mục trên hàng đợi đã được gỡ bỏ và xử lý. Điều này sẽ chỉ quay lại một khi q.task_done [] đã được gọi cho mọi mục được đặt trên hàng đợi.

Ví dụ hàng đợi với các chương trình đa luồng thường được đơn giản hóa với việc sử dụng hàng đợi. Ví dụ: thay vì dựa vào trạng thái được chia sẻ phải được bảo vệ bởi các khóa, các luồng có thể được liên kết với nhau bằng cách sử dụng hàng đợi được chia sẻ. Trong mô hình này, các luồng công nhân thường hoạt động như người tiêu dùng dữ liệu. Dưới đây là một ví dụ minh họa khái niệm:

F

H lib

fl

B

d

ff

446

Chương 20 Chủ đề và đồng thời

Nhập luồng từ hàng đợi hàng đợi hàng đợi

# Sử dụng từ hàng đợi trên Python 2

Class WorkerThread [Threading.Thread]: def _ _init_ _ [self,*args, ** kwargs]: Threading.Thread._ _init_ _ [self,*args, ** kwargs] self.input_queue = xếp hàng [] self, item]: self.input_queue.put [item] def Close [self]: self.input_queue.put [none] self.input_queue.join [] def chạy [self]: while true: item = self.input_queue.get . Cho biết rằng Sentinel đã nhận được và trả về self.input_queue.task_done [] return # Ví dụ sử dụng w = workerthread [] w.start [] w.send ["Xin chào"]

# Gửi các mục cho công nhân [qua hàng đợi]

Thiết kế của lớp này đã được chọn rất cẩn thận. Đầu tiên, bạn sẽ nhận thấy rằng API lập trình là một tập hợp con của các đối tượng kết nối được tạo bởi các đường ống trong mô -đun đa xử lý. Điều này cho phép mở rộng trong tương lai. Ví dụ, công nhân sau này có thể được di chuyển vào một quy trình riêng mà không phá vỡ mã gửi cho họ dữ liệu. Thứ hai, giao diện lập trình cho phép kết thúc luồng. Phương thức đóng [] đặt một sentinel lên hàng đợi, do đó, khiến luồng tắt khi được xử lý. Cuối cùng, API lập trình cũng gần giống với một coroutine. Nếu công việc được thực hiện không liên quan đến bất kỳ hoạt động chặn nào, bạn có thể thực hiện lại phương thức Run [] dưới dạng coroutine và phân phối hoàn toàn với các luồng. .

Coroutines và microthread trong một số loại ứng dụng nhất định, có thể thực hiện đa luồng không gian người dùng hợp tác bằng cách sử dụng bộ lập lịch tác vụ và một bộ sưu tập các máy phát điện hoặc coroutines. Đôi khi được gọi là microthreading, mặc dù thuật ngữ khác nhau đôi khi điều này được mô tả trong bối cảnh Tasklets, chủ đề màu xanh lá cây, Greenlets, v.v ... Một cách sử dụng phổ biến của kỹ thuật này là trong các chương trình cần quản lý một bộ sưu tập lớn các tệp hoặc ổ cắm mở. Ví dụ: một máy chủ mạng muốn quản lý đồng thời 1.000 kết nối máy khách. Thay vì tạo 1.000 luồng để thực hiện điều đó, I/O không đồng bộ hoặc bỏ phiếu [sử dụng mô -đun chọn] được sử dụng cùng với Trình lập lịch tác vụ xử lý các sự kiện I/O.

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

447

Nhập luồng từ hàng đợi hàng đợi hàng đợi

# Sử dụng từ hàng đợi trên Python 2

Class WorkerThread [Threading.Thread]: def _ _init_ _ [self,*args, ** kwargs]: Threading.Thread._ _init_ _ [self,*args, ** kwargs] self.input_queue = xếp hàng [] self, item]: self.input_queue.put [item] def Close [self]: self.input_queue.put [none] self.input_queue.join [] def chạy [self]: while true: item = self.input_queue.get . Cho biết rằng Sentinel đã nhận được và trả về self.input_queue.task_done [] return # Ví dụ sử dụng w = workerthread [] w.start [] w.send ["Xin chào"]

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

F

H lib

fl

B

d

ff

Chương 20 Chủ đề và đồng thời

Nhập luồng từ hàng đợi hàng đợi hàng đợi

Lập trình mạng cơ bản Các mô-đun lập trình mạng Python chủ yếu hỗ trợ hai giao thức Internet: giao thức TCP và UDP. TCP là một giao thức định hướng kết nối đáng tin cậy được sử dụng để thiết lập luồng liên lạc hai chiều giữa các máy. UDP là một giao thức dựa trên gói cấp thấp hơn [không kết nối] trong đó các máy gửi và nhận các gói thông tin riêng biệt mà không chính thức thiết lập kết nối. Không giống như TCP, giao tiếp UDP không đáng tin cậy và do đó vốn đã phức tạp hơn để quản lý trong các ứng dụng yêu cầu giao tiếp đáng tin cậy. Do đó, hầu hết các ứng dụng Internet sử dụng các kết nối TCP. Cả hai giao thức mạng được xử lý thông qua một bản tóm tắt lập trình được gọi là ổ cắm. Một ổ cắm là một đối tượng tương tự như một tệp cho phép một chương trình chấp nhận các kết nối đến, tạo các kết nối đi và gửi và nhận dữ liệu. Trước khi hai máy có thể giao tiếp, cả hai phải tạo một đối tượng ổ cắm. Máy nhận kết nối [máy chủ] phải liên kết đối tượng ổ cắm của nó với số cổng đã biết. Một cổng là một số 16 bit trong phạm vi 0 Ném65535 mà được quản lý bởi hệ điều hành và được sử dụng bởi các máy khách để xác định duy nhất các máy chủ. Các cổng 0 Lỗi1023 được hệ thống dành riêng và được sử dụng bởi các giao thức mạng chung. Bảng sau đây cho thấy các bài tập cổng cho một vài giao thức phổ biến [có thể tìm thấy danh sách đầy đủ hơn tại //www.iana.org/assignments/ Port-Numbers]:

F

H lib

fl

B

d

ff

450

Chương 21 Lập trình mạng và ổ cắm

Dịch vụ

Số cổng

FTP-DATA FTP-Control SSH Telnet SMTP [Mail] HTTP [www] POP3 IMAP HTTPS [an toàn www]

20 21 22 23 25 80 110 143 443

Quá trình thiết lập kết nối TCP bao gồm một chuỗi các bước chính xác trên cả máy chủ và máy khách, như trong Hình 21.1. Người phục vụ

Khách hàng

ổ cắm[]

ổ cắm[]

trói buộc[]

nghe[]

Chấp nhận[]

Đợi kết nối thiết lập kết nối

đọc[]

liên kết[]

lời yêu cầu

viết[]

yêu cầu xử lý

viết[]

yêu cầu xử lý

Hình 21.1

đọc[]

liên kết[]

lời yêu cầu

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

451

Dịch vụ

Khách hàng

ổ cắm[]

ổ cắm[]

trói buộc[]

trói buộc[]

nghe[]

Chấp nhận[]

Đợi kết nối thiết lập kết nối

yêu cầu xử lý

Hình 21.1

Đợi kết nối thiết lập kết nối

đọc[]

nghe[]

Chấp nhận[]

Đợi kết nối thiết lập kết nối

đọc[]

liên kết[]

lời yêu cầu

viết[]

F

H lib

fl

B

d

ff

452

Chương 21 Lập trình mạng và ổ cắm

Dịch vụ

asynchat The asynchat module simplifies the implementation of applications that implement asynchronous networking using the asyncore module. It does this by wrapping the low-level I/O functionality of asyncore with a higher-level programming interface that is designed for network protocols based on simple request/response mechanisms [for example, HTTP]. To use this module, you must define a class that inherits from async_chat.Within this class, you must define two methods: collect_incoming_data[] and found_terminator[].The first method is invoked whenever data is received on the network connection.Typically, it would simply take the data and store it someplace.The found_terminator[] method is called when the end of a request has been detected. For example, in HTTP, requests are terminated by a blank line. For data output, async_chat maintains a producer FIFO queue. If you need to output data, it is simply added to this queue.Then, whenever writes are possible on the network connection, data is transparently taken from this queue. async_chat[[sock]]

Base class used to define new handlers. async_chat inherits from asyncore.dispatcher and provides the same methods. sock is a socket object that’s used for communication. An instance, a, of async_chat has the following methods in addition to those already provided by the asyncore.dispatcher base class: a.close_when_done[]

Signals an end-of-file on the outgoing data stream by pushing None onto the producer FIFO queue.When this is reached by the writer, the channel will be closed. a.collect_incoming_data[data]

Called whenever data is received on the channel. data is the received data and is typically stored for later processing.This method must be implemented by the user. a.discard_buffers[]

Discards all data held in input/output buffers and the producer FIFO queue.

F

h Lib

fL

B

d

ff

asynchat

453

a.found_terminator[]

Called when the termination condition set by set_terminator[] holds.This method must be implemented by the user.Typically, it would process data previously collected by the collect_incoming_data[] method. a.get_terminator[]

Returns the terminator for the channel. a.push[data]

Pushes data onto the channel’s outgoing producer FIFO queue. data is a string containing the data to be sent. a.push_with_producer[producer]

Pushes a producer object, producer, onto the producer FIFO queue. producer may be any object that has a simple method, more[].The more[] method should produce a string each time it is invoked. An empty string is returned to signal the end of data. Internally, the async_chat class repeatedly calls more[] to obtain data to write on the outgoing channel. More than one producer object can be pushed onto the FIFO by calling push_with_producer[] repeatedly. s.set_terminator[term]

Sets the termination condition on the channel. term may either be a string, an integer, or None. If term is a string, the method found_terminator[] is called whenever that string appears in the input stream. If term is an integer, it specifies a byte count. After many bytes have been read, found_terminator[] will be called. If term is None, data is collected forever. The module defines one class that can produce data for the a.push_with_producer[] method. simple_producer[data [, buffer_size]]

Creates a simple producer object that produces chunks from a byte string data. buffer_size specifies the chunk size and is 512 by default. The asynchat module is always used in conjunction with the asyncore module. For instance, asyncore is used to set up the high-level server, which accepts incoming connections. asynchat is then used to implement handlers for each connection.The following example shows how this works by implementing a minimalistic web server that handles GET requests.The example omits a lot of error checking and details but should be enough to get you started. Readers should compare this example to the example in the asyncore module, which is covered next. # An asynchronous HTTP server using asynchat import asynchat, asyncore, socket import os import mimetypes try: from http.client import responses except ImportError: from httplib import responses

# Python 3 # Python 2

F

h Lib

fL

B

d

ff

454

Chapter 21 Network Programming and Sockets

# This class plugs into the asyncore module and merely handles accept events class async_http[asyncore.dispatcher]: def _ _init_ _[self,port]: asyncore.dispatcher._ _init_ _[self] self.create_socket[socket.AF_INET,socket.SOCK_STREAM] self.setsockopt[socket.SOL_SOCKET, socket.SO_REUSEADDR, 1] self.bind[['',port]] self.listen[5] def handle_accept[self]: client,addr = self.accept[] return async_http_handler[client] # Class that handles asynchronous HTTP requests. class async_http_handler[asynchat.async_chat]: def _ _init_ _[self,conn=None]: asynchat.async_chat._ _init_ _[self,conn] self.data = [] self.got_header = False self.set_terminator[b"\r\n\r\n"] # Get incoming data and append to data buffer def collect_incoming_data[self,data]: if not self.got_header: self.data.append[data] # Got a terminator [the blank line] def found_terminator[self]: self.got_header = True header_data = b"".join[self.data] # Decode header data [binary] into text for further processing header_text = header_data.decode['latin-1'] header_lines = header_text.splitlines[] request = header_lines[0].split[] op = request[0] url = request[1][1:] self.process_request[op,url] # Push text onto the outgoing stream, but encode it first def push_text[self,text]: self.push[text.encode['latin-1']] # Process the request def process_request[self, op, url]: if op == "GET": if not os.path.exists[url]: self.send_error[404,"File %s not found\r\n"] else: type, encoding = mimetypes.guess_type[url] size = os.path.getsize[url] self.push_text["HTTP/1.0 200 OK\r\n"] self.push_text["Content-length: %s\r\n" % size] self.push_text["Content-type: %s\r\n" % type] self.push_text["\r\n"] self.push_with_producer[file_producer[url]] else: self.send_error[501,"%s method not implemented" % op] self.close_when_done[]

F

H lib

fl

B

d

ff

không đồng bộ

455

# Xử lý lỗi def send_error [tự, mã, tin nhắn]: self.push_text ["http/1.0 %s %s \ r \ n" %[mã, phản hồi [mã]]] /plain \ r \ n "] self.push_text [" \ r \ n "] self.push_text [message] class file_producer [object] . .vòng[]

Để kiểm tra ví dụ này, bạn sẽ cần cung cấp URL tương ứng với một tệp trong cùng thư mục với nơi bạn đang chạy máy chủ.

Asyncore Mô -đun Asyncore được sử dụng để xây dựng các ứng dụng mạng trong đó hoạt động mạng được xử lý không đồng bộ như một loạt các sự kiện được gửi bởi một vòng lặp sự kiện, được xây dựng bằng lệnh gọi hệ thống chọn []. Cách tiếp cận như vậy rất hữu ích trong các chương trình mạng muốn cung cấp đồng thời, nhưng không sử dụng các luồng hoặc quy trình. Phương pháp này cũng có thể cung cấp hiệu suất cao cho các giao dịch ngắn. Tất cả các chức năng của mô -đun này được cung cấp bởi lớp người điều phối, đây là một trình bao bọc mỏng xung quanh một đối tượng ổ cắm thông thường. người điều phối [[sock]]

Lớp cơ sở xác định một đối tượng ổ cắm không chặn theo sự kiện. Sock là một đối tượng ổ cắm hiện có. Nếu bị bỏ qua, một ổ cắm phải được tạo bằng phương thức create_socket [] [được mô tả ngắn gọn]. Khi nó được tạo ra, các sự kiện mạng được xử lý bằng các phương thức xử lý đặc biệt. Ngoài ra, tất cả các đối tượng Dispatcher mở được lưu trong một danh sách nội bộ mà sử dụng bởi một số chức năng bỏ phiếu. Các phương pháp sau của lớp điều phối được gọi để xử lý các sự kiện mạng. Chúng nên được xác định trong các lớp có nguồn gốc từ người điều phối. D.Handle_accept []

Kêu gọi các ổ cắm nghe khi một kết nối mới đến. D.Handle_close []

Được gọi khi ổ cắm được đóng. D.Handle_connect []

Được gọi khi một kết nối được thực hiện. D.Handle_error []

Được gọi là khi một ngoại lệ python chưa được thực hiện.

F

H lib

fl

B

d

ff

456

không đồng bộ

# Xử lý lỗi def send_error [tự, mã, tin nhắn]: self.push_text ["http/1.0 %s %s \ r \ n" %[mã, phản hồi [mã]]] /plain \ r \ n "] self.push_text [" \ r \ n "] self.push_text [message] class file_producer [object] . .vòng[]

Để kiểm tra ví dụ này, bạn sẽ cần cung cấp URL tương ứng với một tệp trong cùng thư mục với nơi bạn đang chạy máy chủ.

Asyncore Mô -đun Asyncore được sử dụng để xây dựng các ứng dụng mạng trong đó hoạt động mạng được xử lý không đồng bộ như một loạt các sự kiện được gửi bởi một vòng lặp sự kiện, được xây dựng bằng lệnh gọi hệ thống chọn []. Cách tiếp cận như vậy rất hữu ích trong các chương trình mạng muốn cung cấp đồng thời, nhưng không sử dụng các luồng hoặc quy trình. Phương pháp này cũng có thể cung cấp hiệu suất cao cho các giao dịch ngắn. Tất cả các chức năng của mô -đun này được cung cấp bởi lớp người điều phối, đây là một trình bao bọc mỏng xung quanh một đối tượng ổ cắm thông thường. người điều phối [[sock]]

Lớp cơ sở xác định một đối tượng ổ cắm không chặn theo sự kiện. Sock là một đối tượng ổ cắm hiện có. Nếu bị bỏ qua, một ổ cắm phải được tạo bằng phương thức create_socket [] [được mô tả ngắn gọn]. Khi nó được tạo ra, các sự kiện mạng được xử lý bằng các phương thức xử lý đặc biệt. Ngoài ra, tất cả các đối tượng Dispatcher mở được lưu trong một danh sách nội bộ mà sử dụng bởi một số chức năng bỏ phiếu. Các phương pháp sau của lớp điều phối được gọi để xử lý các sự kiện mạng. Chúng nên được xác định trong các lớp có nguồn gốc từ người điều phối. D.Handle_accept []

Kêu gọi các ổ cắm nghe khi một kết nối mới đến. D.Handle_close []

Được gọi khi ổ cắm được đóng. D.Handle_connect []

Được gọi khi một kết nối được thực hiện. D.Handle_error []

Được gọi là khi một ngoại lệ python chưa được thực hiện.

Chương 21 Lập trình mạng và ổ cắm

d.handle_expt []

Được gọi khi nhận được dữ liệu ngoài băng tần cho một ổ cắm được nhận. D.Handle_read []

Được gọi khi dữ liệu mới có sẵn để được đọc từ ổ cắm. d.handle_write []

Được gọi khi một nỗ lực để viết dữ liệu được thực hiện. d.readable []

Hàm này được sử dụng bởi vòng chọn [] để xem liệu đối tượng có sẵn sàng đọc dữ liệu hay không. Trả về true nếu vậy, sai nếu không. Phương thức này được gọi để xem liệu phương thức xử lý_read [] có nên được gọi với dữ liệu mới không. D. Viết []

F

H lib

fl

B

d

ff

không đồng bộ

457

# Xử lý lỗi def send_error [tự, mã, tin nhắn]: self.push_text ["http/1.0 %s %s \ r \ n" %[mã, phản hồi [mã]]] /plain \ r \ n "] self.push_text [" \ r \ n "] self.push_text [message] class file_producer [object] . .vòng[]

Để kiểm tra ví dụ này, bạn sẽ cần cung cấp URL tương ứng với một tệp trong cùng thư mục với nơi bạn đang chạy máy chủ.

Asyncore Mô -đun Asyncore được sử dụng để xây dựng các ứng dụng mạng trong đó hoạt động mạng được xử lý không đồng bộ như một loạt các sự kiện được gửi bởi một vòng lặp sự kiện, được xây dựng bằng lệnh gọi hệ thống chọn []. Cách tiếp cận như vậy rất hữu ích trong các chương trình mạng muốn cung cấp đồng thời, nhưng không sử dụng các luồng hoặc quy trình. Phương pháp này cũng có thể cung cấp hiệu suất cao cho các giao dịch ngắn. Tất cả các chức năng của mô -đun này được cung cấp bởi lớp người điều phối, đây là một trình bao bọc mỏng xung quanh một đối tượng ổ cắm thông thường. người điều phối [[sock]]

# Python 3 # Python 2

# Lớp này chỉ xử lý chấp nhận các sự kiện lớp async_http [asyncore.dispatcher]: def _ _init_ _ [self, port]: asyncore.dispatcher._ _init_ _ [self] self.create_socket [socket.af_inet, socket . Lớp khách hàng async_http_handler [asyncore.dispatcher]: def _ _init_ _ [self, sock = none]: asyncore.dispatcher._ _init_ _ [self, sock] self.got_request .deque [] self.respesing = false

# Đọc yêu cầu HTTP?

# Chỉ có thể đọc được nếu tiêu đề yêu cầu không đọc def có thể đọc được [self]: return not self.got_request

F

H lib

fl

B

d

ff

458

Chương 21 Lập trình mạng và ổ cắm

# Đọc dữ liệu yêu cầu đến DEF Tay cầm_read [self]: chunk = self.recv [8192] self.request_data += chunk nếu b '\ r \ n \ r \ n' trong self.request_data: self.handle_request [] Yêu cầu đến DEF TAY ] header_lines = header_text.splitLines [] request = header_lines [0] .split [] op = request [0] url = request [1] [1:] self.process_request [op, url] , op, url]: self. Khác: gõ, mã hóa = mimetypes.guess_type [url] size = os.path.getSize [url] self.push_text ['http/1.0 200 ok r \ n ' % ​​kích thước] self.push_text [' content-type: % s \ r \ n ' % ​​type] self.push_text [' \ r \ n '] self.push [open [url, "rb"]. Đọc []] Xử lý lỗi def send_error [tự, mã, tin nhắn]: self.push_text ['http/1.0 %s %s \ r \ n' %[mã, phản hồi [mã]]] Plain \ r \ n '] self.push_text [' \ r \ n '] self.push_text [tin nhắn] # Thêm dữ liệu nhị phân vào đầu ra hàng đợi hea [self, data]: self.write_queue.append [dữ liệu] # Thêm Dữ liệu văn bản cho hàng đợi đầu ra def push_text [self, text]: self.push [text.encode ['latin-1']] write_queue # Viết phản hồi dữ liệu DEF DEF Tay cầm_Write [self]: Chunk = self.write_queue.popleft [] byte_sent = self.send [chunk] nếu byte_sent! = không phải self.write_queue: self.close []

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

459

# Đọc dữ liệu yêu cầu đến DEF Tay cầm_read [self]: chunk = self.recv [8192] self.request_data += chunk nếu b '\ r \ n \ r \ n' trong self.request_data: self.handle_request [] Yêu cầu đến DEF TAY ] header_lines = header_text.splitLines [] request = header_lines [0] .split [] op = request [0] url = request [1] [1:] self.process_request [op, url] , op, url]: self. Khác: gõ, mã hóa = mimetypes.guess_type [url] size = os.path.getSize [url] self.push_text ['http/1.0 200 ok r \ n ' % ​​kích thước] self.push_text [' content-type: % s \ r \ n ' % ​​type] self.push_text [' \ r \ n '] self.push [open [url, "rb"]. Đọc []] Xử lý lỗi def send_error [tự, mã, tin nhắn]: self.push_text ['http/1.0 %s %s \ r \ n' %[mã, phản hồi [mã]]] Plain \ r \ n '] self.push_text [' \ r \ n '] self.push_text [tin nhắn] # Thêm dữ liệu nhị phân vào đầu ra hàng đợi hea [self, data]: self.write_queue.append [dữ liệu] # Thêm Dữ liệu văn bản cho hàng đợi đầu ra def push_text [self, text]: self.push [text.encode ['latin-1']] write_queue # Viết phản hồi dữ liệu DEF DEF Tay cầm_Write [self]: Chunk = self.write_queue.popleft [] byte_sent = self.send [chunk] nếu byte_sent! = không phải self.write_queue: self.close []

lựa chọn

# Tạo máy chủ A = async_http [8080] # poll mãi mãi asyncore.loop []

Xem thêm: Ổ cắm [trang 469], chọn [trang 459], http [trang 500], socketserver [trang 489]

Chọn Mô -đun chọn cung cấp quyền truy cập vào các cuộc gọi hệ thống chọn [] và Poll []. select [] thường được sử dụng để thực hiện bỏ phiếu hoặc xử lý đa kênh trên nhiều luồng đầu vào/đầu ra mà không cần sử dụng các luồng hoặc quy trình con. Trên Unix, nó hoạt động cho các tệp, ổ cắm, đường ống và hầu hết các loại tệp khác. Trên Windows, nó chỉ hoạt động cho ổ cắm. Chọn [IWTD, OWTD, EWTD [, thời gian chờ]]

Truy vấn đầu vào, đầu ra và trạng thái đặc biệt của một nhóm mô tả tệp. Ba đối số đầu tiên là danh sách có chứa các mô tả tệp số nguyên hoặc đối tượng bằng phương thức, fileno [], có thể được sử dụng để trả về bộ mô tả tệp. Tham số IWTD Chỉ định các đối tượng đang chờ đầu vào, OWTD chỉ định các đối tượng đang chờ đầu ra và EWTD chỉ định các đối tượng đang chờ một điều kiện đặc biệt. Mỗi danh sách có thể trống. Thời gian chờ là một số điểm nổi chỉ định khoảng thời gian chờ tính bằng giây. Nếu thời gian chờ bị bỏ qua, chức năng đợi cho đến khi ít nhất một mô tả tệp đã sẵn sàng. Nếu nó 0 0, chức năng chỉ thực hiện một cuộc thăm dò và trả về ngay lập tức. Giá trị trả về là một bộ danh sách chứa các đối tượng đã sẵn sàng. Đây là tập hợp của ba đối số đầu tiên. Nếu không có đối tượng nào sẵn sàng trước khi thời gian chờ xảy ra, ba danh sách trống sẽ được trả về. Nếu xảy ra lỗi, ngoại lệ select.Error được nêu ra. Giá trị của nó giống như được trả về bởi Ioerror và Oserror. Thăm dò ý kiến ​​[]

Sự mô tả

Pollin Pollpri Polout Pollerr

Dữ liệu có sẵn để đọc. Dữ liệu khẩn cấp có sẵn để đọc. Sẵn sàng để viết. Điều kiện lỗi.

F

H lib

fl

B

d

ff

460

Chương 21 Lập trình mạng và ổ cắm

Không thay đổi

Sự mô tả

Pollhup Pollnval

Treo lên. Yêu cầu không hợp lệ.

Nếu EventMask bị bỏ qua, các sự kiện Pollin, Pollpri và Polout được kiểm tra. p.unregister [FD]

Xóa các tập tin mô tả FD khỏi đối tượng bỏ phiếu. Tăng KeyError nếu tệp không được đăng ký. p.poll [[thời gian chờ]]

Các cuộc thăm dò cho các sự kiện trên tất cả các mô tả tập tin đã đăng ký. Thời gian chờ là một thời gian chờ tùy chọn được chỉ định tính bằng mili giây. Trả về một danh sách các bộ dữ liệu [FD, sự kiện], trong đó FD là bộ mô tả tệp và sự kiện là một sự kiện chỉ ra bitmask. Ví dụ, để kiểm tra sự kiện pollin, chỉ cần kiểm tra giá trị bằng sự kiện & pollin. Nếu một danh sách trống được trả về, điều đó có nghĩa là thời gian chờ xảy ra và không có sự kiện nào xảy ra.

Các tính năng mô -đun nâng cao Các hàm chọn [] và poll [] là các hàm di động chung nhất được xác định bởi mô -đun này. Trên các hệ thống Linux, mô -đun chọn cũng cung cấp giao diện cho giao diện bỏ phiếu kích hoạt cạnh và cấp độ [EPOLL] có thể mang lại hiệu suất tốt hơn đáng kể. Trên các hệ thống BSD, quyền truy cập vào hàng đợi kernel và các đối tượng sự kiện được cung cấp.

Ví dụ I/O không đồng bộ nâng cao, đôi khi mô-đun chọn được sử dụng để triển khai các máy chủ dựa trên Tasklets hoặc Coroutines Một kỹ thuật có thể được sử dụng để cung cấp thực thi đồng thời mà không cần các luồng hoặc quy trình. Ví dụ nâng cao sau đây minh họa khái niệm này bằng cách thực hiện I/O--- Dựa trên lịch trình nhiệm vụ cho coroutines. Được báo trước, đây là ví dụ nâng cao nhất trong cuốn sách và nó sẽ yêu cầu một số nghiên cứu để có ý nghĩa. Bạn cũng có thể muốn tham khảo hướng dẫn Pycon'09 của tôi về một khóa học tò mò về Coroutines và đồng thời [ // www .Dabeaz.com/Coroutines] cho tài liệu tham khảo bổ sung. Nhập chọn Loại nhập khẩu bộ sưu tập nhập khẩu

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

461

Không thay đổi

Pollhup Pollnval

Treo lên. Yêu cầu không hợp lệ.

Nếu EventMask bị bỏ qua, các sự kiện Pollin, Pollpri và Polout được kiểm tra. p.unregister [FD]

F

H lib

fl

B

d

ff

462

Chương 21 Lập trình mạng và ổ cắm

Không thay đổi

The code in this example implements a very tiny “operating system.” Here are some details concerning its operation: n All work is carried out by coroutine functions. Recall that a coroutine uses the yield statement like a generator except that instead of iterating on it, you send it values using a send[value] method.

F

h Lib

fL

B

d

ff

select

n

n

n

n

463

The Task class represents a running task and is just a thin layer on top of a coroutine. A Task object task has only one operation, task.run[].This resumes the task and runs it until it hits the next yield statement, at which point the task suspends.When running a task, the task.sendval attribute contains the value that is to be sent into the task’s corresponding yield expression.Tasks run until they encounter the next yield statement.The value produced by this yield controls what happens next in the task: n If the value is another coroutine [type.GeneratorType], it means that the task wants to temporarily transfer control to that coroutine.The stack attribute of Task objects represents a call-stack of coroutines that is built up when this happens.The next time the task runs, control will be transferred into this new coroutine. n If the value is a SystemCall instance, it means that the task wants the scheduler to do something on its behalf [such as launch a new task, wait for I/O, and so on].The purpose of this object is described shortly. n If the value is any other value, one of two things happens. If the currently executing coroutine was running as a subroutine, it is popped from the task call stack and the value saved so that it can be sent to the caller.The caller will receive this value the next time the task executes. If the coroutine is the only executing coroutine, the return value is simply discarded. n The handling of StopIteration is to deal with coroutines that have terminated.When this happens, control is returned to the previous coroutine [if there was one] or the exception is propagated to the scheduler so that it knows that the task terminated. The SystemCall class represents a system call in the scheduler.When a running task wants the scheduler to carry out an operation on its behalf, it yields a SystemCall instance.This object is called a “system call” because it mimics the behavior of how programs request the services of a real multitasking operating system such as UNIX or Windows. In particular, if a program wants the services of the operating system, it yields control and provides some information back to the system so that it knows what to do. In this respect, yielding a SystemCall is similar to executing a kind of system “trap.” The Scheduler class represents a collection of Task objects that are being managed. At its core, the scheduler is built around a task queue [the task_queue attribute] that keeps track of tasks that are ready to run.There are four basic operations concerning the task queue. new[] takes a new coroutine, wraps it with a Task object, and places it on the work queue. schedule[] takes an existing Task and puts it back on the work queue. mainloop[] runs the scheduler in a loop, processing tasks one by one until there are no more tasks.The readwait[] and writewait[] methods put a Task object into temporary staging areas where it will wait for I/O events. In this case, the Task isn’t running, but it’s not dead either—it’s just sitting around biding its time. The mainloop[] method is the heart of the scheduler.This method first checks to see if any tasks are waiting for I/O events. If so, it arranges a call to select[] in order to poll for I/O activity. If there are any events of interest, the associated tasks are placed back onto the task queue so that they can run. Next, the mainloop[] method pops tasks off of the task queue and calls their run[]

F

h Lib

fL

B

d

ff

Chapter 21 Network Programming and Sockets

464

n

method. If any task exits [StopIteration], it is discarded. If a task merely yields, it is just placed back onto the task queue so that it can run again.This continues until there are either no more tasks or all tasks are blocked, waiting for more I/O events. As an option, the mainloop[] function accepts a count parameter that can be used to make it return after a specified number of I/O polling operations. This might be useful if the scheduler is to be integrated into another event loop. Perhaps the most subtle aspect of the scheduler is the handling of SystemCall instances in the mainloop[] method. If a task yields a SystemCall instance, the scheduler invokes its handle[] method, passing in the associated Scheduler and Task objects as parameters.The purpose of a system call is to carry out some kind of internal operation concerning tasks or the scheduler itself.The ReadWait[], WriteWait[], and NewTask[] classes are examples of system calls that suspend a task for I/O or create a new task. For example, ReadWait[] takes a task and invokes the readwait[] method on the scheduler.The scheduler then takes the task and places it into an appropriate holding area. Again, there is a critical decoupling of objects going on here.Tasks yield SystemCall objects to request service, but do not directly interact with the scheduler. SystemCall objects, in turn, can perform operations on tasks and schedulers but are not tied to any specific scheduler or task implementation. So, in theory, you could write a completely different scheduler implementation [maybe using threads] that could just be plugged into this whole framework and it would still work.

Dưới đây là một ví dụ về máy chủ thời gian mạng đơn giản được triển khai bằng Trình lập lịch tác vụ I/O này. Nó sẽ chiếu sáng nhiều khái niệm được mô tả trong danh sách trước: từ ổ cắm nhập khẩu, AF_Inet, Sock_Stream def Time_Server [địa chỉ]: Nhập thời gian S = socket [AF_Inet, Sock_Stream] S.Bind [địa chỉ] S.Listen [5] trong khi Đúng: Năng suất ReadWait [S] Conn, addr = s.accept [] in ["kết nối từ % s" % str [addr]] word write [Conn] resp = Time.ctime [] + "\ r \ n" Conn .Send [resp.encode ['latin-1']] Conn.close [] leaS = leaSture [] leather.new [time_server [['', 10000]]] ]] Lịch trình.run []

# Máy chủ trên Cổng 10000 # Máy chủ trên cổng 11000

Trong ví dụ này, hai máy chủ khác nhau đang chạy đồng thời khi nghe trên một số cổng khác nhau [sử dụng telnet để kết nối và kiểm tra]. có thể trên ổ cắm được liên kết. Khi các câu lệnh này trả về, mã ngay lập tức tiến hành hoạt động I/O như Accept [] hoặc Send [].

F

H lib

fl

B

d

ff

lựa chọn

465

Việc sử dụng readwait và writeWait có thể trông khá thấp. May mắn thay, thiết kế của chúng tôi cho phép các hoạt động này được ẩn đằng sau các chức năng và phương pháp thư viện, với điều kiện là chúng cũng là những coroutines. Hãy xem xét đối tượng sau đây kết thúc một đối tượng ổ cắm và bắt chước giao diện của nó: lớp cosocket [đối tượng]: def _ _init_ _ [self, sock]: self.sock = sock def đóng [self]: w BIND [self, addr]: mefel self.sock.bind [addr] def loe .sock.connect [addr] def Accept [self]: waid readwait [self.sock] Conn, addr = self.sock.accept [] = word writeWait [self.sock] nsent = self.sock.send [byte] byte = byte [nsent:] def recv [self, maxsize]: wairwait [self.sock]

Dưới đây là việc tái tạo máy chủ thời gian bằng cách sử dụng lớp cosocket: từ ổ cắm nhập khẩu, AF_Inet, sock_stream def time_server [địa chỉ]: nhập thời gian s = cosocket [ổ cắm [af_inet, sock_stream]] mang lại s.bind [địa chỉ] mang lại s. Nghe [5] trong khi đúng: Conn, addr = w Conn.Send [resp.encode ['Latin-1']] mang lại Conn.Close [] lEAGE = LEAGLULER [] LEVEL.NEW [TIME_SERVER [['', 10000]]] 11000]]] Lịch trình.run []

# Máy chủ trên Cổng 10000 # Máy chủ trên cổng 11000

Trong ví dụ này, giao diện lập trình của một đối tượng cosocket trông rất giống một ổ cắm bình thường. Sự khác biệt duy nhất là mọi hoạt động phải được mở đầu với năng suất [vì mọi phương pháp được xác định là coroutine]. Lúc đầu, nó trông thật điên rồ nên bạn có thể hỏi tất cả những gì điên rồ này mua cho bạn? Nếu bạn chạy máy chủ trên, bạn sẽ thấy rằng nó có thể chạy đồng thời mà không cần sử dụng các luồng hoặc quy trình con. Không chỉ vậy, nó còn có luồng điều khiển nhìn bình thường của người Viking miễn là bạn bỏ qua tất cả các từ khóa năng suất.

F

H lib

fl

B

d

ff

466

lựa chọn

Việc sử dụng readwait và writeWait có thể trông khá thấp. May mắn thay, thiết kế của chúng tôi cho phép các hoạt động này được ẩn đằng sau các chức năng và phương pháp thư viện, với điều kiện là chúng cũng là những coroutines. Hãy xem xét đối tượng sau đây kết thúc một đối tượng ổ cắm và bắt chước giao diện của nó: lớp cosocket [đối tượng]: def _ _init_ _ [self, sock]: self.sock = sock def đóng [self]: w BIND [self, addr]: mefel self.sock.bind [addr] def loe .sock.connect [addr] def Accept [self]: waid readwait [self.sock] Conn, addr = self.sock.accept [] = word writeWait [self.sock] nsent = self.sock.send [byte] byte = byte [nsent:] def recv [self, maxsize]: wairwait [self.sock]

Dưới đây là việc tái tạo máy chủ thời gian bằng cách sử dụng lớp cosocket: từ ổ cắm nhập khẩu, AF_Inet, sock_stream def time_server [địa chỉ]: nhập thời gian s = cosocket [ổ cắm [af_inet, sock_stream]] mang lại s.bind [địa chỉ] mang lại s. Nghe [5] trong khi đúng: Conn, addr = w Conn.Send [resp.encode ['Latin-1']] mang lại Conn.Close [] lEAGE = LEAGLULER [] LEVEL.NEW [TIME_SERVER [['', 10000]]] 11000]]] Lịch trình.run []

Trong ví dụ này, giao diện lập trình của một đối tượng cosocket trông rất giống một ổ cắm bình thường. Sự khác biệt duy nhất là mọi hoạt động phải được mở đầu với năng suất [vì mọi phương pháp được xác định là coroutine]. Lúc đầu, nó trông thật điên rồ nên bạn có thể hỏi tất cả những gì điên rồ này mua cho bạn? Nếu bạn chạy máy chủ trên, bạn sẽ thấy rằng nó có thể chạy đồng thời mà không cần sử dụng các luồng hoặc quy trình con. Không chỉ vậy, nó còn có luồng điều khiển nhìn bình thường của người Viking miễn là bạn bỏ qua tất cả các từ khóa năng suất.

F

H lib

fl

B

d

ff

lựa chọn

467

seaSt = scleuler [] leath

Nghiên cứu cẩn thận về ví dụ này sẽ mang lại cái nhìn sâu sắc to lớn về các coroutines và các kỹ thuật lập trình đồng thời được sử dụng bởi một số mô-đun bên thứ ba rất tiên tiến. Tuy nhiên, việc sử dụng quá mức các kỹ thuật này có thể khiến bạn bị sa thải sau khi xem xét mã tiếp theo của bạn.

Khi nào nên xem xét việc sử dụng mạng không đồng bộ của I/O không đồng bộ [không đồng bộ và không đồng bộ], bỏ phiếu và coroutines như trong các ví dụ trước đây vẫn là một trong những khía cạnh bí ẩn nhất của sự phát triển Python. Một lý do thường được trích dẫn để sử dụng I/O không đồng bộ là để giảm thiểu chi phí lập trình nhận thức với một số lượng lớn các luồng, đặc biệt là khi quản lý một số lượng lớn khách hàng và theo các hạn chế liên quan đến khóa phiên dịch toàn cầu [tham khảo Chương 20 , Chủ đề và đồng thời của người Viking]. Trong lịch sử, mô -đun không đồng bộ là một trong những mô -đun thư viện đầu tiên hỗ trợ mô -đun I/O.THE Asynchat không đồng bộ theo một thời gian sau đó với mục đích đơn giản hóa phần lớn mã hóa. Tuy nhiên, cả hai mô -đun này đều có cách tiếp cận xử lý I/O làm sự kiện. Ví dụ: khi xảy ra sự kiện I/O, hàm gọi lại được kích hoạt. Cuộc gọi lại sau đó phản ứng với sự kiện I/O và thực hiện một số xử lý. Nếu bạn xây dựng một ứng dụng lớn theo kiểu này, bạn sẽ thấy việc xử lý sự kiện đó lây nhiễm hầu hết mọi phần của ứng dụng [ví dụ: các sự kiện I/O kích hoạt các cuộc gọi lại, kích hoạt nhiều cuộc gọi lại, kích hoạt các cuộc gọi lại khác, quảng cáo]. Một trong những gói kết nối mạng phổ biến hơn, xoắn [//twistedmatrix.com], thực hiện phương pháp này và xây dựng đáng kể nó. Coroutines hiện đại hơn nhưng ít được hiểu và sử dụng vì chúng chỉ được giới thiệu lần đầu tiên trong Python 2.5. Một tính năng quan trọng của coroutines là bạn có thể viết các chương trình trông giống như các chương trình được thực hiện trong luồng điều khiển tổng thể của chúng. Chẳng hạn, máy chủ web trong ví dụ không sử dụng bất kỳ chức năng gọi lại nào và trông gần giống với những gì bạn sẽ viết nếu bạn đang sử dụng các chủ đề mà bạn chỉ cần trở nên thoải mái với việc sử dụng câu lệnh Selle. Stackless Python [//www.stackless.com] đưa ý tưởng này hơn nữa. Theo nguyên tắc chung, có lẽ bạn nên chống lại sự thôi thúc sử dụng các kỹ thuật I/O không đồng bộ cho hầu hết các ứng dụng mạng. Chẳng hạn, nếu bạn cần viết một máy chủ liên tục truyền dữ liệu trên hàng trăm hoặc thậm chí hàng ngàn kết nối mạng đồng thời, các luồng sẽ có xu hướng có hiệu suất vượt trội. Giám sát tăng. Trên Linux, hình phạt này có thể được giảm bằng cách sử dụng các hàm đặc biệt như epoll [], nhưng điều này hạn chế tính di động của mã của bạn. Có lẽ lợi ích chính của I/O không đồng bộ là trong các ứng dụng trong đó mạng cần được tích hợp với các vòng lặp sự kiện khác [ví dụ: GUI] hoặc trong các ứng dụng trong đó kết nối mạng được thêm vào mã cũng thực hiện một lượng xử lý CPU đáng kể. Trong những trường hợp này, việc sử dụng mạng không đồng bộ có thể dẫn đến thời gian phản hồi nhanh hơn.

F

H lib

fl

B

d

ff

468

lựa chọn

seaSt = scleuler [] leath

Nghiên cứu cẩn thận về ví dụ này sẽ mang lại cái nhìn sâu sắc to lớn về các coroutines và các kỹ thuật lập trình đồng thời được sử dụng bởi một số mô-đun bên thứ ba rất tiên tiến. Tuy nhiên, việc sử dụng quá mức các kỹ thuật này có thể khiến bạn bị sa thải sau khi xem xét mã tiếp theo của bạn.

Khi nào nên xem xét việc sử dụng mạng không đồng bộ của I/O không đồng bộ [không đồng bộ và không đồng bộ], bỏ phiếu và coroutines như trong các ví dụ trước đây vẫn là một trong những khía cạnh bí ẩn nhất của sự phát triển Python. Một lý do thường được trích dẫn để sử dụng I/O không đồng bộ là để giảm thiểu chi phí lập trình nhận thức với một số lượng lớn các luồng, đặc biệt là khi quản lý một số lượng lớn khách hàng và theo các hạn chế liên quan đến khóa phiên dịch toàn cầu [tham khảo Chương 20 , Chủ đề và đồng thời của người Viking]. Trong lịch sử, mô -đun không đồng bộ là một trong những mô -đun thư viện đầu tiên hỗ trợ mô -đun I/O.THE Asynchat không đồng bộ theo một thời gian sau đó với mục đích đơn giản hóa phần lớn mã hóa. Tuy nhiên, cả hai mô -đun này đều có cách tiếp cận xử lý I/O làm sự kiện. Ví dụ: khi xảy ra sự kiện I/O, hàm gọi lại được kích hoạt. Cuộc gọi lại sau đó phản ứng với sự kiện I/O và thực hiện một số xử lý. Nếu bạn xây dựng một ứng dụng lớn theo kiểu này, bạn sẽ thấy việc xử lý sự kiện đó lây nhiễm hầu hết mọi phần của ứng dụng [ví dụ: các sự kiện I/O kích hoạt các cuộc gọi lại, kích hoạt nhiều cuộc gọi lại, kích hoạt các cuộc gọi lại khác, quảng cáo]. Một trong những gói kết nối mạng phổ biến hơn, xoắn [//twistedmatrix.com], thực hiện phương pháp này và xây dựng đáng kể nó. Coroutines hiện đại hơn nhưng ít được hiểu và sử dụng vì chúng chỉ được giới thiệu lần đầu tiên trong Python 2.5. Một tính năng quan trọng của coroutines là bạn có thể viết các chương trình trông giống như các chương trình được thực hiện trong luồng điều khiển tổng thể của chúng. Chẳng hạn, máy chủ web trong ví dụ không sử dụng bất kỳ chức năng gọi lại nào và trông gần giống với những gì bạn sẽ viết nếu bạn đang sử dụng các chủ đề mà bạn chỉ cần trở nên thoải mái với việc sử dụng câu lệnh Selle. Stackless Python [//www.stackless.com] đưa ý tưởng này hơn nữa. Theo nguyên tắc chung, có lẽ bạn nên chống lại sự thôi thúc sử dụng các kỹ thuật I/O không đồng bộ cho hầu hết các ứng dụng mạng. Chẳng hạn, nếu bạn cần viết một máy chủ liên tục truyền dữ liệu trên hàng trăm hoặc thậm chí hàng ngàn kết nối mạng đồng thời, các luồng sẽ có xu hướng có hiệu suất vượt trội. Giám sát tăng. Trên Linux, hình phạt này có thể được giảm bằng cách sử dụng các hàm đặc biệt như epoll [], nhưng điều này hạn chế tính di động của mã của bạn. Có lẽ lợi ích chính của I/O không đồng bộ là trong các ứng dụng trong đó mạng cần được tích hợp với các vòng lặp sự kiện khác [ví dụ: GUI] hoặc trong các ứng dụng trong đó kết nối mạng được thêm vào mã cũng thực hiện một lượng xử lý CPU đáng kể. Trong những trường hợp này, việc sử dụng mạng không đồng bộ có thể dẫn đến thời gian phản hồi nhanh hơn.

Chương 21 Lập trình mạng và ổ cắm

# Một máy chủ không đồng bộ dựa trên coroutines. Máy chủ def [cổng]: s = cosocket [socket.socket [socket.af_inet, socket.sock_stream]] mang lại s.bind [['', cổng]] s.accept [] mang lại máy khách.send [[" % d chai \ r \ n" % chai] .Code ['latin-1'] mang lại máy khách ]] uống_bottles []

Nếu bạn viết một chương trình riêng biệt kết nối định kỳ với các chai của chương trình bia và đo thời gian phản hồi cần thiết để nhận thông báo trạng thái, kết quả là

F

H lib

fl

B

d

ff

ổ cắm

469

thật ngạc nhiên. Trên máy của tác giả [MacBook 2 GHz lõi kép], thời gian phản hồi trung bình [được đo hơn 1.000 yêu cầu] cho máy chủ dựa trên coroutine là khoảng 1ms so với 5ms cho các chủ đề. Sự khác biệt này được giải thích bởi thực tế là mã CoroutineBase là Có thể trả lời ngay khi phát hiện kết nối trong khi máy chủ có ren không được chạy cho đến khi nó được lên lịch bởi hệ điều hành. Với sự hiện diện của một luồng liên kết CPU và khóa phiên dịch toàn cầu Python, máy chủ có thể bị trì hoãn cho đến khi luồng liên kết CPU vượt quá lát thời gian được quy định. Trên nhiều hệ thống, lát cắt thời gian là khoảng 10ms, vì vậy việc đo lường mức độ thô về thời gian phản hồi của luồng là chính xác thời gian trung bình mà bạn có thể mong đợi để chờ một nhiệm vụ ràng buộc CPU được hệ điều hành ưu tiên. Nhược điểm của bỏ phiếu là nó giới thiệu chi phí quan trọng nếu nó xảy ra quá thường xuyên. Ví dụ, mặc dù thời gian phản hồi thấp hơn trong ví dụ này, chương trình được bỏ phiếu mất nhiều thời gian hơn 50% để chạy để hoàn thành. Nếu bạn thay đổi mã thành cuộc thăm dò chỉ sau mỗi sáu gói bia, thời gian phản hồi tăng nhẹ lên 1,2ms trong khi thời gian chạy của chương trình chỉ lớn hơn 3% so với chương trình mà không cần bỏ phiếu. Thật không may, thường không có cách nào rõ ràng để biết mức độ thường xuyên để thăm dò ý kiến ​​ngoài việc thực hiện các phép đo ứng dụng của bạn. Mặc dù thời gian phản hồi được cải thiện này có thể trông giống như một chiến thắng, nhưng vẫn có những vấn đề khủng khiếp liên quan đến việc cố gắng thực hiện đồng thời của bạn. Ví dụ, các nhiệm vụ cần phải đặc biệt cẩn thận khi thực hiện bất kỳ loại hoạt động chặn nào. Trong ví dụ máy chủ web, có một đoạn mã mở và đọc dữ liệu từ một tệp. Khi hoạt động này xảy ra, toàn bộ chương trình sẽ bị đóng băng trong một thời gian dài nếu truy cập tệp liên quan đến việc tìm kiếm đĩa. Cách duy nhất để khắc phục điều này là triển khai thêm truy cập tệp không đồng bộ và thêm nó làm tính năng vào trình lập lịch. Đối với các hoạt động phức tạp hơn như thực hiện truy vấn cơ sở dữ liệu, việc tìm ra cách thực hiện công việc theo cách không đồng bộ trở nên khá phức tạp. Một cách để làm điều đó là thực hiện công việc trong một luồng riêng biệt và truyền đạt kết quả trở lại lịch trình nhiệm vụ khi có sẵn một thứ gì đó có thể được thực hiện khi sử dụng cẩn thận hàng đợi tin nhắn. Trên một số hệ thống, có các cuộc gọi hệ thống cấp thấp đối với I/O không đồng bộ [chẳng hạn như họ các chức năng AIO_* trên UNIX]. Theo văn bản này, thư viện Python không cung cấp quyền truy cập vào các chức năng đó, mặc dù bạn có thể tìm thấy các ràng buộc thông qua các mô-đun của bên thứ ba. Theo trải nghiệm của tác giả, việc sử dụng chức năng như vậy là khó khăn hơn rất nhiều so với vẻ ngoài của nó và không thực sự đáng giá, sự phức tạp được đưa vào chương trình của bạn, bạn thường không để thư viện chủ đề giải quyết các vấn đề như vậy.

Ổ cắm Mô -đun ổ cắm cung cấp quyền truy cập vào giao diện ổ cắm BSD tiêu chuẩn. Mặc dù nó dựa trên UNIX, mô -đun này có sẵn trên tất cả các nền tảng. Giao diện ổ cắm được thiết kế chung chung và có khả năng hỗ trợ nhiều giao thức kết nối mạng [Internet, TIPC, Bluetooth, v.v.]. Tuy nhiên, giao thức phổ biến nhất là Giao thức Internet [IP], bao gồm cả TCP và UDP. Python hỗ trợ cả IPv4 và IPv6, mặc dù IPv4 là phổ biến hơn nhiều. Cần lưu ý rằng mô-đun này tương đối thấp, cung cấp quyền truy cập trực tiếp vào các chức năng mạng do hệ điều hành cung cấp. Nếu bạn đang viết một ứng dụng mạng, có thể dễ dàng sử dụng các mô -đun được mô tả trong Chương 22 hoặc mô -đun máy chủ Sockets được mô tả ở cuối chương này.

F

H lib

fl

B

d

ff

470

ổ cắm

thật ngạc nhiên. Trên máy của tác giả [MacBook 2 GHz lõi kép], thời gian phản hồi trung bình [được đo hơn 1.000 yêu cầu] cho máy chủ dựa trên coroutine là khoảng 1ms so với 5ms cho các chủ đề. Sự khác biệt này được giải thích bởi thực tế là mã CoroutineBase là Có thể trả lời ngay khi phát hiện kết nối trong khi máy chủ có ren không được chạy cho đến khi nó được lên lịch bởi hệ điều hành. Với sự hiện diện của một luồng liên kết CPU và khóa phiên dịch toàn cầu Python, máy chủ có thể bị trì hoãn cho đến khi luồng liên kết CPU vượt quá lát thời gian được quy định. Trên nhiều hệ thống, lát cắt thời gian là khoảng 10ms, vì vậy việc đo lường mức độ thô về thời gian phản hồi của luồng là chính xác thời gian trung bình mà bạn có thể mong đợi để chờ một nhiệm vụ ràng buộc CPU được hệ điều hành ưu tiên. Nhược điểm của bỏ phiếu là nó giới thiệu chi phí quan trọng nếu nó xảy ra quá thường xuyên. Ví dụ, mặc dù thời gian phản hồi thấp hơn trong ví dụ này, chương trình được bỏ phiếu mất nhiều thời gian hơn 50% để chạy để hoàn thành. Nếu bạn thay đổi mã thành cuộc thăm dò chỉ sau mỗi sáu gói bia, thời gian phản hồi tăng nhẹ lên 1,2ms trong khi thời gian chạy của chương trình chỉ lớn hơn 3% so với chương trình mà không cần bỏ phiếu. Thật không may, thường không có cách nào rõ ràng để biết mức độ thường xuyên để thăm dò ý kiến ​​ngoài việc thực hiện các phép đo ứng dụng của bạn. Mặc dù thời gian phản hồi được cải thiện này có thể trông giống như một chiến thắng, nhưng vẫn có những vấn đề khủng khiếp liên quan đến việc cố gắng thực hiện đồng thời của bạn. Ví dụ, các nhiệm vụ cần phải đặc biệt cẩn thận khi thực hiện bất kỳ loại hoạt động chặn nào. Trong ví dụ máy chủ web, có một đoạn mã mở và đọc dữ liệu từ một tệp. Khi hoạt động này xảy ra, toàn bộ chương trình sẽ bị đóng băng trong một thời gian dài nếu truy cập tệp liên quan đến việc tìm kiếm đĩa. Cách duy nhất để khắc phục điều này là triển khai thêm truy cập tệp không đồng bộ và thêm nó làm tính năng vào trình lập lịch. Đối với các hoạt động phức tạp hơn như thực hiện truy vấn cơ sở dữ liệu, việc tìm ra cách thực hiện công việc theo cách không đồng bộ trở nên khá phức tạp. Một cách để làm điều đó là thực hiện công việc trong một luồng riêng biệt và truyền đạt kết quả trở lại lịch trình nhiệm vụ khi có sẵn một thứ gì đó có thể được thực hiện khi sử dụng cẩn thận hàng đợi tin nhắn. Trên một số hệ thống, có các cuộc gọi hệ thống cấp thấp đối với I/O không đồng bộ [chẳng hạn như họ các chức năng AIO_* trên UNIX]. Theo văn bản này, thư viện Python không cung cấp quyền truy cập vào các chức năng đó, mặc dù bạn có thể tìm thấy các ràng buộc thông qua các mô-đun của bên thứ ba. Theo trải nghiệm của tác giả, việc sử dụng chức năng như vậy là khó khăn hơn rất nhiều so với vẻ ngoài của nó và không thực sự đáng giá, sự phức tạp được đưa vào chương trình của bạn, bạn thường không để thư viện chủ đề giải quyết các vấn đề như vậy.

Ổ cắm Mô -đun ổ cắm cung cấp quyền truy cập vào giao diện ổ cắm BSD tiêu chuẩn. Mặc dù nó dựa trên UNIX, mô -đun này có sẵn trên tất cả các nền tảng. Giao diện ổ cắm được thiết kế chung chung và có khả năng hỗ trợ nhiều giao thức kết nối mạng [Internet, TIPC, Bluetooth, v.v.]. Tuy nhiên, giao thức phổ biến nhất là Giao thức Internet [IP], bao gồm cả TCP và UDP. Python hỗ trợ cả IPv4 và IPv6, mặc dù IPv4 là phổ biến hơn nhiều. Cần lưu ý rằng mô-đun này tương đối thấp, cung cấp quyền truy cập trực tiếp vào các chức năng mạng do hệ điều hành cung cấp. Nếu bạn đang viết một ứng dụng mạng, có thể dễ dàng sử dụng các mô -đun được mô tả trong Chương 22 hoặc mô -đun máy chủ Sockets được mô tả ở cuối chương này.

AF_BLUETOOTH AF_INET AF_INET6

Giao thức Bluetooth Giao thức IPv4 [TCP, UDP] Giao thức IPv6 [TCP, UDP] NetLink Truyền thông liên kết Các gói cấp độ liên kết giao tiếp trong suốt Giao thức giao tiếp liên kết giữa

AF_NETLINK AF_PACKET AF_TIPC AF_UNIX

Trong số này, AF_Inet và AF_Inet6 được sử dụng phổ biến nhất vì chúng đại diện cho các kết nối Internet tiêu chuẩn. AF_Bluetooth chỉ có sẵn trên các hệ thống hỗ trợ nó [thường là các hệ thống nhúng]. AF_NETLink, AF_PACKET và AF_TIPC chỉ được hỗ trợ trên Linux. AF_NETLink được sử dụng để giao tiếp với Trò chơi nhanh giữa các ứng dụng người dùng và nhân Linux. AF_PACKET được sử dụng để làm việc trực tiếp tại lớp Datalink [ví dụ: các gói Ethernet thô]. AF_TIPC là một giao thức được sử dụng cho IPC hiệu suất cao trên các cụm Linux [//tipc.sourceforge.net/].

Các loại ổ cắm Một số chức năng ổ cắm cũng yêu cầu đặc điểm kỹ thuật của loại ổ cắm. Loại ổ cắm chỉ định loại liên lạc [luồng hoặc gói] được sử dụng trong một họ giao thức nhất định. Các hằng số sau đây được sử dụng cho mục đích này: không đổi

Sự mô tả

Sock_stream sock_dgram sock_raw sock_rdm sock_seqpacket

Một Datagrams [TCP] theo định hướng kết nối đáng tin cậy [TCP]

Các loại ổ cắm phổ biến nhất là sock_stream và sock_dgram vì chúng tương ứng với TCP và UDP trong bộ giao thức Internet. Sock_rdm là một dạng UDP đáng tin cậy đảm bảo việc cung cấp một datagram nhưng không bảo quản đặt hàng [datagram có thể được nhận theo một thứ tự khác với đã gửi]. Sock_seqpacket được sử dụng để gửi các gói thông qua kết nối hướng đến luồng theo cách bảo tồn ranh giới đơn đặt hàng và gói của chúng. Cả sock_rdm hoặc sock_seqpacket đều được hỗ trợ rộng rãi, vì vậy, tốt nhất là không sử dụng chúng nếu bạn quan tâm đến tính di động. Sock_raw được sử dụng để cung cấp quyền truy cập cấp thấp vào giao thức RAW và được sử dụng nếu bạn muốn thực hiện các hoạt động có mục đích đặc biệt như gửi tin nhắn kiểm soát [ví dụ: tin nhắn ICMP]. Việc sử dụng Sock_raw thường bị giới hạn trong các chương trình chạy với quyền truy cập của Superuser hoặc Quản trị viên.

F

H lib

fl

B

d

ff

ổ cắm

471

Không phải mọi loại ổ cắm đều được hỗ trợ bởi mỗi gia đình giao thức. Ví dụ: nếu bạn sử dụng AF_PACKET để đánh hơi các gói Ethernet trên Linux, bạn có thể thiết lập kết nối được phân loại bằng cách sử dụng sock_stream. Thay vào đó, bạn phải sử dụng sock_dgram hoặc sock_raw. Đối với ổ cắm AF_NetLink, sock_raw là loại được hỗ trợ duy nhất.

Địa chỉ Để thực hiện bất kỳ giao tiếp nào trên ổ cắm, bạn phải chỉ định địa chỉ đích. Hình thức của địa chỉ phụ thuộc vào họ địa chỉ của ổ cắm.

AF_Inet [IPv4] Đối với các ứng dụng Internet bằng IPv4, địa chỉ được chỉ định là một tuple [máy chủ, cổng]. Dưới đây là hai ví dụ: ['www.python.org', 80] ['66 .113.130.182 ', 25]

Nếu máy chủ là chuỗi trống, nó có cùng ý nghĩa với inaddr_any, có nghĩa là bất kỳ địa chỉ nào. Điều này thường được sử dụng bởi các máy chủ khi tạo ổ cắm mà bất kỳ máy khách nào cũng có thể kết nối. Nếu máy chủ được đặt thành '', nó có cùng ý nghĩa với hằng số inAddr_bloadcast trong API ổ cắm. Xin lưu ý rằng khi tên máy chủ như 'www.python.org' được sử dụng, Python sử dụng DNS để giải quyết tên máy chủ thành địa chỉ IP. Tùy thuộc vào cách DNS đã được cấu hình, bạn có thể nhận được một địa chỉ IP khác nhau mỗi lần. Sử dụng một địa chỉ IP thô, chẳng hạn như '66 .113.130.182 'để tránh hành vi này, nếu cần.

AF_Inet6 [IPv6] Đối với IPv6, địa chỉ được chỉ định là 4-Tuple [máy chủ, cổng, FlowInfo, ScopeID]. Với IPv6, các thành phần máy chủ và cổng hoạt động theo cách tương tự như IPv4, ngoại trừ dạng số của địa chỉ máy chủ IPv6 thường được chỉ định bởi một chuỗi tám số thập lục phân được phân tách đại tràng, chẳng hạn như 'Fedc: BA98: 7654: 3210 : Fedc: BA98: 7654: 3210 'hoặc' 080a :: 4: 1 '[trong trường hợp này, đại tràng kép điền vào một loạt các thành phần địa chỉ với 0]. Tham số FlowInfo là số 32 bit bao gồm nhãn dòng 24 bit [mức thấp 24 bit], mức độ ưu tiên 4 bit [4 bit tiếp theo] và bốn bit dành riêng [4 bit cao]. Nhãn dòng thường chỉ được sử dụng khi người gửi muốn bật xử lý đặc biệt bằng các bộ định tuyến. Mặt khác, FlowInfo được đặt thành 0. Tham số ScopeID là một số 32 bit mà chỉ cần khi làm việc với các địa chỉ liên kết-local và địa điểm địa điểm. Một địa chỉ liên kết-local luôn bắt đầu với tiền tố 'FE80: ...' và được sử dụng giữa các máy trên cùng một mạng LAN [bộ định tuyến sẽ không chuyển tiếp các gói liên kết-local]. Trong trường hợp này, ScopeID một chỉ mục giao diện xác định giao diện mạng cụ thể trên máy chủ. Thông tin này có thể được xem bằng lệnh như 'ifconfig' trên Unix hoặc 'IPv6 nếu' trên Windows. Một địa chỉ địa phương địa điểm luôn bắt đầu với tiền tố 'FEC0: ...' và được sử dụng giữa các máy trong cùng một trang web [ví dụ: tất cả các máy trên một mạng con nhất định]. Trong trường hợp này, Scopeid là một số nhận dạng trang web. Nếu không có dữ liệu nào được cung cấp cho FlowInfo hoặc ScopeID, địa chỉ IPv6 có thể được đưa ra dưới dạng tuple [máy chủ, cổng], như với IPv4.

F

H lib

fl

B

d

ff

472

Chương 21 Lập trình mạng và ổ cắm

AF_UNIX Đối với ổ cắm miền Unix, địa chỉ là một chuỗi chứa tên đường dẫn, ví dụ, '/TMP/MyServer'.

AF_Packet cho giao thức gói Linux, địa chỉ là một tuple [thiết bị, protonum [, pkttype [, hatype [, addr]]] trong đó thiết bị là một chuỗi chỉ định tên thiết bị như "eth0" và protonum là một số nguyên chỉ định Số giao thức Ethernet như được định nghĩa trong tệp tiêu đề [ví dụ: 0x0800 cho gói IP]. packet_type là một số nguyên chỉ định loại gói và là một trong những hằng số sau: hằng số

Sự mô tả

Gói_Host Packet_Broadcast Packet_Multicast Packet_Otherhost

Địa chỉ gói đến máy chủ địa phương. Gói phát sóng lớp vật lý. Lớp vật lý phát đa hướng. Gói được định sẵn cho một máy chủ khác, nhưng bị bắt bởi một trình điều khiển thiết bị ở chế độ lăng nhăng. Gói có nguồn gốc trên máy, nhưng đã quay trở lại ổ cắm gói.

Packet_outway

Hatype là một số nguyên chỉ định loại địa chỉ phần cứng như được sử dụng trong giao thức ARP và được xác định trong tệp tiêu đề. ADDR là một chuỗi byte chứa một địa chỉ phần cứng, cấu trúc phụ thuộc vào giá trị của Hatype. Đối với Ethernet, ADDR sẽ là chuỗi 6 byte giữ địa chỉ phần cứng.

AF_NetLink Đối với giao thức Linux NetLink, địa chỉ là một tuple [PID, nhóm] trong đó PID và các nhóm đều là số nguyên không dấu. PID là địa chỉ unicast của ổ cắm và thường giống như ID quy trình của quy trình tạo ổ cắm hoặc 0 cho kernel. Các nhóm là một mặt nạ một chút được sử dụng để chỉ định các nhóm phát đa hướng để tham gia. Tham khảo tài liệu NetLink để biết thêm thông tin.

AF_BLUETOOTH STREADES BLUETOOTH phụ thuộc vào giao thức đang được sử dụng. Đối với L2CAP, địa chỉ là một tuple [addr, psm] trong đó addr là một chuỗi như '01: 23: 45: 67: 89: ab 'và pSM là một số nguyên không dấu. Đối với RFCOMM, địa chỉ là một tuple [addr, kênh] trong đó addr là chuỗi địa chỉ và kênh là một số nguyên. Đối với HCI, địa chỉ là 1-tuple [Deviceno,] trong đó Deviceno là số thiết bị số nguyên. Đối với SCO, địa chỉ là một máy chủ chuỗi. BDADDR_ANY không đổi đại diện cho bất kỳ địa chỉ nào và là chuỗi '00: 00: 00: 00: 00: 00 '. Bdaddr_local không đổi là một chuỗi '00: 00: 00: ff: ff: ff '.

AF_TIPC cho các ổ cắm TIPC, địa chỉ là một tuple [addr_type, v1, v2, v3 [, phạm vi]] trong đó tất cả các trường là số nguyên không dấu. ADDR_TYPE là một trong các giá trị sau, cũng xác định các giá trị của V1, V2 và V3:

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

473

AF_UNIX Đối với ổ cắm miền Unix, địa chỉ là một chuỗi chứa tên đường dẫn, ví dụ, '/TMP/MyServer'.

Sự mô tả

Gói_Host Packet_Broadcast Packet_Multicast Packet_Otherhost

Địa chỉ gói đến máy chủ địa phương. Gói phát sóng lớp vật lý. Lớp vật lý phát đa hướng. Gói được định sẵn cho một máy chủ khác, nhưng bị bắt bởi một trình điều khiển thiết bị ở chế độ lăng nhăng. Gói có nguồn gốc trên máy, nhưng đã quay trở lại ổ cắm gói.

Packet_outway

Hatype là một số nguyên chỉ định loại địa chỉ phần cứng như được sử dụng trong giao thức ARP và được xác định trong tệp tiêu đề. ADDR là một chuỗi byte chứa một địa chỉ phần cứng, cấu trúc phụ thuộc vào giá trị của Hatype. Đối với Ethernet, ADDR sẽ là chuỗi 6 byte giữ địa chỉ phần cứng.

AF_NetLink Đối với giao thức Linux NetLink, địa chỉ là một tuple [PID, nhóm] trong đó PID và các nhóm đều là số nguyên không dấu. PID là địa chỉ unicast của ổ cắm và thường giống như ID quy trình của quy trình tạo ổ cắm hoặc 0 cho kernel. Các nhóm là một mặt nạ một chút được sử dụng để chỉ định các nhóm phát đa hướng để tham gia. Tham khảo tài liệu NetLink để biết thêm thông tin.

AF_BLUETOOTH STREADES BLUETOOTH phụ thuộc vào giao thức đang được sử dụng. Đối với L2CAP, địa chỉ là một tuple [addr, psm] trong đó addr là một chuỗi như '01: 23: 45: 67: 89: ab 'và pSM là một số nguyên không dấu. Đối với RFCOMM, địa chỉ là một tuple [addr, kênh] trong đó addr là chuỗi địa chỉ và kênh là một số nguyên. Đối với HCI, địa chỉ là 1-tuple [Deviceno,] trong đó Deviceno là số thiết bị số nguyên. Đối với SCO, địa chỉ là một máy chủ chuỗi. BDADDR_ANY không đổi đại diện cho bất kỳ địa chỉ nào và là chuỗi '00: 00: 00: 00: 00: 00 '. Bdaddr_local không đổi là một chuỗi '00: 00: 00: ff: ff: ff '.

AF_TIPC cho các ổ cắm TIPC, địa chỉ là một tuple [addr_type, v1, v2, v3 [, phạm vi]] trong đó tất cả các trường là số nguyên không dấu. ADDR_TYPE là một trong các giá trị sau, cũng xác định các giá trị của V1, V2 và V3:

ổ cắm

Loại địa chỉ

F

H lib

fl

B

d

ff

474

Chương 21 Lập trình mạng và ổ cắm

Hằng số đặc biệt AF_UNSPEC có thể được sử dụng cho họ địa chỉ để tìm kiếm bất kỳ loại kết nối nào. Ví dụ: mã này có thông tin về bất kỳ kết nối giống TCP nào và có thể trả về thông tin cho IPv4 hoặc IPv6: >>> getAddrinfo ["www.python.org", "http", af_unspec, sock_stream] [[2.1, 6, '', ['194.109.137.226', 80]]]]

getaddrinfo [] được dành cho mục đích rất chung chung và có thể áp dụng cho tất cả các hỗ trợ-

Các giao thức mạng ED [IPv4, IPv6, v.v.]. Sử dụng nó nếu bạn quan tâm đến khả năng tương thích và hỗ trợ các giao thức trong tương lai, đặc biệt nếu bạn có ý định hỗ trợ IPv6. getDefaultTimeout []

Trả về thời gian chờ ổ cắm mặc định tính bằng giây. Giá trị của không cho biết rằng không có thời gian chờ đã được đặt. getfqdn [[name]]

Trả về tên miền đủ điều kiện của tên. Nếu tên bị bỏ qua, máy cục bộ được giả định. Ví dụ: getfqdn ["foo"] có thể trả về "foo.quasievil.org". gethostbyname [tên máy chủ]

Dịch một tên máy chủ, chẳng hạn như 'www.python.org' sang địa chỉ IPv4. Địa chỉ IP được trả về dưới dạng chuỗi, chẳng hạn như '132.151.1.90'. Nó không hỗ trợ IPv6. gethostbyname_ex [tên máy chủ]

Dịch tên máy chủ thành địa chỉ IPv4 nhưng trả về một tuple [tên máy chủ, danh sách bí danh, danh sách ipaddrlist] trong đó tên máy chủ là tên máy chủ chính, danh sách aliasl Giao diện tương tự trên cùng một máy chủ. Ví dụ: gethostbyname_ex ['www.python.org'] trả về một cái gì đó như ['fang.python.org', ['www.python.org'], ['194.109.137.226']]. . gethostname []

Trả về tên máy chủ của máy cục bộ. gethostbyaddr [ip_address]

Trả về thông tin tương tự như gethostbyname_ex [], được cung cấp một địa chỉ IP, chẳng hạn như '132.151.1.90'. Nếu IP_Address là địa chỉ IPv6 như 'Fedc: BA98: 7654: 3210: Fedc: BA98: 7654: 3210', thông tin liên quan đến IPv6 sẽ được trả về. getNameInfo [địa chỉ, cờ]

Cho một địa chỉ ổ cắm, địa chỉ, chức năng này dịch địa chỉ thành 2-tuple [máy chủ, cổng], tùy thuộc vào giá trị của cờ. Tham số địa chỉ là một bộ thuật chỉ định một địa chỉ, ví dụ, ['www.python.org ', 80]. Cờ là bitwise hoặc của các hằng số sau:

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

475

Hằng số đặc biệt AF_UNSPEC có thể được sử dụng cho họ địa chỉ để tìm kiếm bất kỳ loại kết nối nào. Ví dụ: mã này có thông tin về bất kỳ kết nối giống TCP nào và có thể trả về thông tin cho IPv4 hoặc IPv6: >>> getAddrinfo ["www.python.org", "http", af_unspec, sock_stream] [[2.1, 6, '', ['194.109.137.226', 80]]]]

getaddrinfo [] được dành cho mục đích rất chung chung và có thể áp dụng cho tất cả các hỗ trợ-

Các giao thức mạng ED [IPv4, IPv6, v.v.]. Sử dụng nó nếu bạn quan tâm đến khả năng tương thích và hỗ trợ các giao thức trong tương lai, đặc biệt nếu bạn có ý định hỗ trợ IPv6. getDefaultTimeout []

Trả về thời gian chờ ổ cắm mặc định tính bằng giây. Giá trị của không cho biết rằng không có thời gian chờ đã được đặt. getfqdn [[name]]

Trả về tên miền đủ điều kiện của tên. Nếu tên bị bỏ qua, máy cục bộ được giả định. Ví dụ: getfqdn ["foo"] có thể trả về "foo.quasievil.org". gethostbyname [tên máy chủ]

Dịch một tên máy chủ, chẳng hạn như 'www.python.org' sang địa chỉ IPv4. Địa chỉ IP được trả về dưới dạng chuỗi, chẳng hạn như '132.151.1.90'. Nó không hỗ trợ IPv6. gethostbyname_ex [tên máy chủ]

Dịch tên máy chủ thành địa chỉ IPv4 nhưng trả về một tuple [tên máy chủ, danh sách bí danh, danh sách ipaddrlist] trong đó tên máy chủ là tên máy chủ chính, danh sách aliasl Giao diện tương tự trên cùng một máy chủ. Ví dụ: gethostbyname_ex ['www.python.org'] trả về một cái gì đó như ['fang.python.org', ['www.python.org'], ['194.109.137.226']]. . gethostname []

Trả về tên máy chủ của máy cục bộ. gethostbyaddr [ip_address]

Trả về thông tin tương tự như gethostbyname_ex [], được cung cấp một địa chỉ IP, chẳng hạn như '132.151.1.90'. Nếu IP_Address là địa chỉ IPv6 như 'Fedc: BA98: 7654: 3210: Fedc: BA98: 7654: 3210', thông tin liên quan đến IPv6 sẽ được trả về. getNameInfo [địa chỉ, cờ]

Cho một địa chỉ ổ cắm, địa chỉ, chức năng này dịch địa chỉ thành 2-tuple [máy chủ, cổng], tùy thuộc vào giá trị của cờ. Tham số địa chỉ là một bộ thuật chỉ định một địa chỉ, ví dụ, ['www.python.org ', 80]. Cờ là bitwise hoặc của các hằng số sau:

ổ cắm

Không thay đổi

Sự mô tả

F

H lib

fl

B

d

ff

476

Chương 21 Lập trình mạng và ổ cắm

Hằng số đặc biệt AF_UNSPEC có thể được sử dụng cho họ địa chỉ để tìm kiếm bất kỳ loại kết nối nào. Ví dụ: mã này có thông tin về bất kỳ kết nối giống TCP nào và có thể trả về thông tin cho IPv4 hoặc IPv6: >>> getAddrinfo ["www.python.org", "http", af_unspec, sock_stream] [[2.1, 6, '', ['194.109.137.226', 80]]]]

Chuyển đổi địa chỉ IPv4 đóng gói nhị phân thành một chuỗi sử dụng biểu diễn chấm tiêu chuẩn [ví dụ: '135.128.11.209']. Packedip là một chuỗi bốn ký tự chứa mã hóa 32 bit thô của địa chỉ IP. Hàm có thể hữu ích nếu nhận được địa chỉ từ C hoặc đang được giải nén từ cấu trúc dữ liệu. Nó không hỗ trợ IPv6. inet_ntop [địa chỉ_f Family, packed_ip]

Chuyển đổi một chuỗi nhị phân được đóng gói Đóng gói_IP đại diện cho địa chỉ mạng IP thành một chuỗi, chẳng hạn như '123.45.67,89'. Địa chỉ_f Family là họ địa chỉ và thường là AF_Inet hoặc AF_Inet6. Điều này có thể được sử dụng để có được chuỗi địa chỉ mạng từ bộ đệm của các byte thô [ví dụ: từ nội dung của gói mạng cấp thấp]. inet_pton [địa chỉ_f Family, IP_String]

Chuyển đổi một địa chỉ IP, chẳng hạn như '123.45.67,89' thành một chuỗi byte được đóng gói. Địa chỉ_f Family là họ địa chỉ và thường là AF_Inet hoặc AF_INET6. Điều này có thể được sử dụng nếu bạn đang cố gắng mã hóa một địa chỉ mạng thành gói dữ liệu nhị phân thô. ntohl [x]

Chuyển đổi số nguyên 32 bit từ mạng [Big-Endian] thành thứ tự byte. ntohs [x]

Chuyển đổi số nguyên 16 bit từ mạng [Big-Endian] thành đơn đặt hàng byte. setDefaultTimeout [thời gian chờ]

Đặt thời gian chờ mặc định cho các đối tượng ổ cắm mới được tạo. Thời gian chờ là một số điểm nổi được chỉ định tính bằng giây. Giá trị của không có thể được cung cấp để chỉ ra không có thời gian chờ [đây là mặc định]. Ổ cắm [gia đình, loại [, proto]]

Tạo một ổ cắm mới bằng cách sử dụng họ địa chỉ đã cho, loại ổ cắm và số giao thức. Gia đình là họ địa chỉ và loại là loại ổ cắm như được thảo luận trong phần đầu tiên của phần này. Để mở kết nối TCP, sử dụng ổ cắm [AF_INET, SOCK_STREAM]. Để mở kết nối UDP, sử dụng ổ cắm [AF_INET, SOCK_DGAM]. Hàm trả về một thể hiện của sockettype [được mô tả ngắn gọn]. Số giao thức thường bị bỏ qua [và mặc định là 0]. Điều này thường chỉ được sử dụng với ổ cắm thô [sock_raw] và được đặt thành một hằng số phụ thuộc vào họ địa chỉ được sử dụng. Danh sách sau đây cho thấy tất cả các số giao thức Python Có thể xác định cho AF_Inet và AF_Inet6, tùy thuộc vào tính khả dụng của chúng trên hệ thống máy chủ: không đổi

Sự mô tả

Ipproto_ah ipproto_bip ipproto_dstopts ipproto_egp

Tiêu đề xác thực IPv6 Banyan Vines IPv6 Tùy chọn đích đến giao thức cổng bên ngoài

F

H lib

fl

B

d

ff

ổ cắm

Không thay đổi

Sự mô tả

Ipproto_ah ipproto_bip ipproto_dstopts ipproto_egp

Tiêu đề xác thực IPv6 Banyan Vines IPv6 Tùy chọn đích đến giao thức cổng bên ngoài

F

477

H lib

Sự mô tả

Ipproto_ah ipproto_bip ipproto_dstopts ipproto_egp

Tiêu đề xác thực IPv6 Banyan Vines IPv6 Tùy chọn đích đến giao thức cổng bên ngoài

F

H lib

F

H lib

fl

B

d

ff

478

ổ cắm

Không thay đổi

Chấp nhận kết nối và trả về một cặp [Conn, địa chỉ], trong đó Conn là đối tượng ổ cắm mới có thể được sử dụng để gửi và nhận dữ liệu trên kết nối và địa chỉ là địa chỉ của ổ cắm ở đầu kia của kết nối. s.bind [địa chỉ]

Liên kết ổ cắm với một địa chỉ. Định dạng địa chỉ phụ thuộc vào họ địa chỉ. Trong hầu hết các trường hợp, nó là một bộ thuật của biểu mẫu [tên máy chủ, cổng]. Đối với các địa chỉ IP, chuỗi trống đại diện cho inAddr_any và chuỗi '' đại diện cho inaddr_broadcast.THE INADDR_ANY tên máy chủ [chuỗi trống] được sử dụng để chỉ ra rằng máy chủ cho phép kết nối trên bất kỳ giao diện Internet nào trên hệ thống. Điều này thường được sử dụng khi máy chủ được đa hóa. Tên máy chủ InADDR_BROADCAST ['' '] được sử dụng khi một ổ cắm được sử dụng để gửi tin nhắn phát sóng. s.close []

Đóng ổ cắm. Ổ cắm cũng được đóng lại khi chúng được thu thập rác. s.connect [địa chỉ]

Kết nối với một ổ cắm từ xa tại địa chỉ. Định dạng địa chỉ phụ thuộc vào họ địa chỉ, nhưng nó thường là một tuple [tên máy chủ, cổng]. Nó tăng socket.Error nếu xảy ra lỗi. Nếu bạn kết nối với một máy chủ trên cùng một máy tính, bạn có thể sử dụng tên 'LocalHost' làm tên máy chủ. s.connect_ex [địa chỉ]

Như Connect [địa chỉ], nhưng trả về 0 về thành công hoặc giá trị của errno khi thất bại. s.fileno []

Trả về bộ mô tả tập tin ổ cắm. s.getpeername []

Trả về địa chỉ từ xa mà ổ cắm được kết nối. Thông thường giá trị trả về là một tuple [iPaddr, cổng], nhưng điều này phụ thuộc vào gia đình địa chỉ đang được sử dụng. Điều này không được hỗ trợ trên tất cả các hệ thống. S.getSockName []

Trả về địa chỉ riêng của ổ cắm. Thông thường đây là một tuple [iPaddr, cổng]. S.GetSockOpt [Level, OptName [, Buflen]]

Trả về giá trị của tùy chọn ổ cắm. Cấp độ xác định mức của tùy chọn và là sol_socket cho các tùy chọn cấp ổ cắm hoặc số giao thức như ipproto_ip cho các tùy chọn liên quan đến giao thức. OptName chọn một tùy chọn cụ thể. Nếu Buflen bị bỏ qua, một tùy chọn số nguyên được giả định và giá trị nguyên của nó được trả về. Nếu Buflen được đưa ra, nó chỉ định độ dài tối đa của bộ đệm được sử dụng để nhận tùy chọn. Bộ đệm này là

F

H lib

fl

B

d

ff

ổ cắm

479

Được trả về dưới dạng chuỗi byte, trong đó nó lên đến người gọi để giải mã nội dung của nó bằng mô -đun cấu trúc hoặc các phương tiện khác. Các bảng sau liệt kê các tùy chọn ổ cắm được xác định bởi Python. Hầu hết các tùy chọn này được coi là một phần của API ổ cắm nâng cao và kiểm soát các chi tiết cấp thấp của mạng. Bạn sẽ cần tham khảo tài liệu khác để tìm các mô tả chi tiết hơn. Khi tên loại được liệt kê trong cột Giá trị, tên đó giống như Cấu trúc dữ liệu C tiêu chuẩn liên quan đến giá trị và được sử dụng trong giao diện lập trình ổ cắm tiêu chuẩn. Không phải tất cả các tùy chọn đều có sẵn trên tất cả các máy. Các tên tùy chọn sau đây thường được sử dụng cho cấp độ sol_socket: tên tùy chọn

Giá trị

SO_ACCEPTCONN

Xác định xem ổ cắm có chấp nhận kết nối hay không. 0, 1 cho phép gửi các datagram phát sóng. 0, 1 xác định xem thông tin gỡ lỗi có được ghi lại hay không. 0, 1 Bỏ qua Tra cứu bảng định tuyến. int nhận trạng thái lỗi. 0,1 ngăn các ổ cắm khác bị buộc phải bị ràng buộc với cùng một địa chỉ và cổng. Điều này vô hiệu hóa tùy chọn SO_REUSEADDR. 0, 1 định kỳ thăm dò đầu kia của kết nối và chấm dứt nếu nó nửa mở. Linger nán lại trên Close [] nếu bộ đệm gửi chứa dữ liệu. nán lại là một chuỗi nhị phân được đóng gói chứa hai số nguyên 32 bit [offoff, giây]. 0, 1 đặt dữ liệu ngoài băng vào hàng đợi đầu vào. Kích thước int của bộ đệm nhận [tính bằng byte]. Số byte int đọc trước khi chọn [] trả về ổ cắm là có thể đọc được. Thời gian chờ thời gian trên các cuộc gọi nhận trong vài giây. Thời gian là một chuỗi nhị phân được đóng gói chứa hai số nguyên không dấu 32 bit [giây, micro giây]. 0, 1 cho phép tái sử dụng địa chỉ địa phương. 0, 1 cho phép nhiều quy trình liên kết với cùng một địa chỉ miễn là tùy chọn ổ cắm này được đặt trong tất cả các quy trình. kích thước int của bộ đệm gửi [tính bằng byte]. Số lượng byte có sẵn trong bộ đệm gửi trước khi chọn [] trả về ổ cắm là có thể ghi. Thời gian chờ thời gian khi gửi cuộc gọi trong vài giây. Xem SO_RCVTIMEO để biết mô tả về thời gian. int get get socket loại. 0, 1 ổ cắm định tuyến nhận được bản sao của những gì nó gửi.

SO_BROADAST SO_DEBUG SO_Dontroute So_error SO_ExclusiveAddruse

SO_KEEPALIVE SO_LINGER

SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO

SO_REUSEADDR SO_REUSEPORT

SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK

Sự mô tả

0, 1

F

H lib

fl

B

d

ff

480

ổ cắm

Được trả về dưới dạng chuỗi byte, trong đó nó lên đến người gọi để giải mã nội dung của nó bằng mô -đun cấu trúc hoặc các phương tiện khác. Các bảng sau liệt kê các tùy chọn ổ cắm được xác định bởi Python. Hầu hết các tùy chọn này được coi là một phần của API ổ cắm nâng cao và kiểm soát các chi tiết cấp thấp của mạng. Bạn sẽ cần tham khảo tài liệu khác để tìm các mô tả chi tiết hơn. Khi tên loại được liệt kê trong cột Giá trị, tên đó giống như Cấu trúc dữ liệu C tiêu chuẩn liên quan đến giá trị và được sử dụng trong giao diện lập trình ổ cắm tiêu chuẩn. Không phải tất cả các tùy chọn đều có sẵn trên tất cả các máy. Các tên tùy chọn sau đây thường được sử dụng cho cấp độ sol_socket: tên tùy chọn

Giá trị

Sự mô tả

IP_ADD_Membership

IP_MREG

IP_Drop_Membership

IP_MREG

IP_Drop_Membership

IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF

int int in_addr

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

Ip_options

Ipopts

0,1

IP_RECVDSTADDR

IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS

0,1 0,1 0,1

IP_TOS IP_TTL

int int

Tham gia một nhóm phát đa hướng [chỉ đặt]. IP_MREG là một chuỗi nhị phân được đóng gói chứa hai địa chỉ IP 32 bit [multiaddr, localaddr], trong đó multiaddr là địa chỉ phát đa hướng và localaddr là IP của giao diện cục bộ đang được sử dụng. Để lại một nhóm phát đa hướng [chỉ đặt]. IP_MREG được mô tả ở trên. Tiêu đề IP đi kèm với dữ liệu. Số lượng tối đa của các nhóm phát đa hướng. Giao diện đi. IN_ADDR là một chuỗi nhị phân được đóng gói chứa địa chỉ IP 32 bit. Loopback. Thời gian để sống. Uint8 là một chuỗi nhị phân được đóng gói chứa char không dấu 1 byte. Tùy chọn tiêu đề IP. Ipopts là một chuỗi nhị phân được đóng gói không quá 44 byte. Nội dung của chuỗi này được mô tả trong RFC 791. Nhận địa chỉ đích IP với datagram. Nhận tất cả các tùy chọn IP với Datagram. Nhận tùy chọn IP với phản hồi. Giống như IP_RECVOPTS, để lại các tùy chọn chưa được xử lý mà không có tùy chọn Dấu thời gian hoặc Bản ghi tuyến đường được điền vào. Loại dịch vụ. Thời gian để sống.

Giá trị

Sự mô tả

IP_ADD_Membership

IP_MREG

IP_Drop_Membership

IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF

int int in_addr

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

Ip_options

Ipopts

IP_RECVDSTADDR

IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS

0,1 0,1 0,1

IP_TOS IP_TTL

int int

481

Tham gia một nhóm phát đa hướng [chỉ đặt]. IP_MREG là một chuỗi nhị phân được đóng gói chứa hai địa chỉ IP 32 bit [multiaddr, localaddr], trong đó multiaddr là địa chỉ phát đa hướng và localaddr là IP của giao diện cục bộ đang được sử dụng. Để lại một nhóm phát đa hướng [chỉ đặt]. IP_MREG được mô tả ở trên. Tiêu đề IP đi kèm với dữ liệu. Số lượng tối đa của các nhóm phát đa hướng. Giao diện đi. IN_ADDR là một chuỗi nhị phân được đóng gói chứa địa chỉ IP 32 bit. Loopback. Thời gian để sống. Uint8 là một chuỗi nhị phân được đóng gói chứa char không dấu 1 byte. Tùy chọn tiêu đề IP. Ipopts là một chuỗi nhị phân được đóng gói không quá 44 byte. Nội dung của chuỗi này được mô tả trong RFC 791. Nhận địa chỉ đích IP với datagram. Nhận tất cả các tùy chọn IP với Datagram. Nhận tùy chọn IP với phản hồi. Giống như IP_RECVOPTS, để lại các tùy chọn chưa được xử lý mà không có tùy chọn Dấu thời gian hoặc Bản ghi tuyến đường được điền vào. Loại dịch vụ. Thời gian để sống.

Giá trị

Sự mô tả

Các tùy chọn sau có sẵn cho cấp độ IPPROTO_IPV6: Tên tùy chọn

Ipv6_checksum ipv6_dontfrag

0,1 0,1

IPv6_dstopts

IP6_Dest

IPv6_Hoplimit IPv6_Hopopts

int ip6_hbh

Có hệ thống tính toán tổng kiểm tra. Don lồng các gói mảnh nếu chúng vượt quá kích thước MTU. Tùy chọn đích. IP6_Dest là một chuỗi nhị phân được đóng gói của biểu mẫu [tiếp theo, LEN, Tùy chọn] trong đó tiếp theo là một số nguyên 8 bit cung cấp loại tùy chọn của tiêu đề tiếp theo; Len là một số nguyên 8 bit chỉ định độ dài của tiêu đề theo đơn vị 8 byte, không bao gồm 8 byte đầu tiên; và các tùy chọn là các tùy chọn được mã hóa. Giới hạn hop. Các tùy chọn hop-by-hop. IP6_HBH có cùng mã hóa như IP6_Dest.

F

H lib

IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF

int int in_addr

0,1

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

Ip_options

0,1

Ip_options

Ipopts

IP_RECVDSTADDR

IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS

0,1 0,1 0,1

IP_TOS IP_TTL

482

int int

Tham gia một nhóm phát đa hướng [chỉ đặt]. IP_MREG là một chuỗi nhị phân được đóng gói chứa hai địa chỉ IP 32 bit [multiaddr, localaddr], trong đó multiaddr là địa chỉ phát đa hướng và localaddr là IP của giao diện cục bộ đang được sử dụng. Để lại một nhóm phát đa hướng [chỉ đặt]. IP_MREG được mô tả ở trên. Tiêu đề IP đi kèm với dữ liệu. Số lượng tối đa của các nhóm phát đa hướng. Giao diện đi. IN_ADDR là một chuỗi nhị phân được đóng gói chứa địa chỉ IP 32 bit. Loopback. Thời gian để sống. Uint8 là một chuỗi nhị phân được đóng gói chứa char không dấu 1 byte. Tùy chọn tiêu đề IP. Ipopts là một chuỗi nhị phân được đóng gói không quá 44 byte. Nội dung của chuỗi này được mô tả trong RFC 791. Nhận địa chỉ đích IP với datagram. Nhận tất cả các tùy chọn IP với Datagram. Nhận tùy chọn IP với phản hồi. Giống như IP_RECVOPTS, để lại các tùy chọn chưa được xử lý mà không có tùy chọn Dấu thời gian hoặc Bản ghi tuyến đường được điền vào. Loại dịch vụ. Thời gian để sống.

Giá trị

Sự mô tả

Các tùy chọn sau có sẵn cho cấp độ IPPROTO_IPV6: Tên tùy chọn

IP_MREG

IP_Drop_Membership

IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF

int int in_addr

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

IP_TOS IP_TTL

int int

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

IP_MREG

IP_Drop_Membership

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

Ip_multicast_loop ip_multicast_ttl

0,1 uint8

s.gettimeout []

Trả về giá trị thời gian chờ hiện tại nếu có. Trả về một số điểm nổi tính bằng giây hoặc không có nếu không có thời gian chờ được đặt. S.IOCTL [điều khiển, tùy chọn]

Cung cấp quyền truy cập hạn chế vào giao diện WSAIOCTL trên Windows. Giá trị chỉ được hỗ trợ để kiểm soát là SIO_RCVALL được sử dụng để nắm bắt tất cả các gói IP đã nhận được trên mạng. Điều này yêu cầu truy cập quản trị viên.

Sự mô tả

RCVALL_OFF

Ngăn chặn ổ cắm nhận tất cả các gói IPv4 hoặc IPv6. Kích hoạt chế độ bừa bãi, cho phép ổ cắm nhận tất cả các gói IPv4 hoặc IPv6 trên mạng. Loại gói nhận được phụ thuộc vào gia đình địa chỉ ổ cắm. Điều này không thu được các gói liên quan đến các giao thức mạng khác như ARP. Nhận tất cả các gói IP nhận được trên mạng, nhưng không cho phép chế độ lăng nhăng. Điều này sẽ nắm bắt tất cả các gói IP được hướng vào máy chủ cho bất kỳ địa chỉ IP được định cấu hình nào.

Rcvall_on

RCVALL_IPLEVEL

F

H lib

fl

B

d

ff

ổ cắm

483

S.Listen [Backlog]

Bắt đầu lắng nghe các kết nối đến. Backlog Chỉ định số lượng kết nối đang chờ xử lý tối đa mà hệ điều hành sẽ xếp hàng trước khi kết nối bị từ chối. Giá trị phải ít nhất là 1, với 5 là đủ cho hầu hết các ứng dụng. s.makefile [[chế độ [, bufsize]]]]

Tạo một đối tượng tệp được liên kết với ổ cắm. MODE và BUFSIZE có cùng ý nghĩa như với hàm Open in [] tích hợp. Đối tượng tệp sử dụng phiên bản trùng lặp của bộ mô tả tệp ổ cắm Độc lập được thu thập rác. Ổ cắm không nên có thời gian chờ và không nên được cấu hình ở chế độ không chặn. s.recv [bufsize [, cờ]]

Nhận dữ liệu từ ổ cắm. Dữ liệu được trả về dưới dạng chuỗi. Lượng dữ liệu tối đa được nhận được chỉ định bởi BufSize. Cờ cung cấp thông tin bổ sung về tin nhắn và thường bị bỏ qua [trong trường hợp đó nó mặc định là 0]. Nếu được sử dụng, nó thường được đặt thành một trong các hằng số sau [phụ thuộc vào hệ thống]: hằng số

Sự mô tả

RCVALL_OFF

Ngăn chặn ổ cắm nhận tất cả các gói IPv4 hoặc IPv6. Kích hoạt chế độ bừa bãi, cho phép ổ cắm nhận tất cả các gói IPv4 hoặc IPv6 trên mạng. Loại gói nhận được phụ thuộc vào gia đình địa chỉ ổ cắm. Điều này không thu được các gói liên quan đến các giao thức mạng khác như ARP. Nhận tất cả các gói IP nhận được trên mạng, nhưng không cho phép chế độ lăng nhăng. Điều này sẽ nắm bắt tất cả các gói IP được hướng vào máy chủ cho bất kỳ địa chỉ IP được định cấu hình nào.

Rcvall_on

RCVALL_IPLEVEL

F

H lib

fl

F

H lib

fl

B

d

ff

484

ổ cắm

S.Listen [Backlog]

Bắt đầu lắng nghe các kết nối đến. Backlog Chỉ định số lượng kết nối đang chờ xử lý tối đa mà hệ điều hành sẽ xếp hàng trước khi kết nối bị từ chối. Giá trị phải ít nhất là 1, với 5 là đủ cho hầu hết các ứng dụng. s.makefile [[chế độ [, bufsize]]]]

Tạo một đối tượng tệp được liên kết với ổ cắm. MODE và BUFSIZE có cùng ý nghĩa như với hàm Open in [] tích hợp. Đối tượng tệp sử dụng phiên bản trùng lặp của bộ mô tả tệp ổ cắm Độc lập được thu thập rác. Ổ cắm không nên có thời gian chờ và không nên được cấu hình ở chế độ không chặn. s.recv [bufsize [, cờ]]

Nhận dữ liệu từ ổ cắm. Dữ liệu được trả về dưới dạng chuỗi. Lượng dữ liệu tối đa được nhận được chỉ định bởi BufSize. Cờ cung cấp thông tin bổ sung về tin nhắn và thường bị bỏ qua [trong trường hợp đó nó mặc định là 0]. Nếu được sử dụng, nó thường được đặt thành một trong các hằng số sau [phụ thuộc vào hệ thống]: hằng số

Msg_dontroute msg_dontwait msg_eor

Đặt giá trị của tùy chọn ổ cắm đã cho. Cấp độ và OptName có cùng ý nghĩa như đối với getSockopt []. Giá trị có thể là một số nguyên hoặc một chuỗi đại diện cho nội dung của bộ đệm. Trong trường hợp sau, nó lên đến người gọi để đảm bảo rằng chuỗi chứa dữ liệu phù hợp. Xem getSockopt [] để biết tên, giá trị và mô tả tùy chọn ổ cắm. s.settimeout [thời gian chờ]

Đặt thời gian chờ trên các hoạt động ổ cắm. Thời gian chờ là một số điểm nổi tính bằng giây. Giá trị của không có nghĩa là không có thời gian chờ. Nếu thời gian chờ xảy ra, ngoại lệ của ổ cắm.timeout được nâng lên. Theo nguyên tắc chung, thời gian chờ phải được đặt ngay khi một ổ cắm được tạo vì chúng có thể được áp dụng cho các hoạt động liên quan đến việc thiết lập kết nối [như Connect []]. S.Shutdown [Làm thế nào]

Tắt một hoặc cả hai nửa của kết nối. Nếu làm thế nào là 0, tiếp tục nhận được không được phép. Nếu làm thế nào là 1, các gửi thêm được không được phép. Nếu làm thế nào là 2, các gửi và nhận thêm sẽ không được phép. Ngoài các phương thức này, một phiên bản ổ cắm s cũng có các thuộc tính chỉ đọc sau đây tương ứng với các đối số được truyền đến hàm ổ cắm []. Tài sản

Sự mô tả

S.F Family S.Proto S.Type

Họ địa chỉ ổ cắm [ví dụ: AF_INET] Giao thức ổ cắm loại ổ cắm [ví dụ: sock_stream]

F

H lib

fl

B

d

ff

ổ cắm

485

Các ngoại lệ Các ngoại lệ sau được xác định bởi mô -đun ổ cắm. lỗi

Ngoại lệ này được nâng lên cho các lỗi liên quan đến ổ cắm hoặc địa chỉ. Nó trả về một cặp [errno, mesg] với lỗi được trả về bởi cuộc gọi hệ thống cơ bản. Kế thừa từ ioerror. Herror

Lỗi nêu ra cho các lỗi liên quan đến địa chỉ. Trả về một tuple [Herrno, HMESG] chứa một số lỗi và thông báo lỗi. Kế thừa từ lỗi. Gaierror

Lỗi được nêu đối với các lỗi liên quan đến địa chỉ trong các hàm getAddrinfo [] và getNameInfo [] errno được đặt thành một trong các hằng số sau được xác định trong mô -đun ổ cắm: hằng số

Sự mô tả

S.F Family S.Proto S.Type

Họ địa chỉ ổ cắm [ví dụ: AF_INET] Giao thức ổ cắm loại ổ cắm [ví dụ: sock_stream]

F

H lib

fl

F

H lib

fl

B

d

ff

ổ cắm

486

Các ngoại lệ Các ngoại lệ sau được xác định bởi mô -đun ổ cắm. lỗi

Ngoại lệ này được nâng lên cho các lỗi liên quan đến ổ cắm hoặc địa chỉ. Nó trả về một cặp [errno, mesg] với lỗi được trả về bởi cuộc gọi hệ thống cơ bản. Kế thừa từ ioerror. Herror

Lỗi nêu ra cho các lỗi liên quan đến địa chỉ. Trả về một tuple [Herrno, HMESG] chứa một số lỗi và thông báo lỗi. Kế thừa từ lỗi. Gaierror

Lỗi nêu ra cho các lỗi liên quan đến địa chỉ. Trả về một tuple [Herrno, HMESG] chứa một số lỗi và thông báo lỗi. Kế thừa từ lỗi. Gaierror

Lỗi được nêu đối với các lỗi liên quan đến địa chỉ trong các hàm getAddrinfo [] và getNameInfo [] errno được đặt thành một trong các hằng số sau được xác định trong mô -đun ổ cắm: hằng số

SSL Mô -đun SSL được sử dụng để bọc các đối tượng ổ cắm với lớp ổ cắm an toàn [SSL], cung cấp mã hóa dữ liệu và xác thực ngang hàng. Python sử dụng thư viện OpenSSL [//www.openssl.org] để thực hiện mô -đun này. Một cuộc thảo luận đầy đủ liên quan đến lý thuyết và hoạt động của SSL nằm ngoài phạm vi của những gì có thể được đề cập ở đây. Vì vậy, chỉ các yếu tố thiết yếu của việc sử dụng mô -đun này được đề cập ở đây với giả định rằng bạn biết bạn đang làm gì khi nói đến cấu hình SSL, khóa, chứng chỉ và các vấn đề liên quan khác: WRAP_SOCKET [Sock [, ** Opts]]

Kết thúc một sock ổ cắm hiện có [được tạo bởi mô -đun ổ cắm] với hỗ trợ SSL và trả về một thể hiện của SSLSocket. Hàm này nên được sử dụng trước khi các hoạt động kết nối [] hoặc chấp nhận [] tiếp theo được thực hiện. OPTS đại diện cho một số đối số từ khóa được sử dụng để chỉ định dữ liệu cấu hình bổ sung.

F

H lib

fl

B

d

ff

SSL

Từ khóa đối số

487

Sự mô tả

Một lá cờ Boolean cho biết liệu ổ cắm có hoạt động như một máy chủ [đúng] hay máy khách [sai] hay không. Theo mặc định, điều này là sai. KEYFILE Tệp chính được sử dụng để xác định phía cục bộ của kết nối. Đây phải là một tệp định dạng PEM và thường chỉ bao gồm nếu tệp được chỉ định với certfile không bao gồm khóa. Certfile Tệp chứng chỉ được sử dụng để xác định phía cục bộ của kết nối. Đây phải là một tệp định dạng PEM. cert_reqs chỉ định liệu chứng chỉ có được yêu cầu từ phía bên kia của kết nối hay không và liệu nó có được xác thực hay không. Giá trị của cert_none có nghĩa là các chứng chỉ bị bỏ qua, cert_optional có nghĩa là không bắt buộc chứng chỉ nhưng sẽ được xác thực nếu được cung cấp và cert_required có nghĩa là cần có chứng chỉ và sẽ được xác thực. Nếu chứng chỉ sẽ được xác thực, tham số CA_CERTS cũng phải được cung cấp. CA_CERTS Tên tệp của giấy chứng nhận cấp tài liệu được sử dụng để xác thực. Phiên bản giao thức SSL SSL_Version để sử dụng. Các giá trị có thể là protucol_tlsv1, protucol_sslv2, protucol_sslv23 hoặc protocol_sslv3. Giao thức mặc định là Protocol_SSLV3. DO_HANDSHAKE_ON_CONNECT Cờ Boolean chỉ định xem có bắt tay SSL hay không được thực hiện tự động trên Connect. Theo mặc định, điều này là đúng. urpress_ragged_eofs Chỉ định cách đọc [] xử lý một EOF bất ngờ trên kết nối. Nếu đúng [mặc định], EOF bình thường được báo hiệu. Nếu sai, một ngoại lệ được nâng lên. server_side

Một thể hiện s của SSLSocket kế thừa từ ổ cắm.socket và hỗ trợ thêm các hoạt động sau: s.codes []

Trả về một tuple [tên, phiên bản, secretbits] trong đó tên là tên mật mã đang được sử dụng, phiên bản là giao thức SSL và SecretBits là số lượng bit bí mật đang được sử dụng. s.do_handshake []

Thực hiện bắt tay SSL. Thông thường, điều này được thực hiện tự động trừ khi tùy chọn DO_HANDSHAKE_ON_CONNECT được đặt thành sai trong hàm wrap_socket []. Nếu ổ cắm bên dưới là không chặn, ngoại lệ SSLError sẽ được nâng lên nếu thao tác không thể hoàn thành. được thực hiện. Để tiếp tục quá trình bắt tay sau khi đọc hoặc viết có thể tiếp tục, chỉ cần gọi lại s.do_handshake [].

F

H lib

fl

B

d

ff

488

SSL

Từ khóa đối số

Sự mô tả

Một lá cờ Boolean cho biết liệu ổ cắm có hoạt động như một máy chủ [đúng] hay máy khách [sai] hay không. Theo mặc định, điều này là sai. KEYFILE Tệp chính được sử dụng để xác định phía cục bộ của kết nối. Đây phải là một tệp định dạng PEM và thường chỉ bao gồm nếu tệp được chỉ định với certfile không bao gồm khóa. Certfile Tệp chứng chỉ được sử dụng để xác định phía cục bộ của kết nối. Đây phải là một tệp định dạng PEM. cert_reqs chỉ định liệu chứng chỉ có được yêu cầu từ phía bên kia của kết nối hay không và liệu nó có được xác thực hay không. Giá trị của cert_none có nghĩa là các chứng chỉ bị bỏ qua, cert_optional có nghĩa là không bắt buộc chứng chỉ nhưng sẽ được xác thực nếu được cung cấp và cert_required có nghĩa là cần có chứng chỉ và sẽ được xác thực. Nếu chứng chỉ sẽ được xác thực, tham số CA_CERTS cũng phải được cung cấp. CA_CERTS Tên tệp của giấy chứng nhận cấp tài liệu được sử dụng để xác thực. Phiên bản giao thức SSL SSL_Version để sử dụng. Các giá trị có thể là protucol_tlsv1, protucol_sslv2, protucol_sslv23 hoặc protocol_sslv3. Giao thức mặc định là Protocol_SSLV3. DO_HANDSHAKE_ON_CONNECT Cờ Boolean chỉ định xem có bắt tay SSL hay không được thực hiện tự động trên Connect. Theo mặc định, điều này là đúng. urpress_ragged_eofs Chỉ định cách đọc [] xử lý một EOF bất ngờ trên kết nối. Nếu đúng [mặc định], EOF bình thường được báo hiệu. Nếu sai, một ngoại lệ được nâng lên. server_side

Một thể hiện s của SSLSocket kế thừa từ ổ cắm.socket và hỗ trợ thêm các hoạt động sau: s.codes []

Trả về một tuple [tên, phiên bản, secretbits] trong đó tên là tên mật mã đang được sử dụng, phiên bản là giao thức SSL và SecretBits là số lượng bit bí mật đang được sử dụng. s.do_handshake []

Thực hiện bắt tay SSL. Thông thường, điều này được thực hiện tự động trừ khi tùy chọn DO_HANDSHAKE_ON_CONNECT được đặt thành sai trong hàm wrap_socket []. Nếu ổ cắm bên dưới là không chặn, ngoại lệ SSLError sẽ được nâng lên nếu thao tác không thể hoàn thành. được thực hiện. Để tiếp tục quá trình bắt tay sau khi đọc hoặc viết có thể tiếp tục, chỉ cần gọi lại s.do_handshake [].

Chương 21 Lập trình mạng và ổ cắm

Đưa ra một chuỗi PEMString chứa phiên bản chuỗi được mã hóa PEM của chứng chỉ, trả về phiên bản chuỗi byte được mã hóa der của chứng chỉ. get_server_certificate [addr [, ssl_version [, ca_certs]]]]

Lấy giấy chứng nhận của máy chủ SSL và trả về nó dưới dạng chuỗi được mã hóa PEM. ADDR là một địa chỉ của biểu mẫu [tên máy chủ, cổng]. SSL_Version là số phiên bản SSL và CA_CERTS là tên của một tệp chứa chứng chỉ chứng chỉ như được mô tả cho hàm wrap_socket []. Rand_status []

Trả về đúng hoặc sai nếu lớp SSL nghĩ rằng trình tạo số giả đã được gieo hạt đủ ngẫu nhiên. Rand_egd [đường dẫn]

Đọc 256 byte của tính ngẫu nhiên từ một trình nền thu thập entropy và thêm nó vào trình tạo số giả. Đường dẫn là tên của một ổ cắm miền Unix cho daemon. Rand_add [byte, entropy]

Thêm các byte trong chuỗi byte byte vào trình tạo số giả. Entropy là một số điểm nổi không âm cho giới hạn dưới trên entropy.

F

H lib

fl

B

d

ff

Máy chủ lưu trữ

489

Các ví dụ Ví dụ sau đây cho thấy cách sử dụng mô-đun này để mở kết nối SSL-Client: Nhập ổ cắm, SSL s = socket.socket [socket.af_inet, socket.sock_stream] ssl_s = ssl.wrap_socket [s] ssl_s.connect [' gmail.google.com ', 443]] in [ssl_s.cipher []] # Gửi yêu cầu ssl_s.write [b "get / http / 1.0 \ r \ n \ r \ n"] data = ssl_s.read [] nếu không dữ liệu: break in [dữ liệu] ssl_s.close []

Dưới đây là một ví dụ về máy chủ thời gian được bảo mật SSL: Nhập ổ cắm, SSL, Thời gian S = socket.socket [socket.af_inet, socket.sock_stream] S.SetSockopt [socket.sol_socket, socket.so_reuseaddr, 1] S.Bind [ . "TimeCert.pem"] client_ssl.sendall [b "http/1.0 200 ok \ r \ n"] client_ssl.sendall [B "Kết nối: Đóng \ r \ n"] client_ssl.sendall [b " Plain \ r \ n \ r \ n "] resp = Time.ctime [] +" \ r \ n "client_ssl.sendall [resp.encode ['latin-1']] client_ssl.close [] client.close []

Để chạy máy chủ này, bạn sẽ cần phải có chứng chỉ máy chủ đã ký trong tệp TimeCert.pem. Đối với mục đích kiểm tra, bạn có thể tạo một bản bằng lệnh UNIX này: % openSSL req

Để kiểm tra máy chủ này, hãy thử kết nối với trình duyệt bằng URL, chẳng hạn như ' // localhost: 1234'. Nếu nó hoạt động, trình duyệt sẽ đưa ra thông báo cảnh báo về bạn bằng chứng chỉ tự ký. Nếu bạn đồng ý, bạn sẽ thấy đầu ra của máy chủ.

Socketserver Mô -đun này được gọi là socketserver trong Python 3. Mô -đun máy chủ socketserver cung cấp các lớp đơn giản hóa việc triển khai các máy chủ ổ cắm miền TCP, UDP và UNIX.

F

H lib

fl

B

d

ff

490

Máy chủ lưu trữ

Các ví dụ Ví dụ sau đây cho thấy cách sử dụng mô-đun này để mở kết nối SSL-Client: Nhập ổ cắm, SSL s = socket.socket [socket.af_inet, socket.sock_stream] ssl_s = ssl.wrap_socket [s] ssl_s.connect [' gmail.google.com ', 443]] in [ssl_s.cipher []] # Gửi yêu cầu ssl_s.write [b "get / http / 1.0 \ r \ n \ r \ n"] data = ssl_s.read [] nếu không dữ liệu: break in [dữ liệu] ssl_s.close []

Dưới đây là một ví dụ về máy chủ thời gian được bảo mật SSL: Nhập ổ cắm, SSL, Thời gian S = socket.socket [socket.af_inet, socket.sock_stream] S.SetSockopt [socket.sol_socket, socket.so_reuseaddr, 1] S.Bind [ . "TimeCert.pem"] client_ssl.sendall [b "http/1.0 200 ok \ r \ n"] client_ssl.sendall [B "Kết nối: Đóng \ r \ n"] client_ssl.sendall [b " Plain \ r \ n \ r \ n "] resp = Time.ctime [] +" \ r \ n "client_ssl.sendall [resp.encode ['latin-1']] client_ssl.close [] client.close []

Để chạy máy chủ này, bạn sẽ cần phải có chứng chỉ máy chủ đã ký trong tệp TimeCert.pem. Đối với mục đích kiểm tra, bạn có thể tạo một bản bằng lệnh UNIX này: % openSSL req

Để kiểm tra máy chủ này, hãy thử kết nối với trình duyệt bằng URL, chẳng hạn như ' // localhost: 1234'. Nếu nó hoạt động, trình duyệt sẽ đưa ra thông báo cảnh báo về bạn bằng chứng chỉ tự ký. Nếu bạn đồng ý, bạn sẽ thấy đầu ra của máy chủ.

Socketserver Mô -đun này được gọi là socketserver trong Python 3. Mô -đun máy chủ socketserver cung cấp các lớp đơn giản hóa việc triển khai các máy chủ ổ cắm miền TCP, UDP và UNIX.

Chương 21 Lập trình mạng và ổ cắm

Nếu bạn biết rằng một trình xử lý sẽ chỉ hoạt động trên các kết nối định hướng luồng như TCP, hãy kế thừa từ StreamRequestHandler thay vì cơ bản và H.RFILE là một đối tượng giống như tệp đọc dữ liệu từ máy khách. Dưới đây là một ví dụ: Hãy thử: Từ SocketServer Nhập StreamRequestHandler ngoại trừ Bộ nhập khẩu

# Python 3 # Python 2

F

H lib

fl

B

d

ff

Máy chủ lưu trữ

491

Lớp Timeserver [StreamRequestHandler]: def xử lý [self]: resp = Time.ctime [] + "\ r \ n" self.wfile.write [resp.encode ['latin-1']]

Nếu bạn đang viết một trình xử lý chỉ hoạt động với các gói và luôn gửi phản hồi lại cho người gửi, hãy thừa kế từ DatagramRequestHandler thay vì cơ bản. Nó cung cấp cùng một giao diện giống như tệp như StreamRequestHandler. Ví dụ: Hãy thử: Từ SocketServer Nhập DataGramRequestHandler ngoại trừ Bộ nhập khẩu: Từ SocketServer Nhập DatagramRequestHandler Thời gian nhập khẩu

# Python 3 # Python 2

F

H lib

fl

B

d

ff

Máy chủ lưu trữ

Lớp Timeserver [StreamRequestHandler]: def xử lý [self]: resp = Time.ctime [] + "\ r \ n" self.wfile.write [resp.encode ['latin-1']]

Nếu bạn đang viết một trình xử lý chỉ hoạt động với các gói và luôn gửi phản hồi lại cho người gửi, hãy thừa kế từ DatagramRequestHandler thay vì cơ bản. Nó cung cấp cùng một giao diện giống như tệp như StreamRequestHandler. Ví dụ: Hãy thử: Từ SocketServer Nhập DataGramRequestHandler ngoại trừ Bộ nhập khẩu: Từ SocketServer Nhập DatagramRequestHandler Thời gian nhập khẩu

Lớp Timeserver [DatagramRequestHandler]: DEF Tay cầm [self]:

H lib

fl

B

d

ff

492

Máy chủ lưu trữ

Lớp Timeserver [StreamRequestHandler]: def xử lý [self]: resp = Time.ctime [] + "\ r \ n" self.wfile.write [resp.encode ['latin-1']]

Nếu bạn đang viết một trình xử lý chỉ hoạt động với các gói và luôn gửi phản hồi lại cho người gửi, hãy thừa kế từ DatagramRequestHandler thay vì cơ bản. Nó cung cấp cùng một giao diện giống như tệp như StreamRequestHandler. Ví dụ: Hãy thử: Từ SocketServer Nhập DataGramRequestHandler ngoại trừ Bộ nhập khẩu: Từ SocketServer Nhập DatagramRequestHandler Thời gian nhập khẩu

Lớp Timeserver [DatagramRequestHandler]: DEF Tay cầm [self]:

Trong trường hợp này, tất cả các dữ liệu được ghi vào self.wfile được thu thập vào một gói duy nhất được trả về sau khi phương thức xử lý [] trả về.

Máy chủ để sử dụng trình xử lý, nó phải được cắm vào đối tượng máy chủ. Có bốn lớp máy chủ cơ bản được xác định: TCPSERVER [Địa chỉ, Trình xử lý]

Một máy chủ hỗ trợ giao thức TCP bằng IPv4. Địa chỉ là một tuple của biểu mẫu [máy chủ, cổng]. Handler là một ví dụ của một lớp con của lớp cơ bản được mô tả sau. Udpserver [địa chỉ, người xử lý]

Một máy chủ hỗ trợ giao thức UDP Internet bằng IPv4. Địa chỉ và người xử lý giống như đối với tcpserver []. Unixstreamserver [địa chỉ, người xử lý]

Một máy chủ thực hiện một giao thức định hướng luồng bằng cách sử dụng ổ cắm miền UNIX. Kế thừa từ tcpserver. UnixDatagramServer [địa chỉ, người xử lý]

Một máy chủ đang triển khai giao thức Datagram bằng cách sử dụng ổ cắm miền Unix. Điều này kế thừa từ UDPServer. Các thể hiện của tất cả bốn lớp máy chủ có các phương thức cơ bản sau: s.fileno []

Trả về bộ mô tả tệp số nguyên cho ổ cắm máy chủ. Sự hiện diện của phương thức này làm cho nó hợp pháp để sử dụng các phiên bản máy chủ với các hoạt động bỏ phiếu như hàm select []. s.serve_forever []

Xử lý một số lượng vô hạn các yêu cầu.

F

H lib

fl

B

d

ff

Máy chủ lưu trữ

493

Lớp Timeserver [StreamRequestHandler]: def xử lý [self]: resp = Time.ctime [] + "\ r \ n" self.wfile.write [resp.encode ['latin-1']]

Nếu bạn đang viết một trình xử lý chỉ hoạt động với các gói và luôn gửi phản hồi lại cho người gửi, hãy thừa kế từ DatagramRequestHandler thay vì cơ bản. Nó cung cấp cùng một giao diện giống như tệp như StreamRequestHandler. Ví dụ: Hãy thử: Từ SocketServer Nhập DataGramRequestHandler ngoại trừ Bộ nhập khẩu: Từ SocketServer Nhập DatagramRequestHandler Thời gian nhập khẩu

Thời gian chờ trong vài giây mà máy chủ chờ đợi một yêu cầu mới. Khi hết thời gian, máy chủ gọi phương thức xử lý_timeout [] [được mô tả bên dưới] và quay lại chờ. Thời gian chờ này không được sử dụng để đặt thời gian chờ ổ cắm. Tuy nhiên, nếu thời gian chờ ổ cắm đã được đặt, giá trị của nó được sử dụng thay vì giá trị này. Dưới đây là một ví dụ về cách tạo một máy chủ cho phép số cổng được sử dụng lại: từ Socketserver Nhập TCPServer Class Timeserver [tcpserver]: allow_reuse_address = true Serv = Timeserver [['', 10000, TimeHandler] Serv.serve_forver []

Nếu muốn, các phương thức sau là hữu ích nhất để mở rộng trong các lớp kế thừa từ một trong các máy chủ. Nếu bạn xác định bất kỳ phương thức nào trong máy chủ của riêng bạn, hãy đảm bảo bạn gọi cùng một phương thức trong siêu lớp. Server.activate []

Phương thức thực hiện thao tác nghe [] trên máy chủ. Ổ cắm máy chủ được tham chiếu là self.socket. Server.bind []

Phương thức thực hiện thao tác BIND [] trên máy chủ. Server.handle_error [Yêu cầu, client_address]

Phương pháp xử lý các ngoại lệ chưa được thực hiện trong xử lý. Để có thông tin về ngoại lệ cuối cùng, hãy sử dụng sys.exc_info [] hoặc các chức năng trong mô -đun TraceBack. Server.handle_timeout []

Phương thức được gọi là khi thời gian chờ máy chủ xảy ra. Bằng cách xác định lại phương thức này và điều chỉnh cài đặt thời gian chờ, bạn có thể tích hợp xử lý khác vào vòng lặp sự kiện máy chủ. Server.verify_request [Yêu cầu, client_address]

Xác định lại phương thức này nếu bạn muốn xác minh kết nối trước khi xử lý thêm. Đây là những gì bạn xác định nếu bạn muốn thực hiện tường lửa hoặc thực hiện một số loại xác thực khác. Cuối cùng, các tính năng của máy chủ bổ sung có sẵn thông qua việc sử dụng các lớp mixin. Đây là cách đồng thời thông qua các luồng hoặc xử lý forking được thêm

Một lớp mixin thêm quy trình unix vào máy chủ, cho phép nó phục vụ nhiều máy khách. Biến lớp Max_children điều khiển số lượng trẻ em tối đa

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

494

Các quy trình và biến hết thời gian xác định thời gian trôi qua giữa các lần thử thu thập các quy trình zombie. Một biến thể hiện Active_children theo dõi số lượng quá trình hoạt động đang chạy. ThreadingMixin

Một lớp mixin sửa đổi một máy chủ để nó có thể phục vụ nhiều máy khách với các luồng. Không có giới hạn được đặt trên số lượng luồng có thể được tạo. Theo mặc định, các luồng không phải là Daemonic trừ khi biến lớp Daemon_Threads được đặt thành true. Để thêm các tính năng này vào máy chủ, bạn sử dụng nhiều kế thừa trong đó lớp mixin được liệt kê trước. Ví dụ: đây là một máy chủ thời gian forking: Từ máy chủ socketserver nhập tcpserver, forkingmixin class Timeserver [forkingmixin, tcpserver]: allow_reuse_address = true max_childRe

Vì các máy chủ đồng thời là tương đối phổ biến, Socketserver xác định trước các lớp máy chủ sau cho mục đích này. N

Forkingudpserver [địa chỉ, người xử lý]

N

Forkingtcpserver [địa chỉ, người xử lý]

N

Forkingtcpserver [địa chỉ, người xử lý]

N

Forkingtcpserver [địa chỉ, người xử lý]

Threadingudpserver [địa chỉ, người xử lý]

ThreadingTcpserver [địa chỉ, người xử lý]

Các lớp này thực sự chỉ được xác định theo các lớp mixin và máy chủ. Ví dụ: đây là định nghĩa của forkingtcpserver: class forkingtcpserver [forkingmixin, tcpserver]: Pass Pass

Tùy chỉnh các máy chủ ứng dụng Các mô-đun thư viện khác thường sử dụng lớp SocketServer để triển khai các máy chủ cho các giao thức cấp ứng dụng như HTTP và XML-RPC.Those Máy chủ cũng có thể được tùy chỉnh thông qua kế thừa và mở rộng các phương thức được xác định cho hoạt động máy chủ cơ bản. Ví dụ, đây là máy chủ XML-RPC forking chỉ chấp nhận các kết nối có nguồn gốc trên giao diện loopback: Hãy thử: từ XMLRPC.Server Nhập đơn giản

F

H lib

fl

B

d

ff

Chương 21 Lập trình mạng và ổ cắm

495

Các quy trình và biến hết thời gian xác định thời gian trôi qua giữa các lần thử thu thập các quy trình zombie. Một biến thể hiện Active_children theo dõi số lượng quá trình hoạt động đang chạy. ThreadingMixin

Một lớp mixin sửa đổi một máy chủ để nó có thể phục vụ nhiều máy khách với các luồng. Không có giới hạn được đặt trên số lượng luồng có thể được tạo. Theo mặc định, các luồng không phải là Daemonic trừ khi biến lớp Daemon_Threads được đặt thành true. Để thêm các tính năng này vào máy chủ, bạn sử dụng nhiều kế thừa trong đó lớp mixin được liệt kê trước. Ví dụ: đây là một máy chủ thời gian forking: Từ máy chủ socketserver nhập tcpserver, forkingmixin class Timeserver [forkingmixin, tcpserver]: allow_reuse_address = true max_childRe

To test the rejection of connections, try the same code, but from a different machine on the network. For this, you will need to replace “localhost” with the hostname of the machine that’s running the server.

F

h Lib

fL

B

d

ff

This page intentionally left blank

F

h Lib

fL

B

d

ff

22 Internet Application Programming T

his chapter describes modules related to Internet application protocols including HTTP, XML-RPC, FTP, and SMTP.Web programming topics such as CGI scripting are covered in Chapter 23, “Web Programming.” Modules related to dealing with common Internet-related data formats are covered in Chapter 24, “Internet Data Handling and Encoding.” The organization of network-related library modules is one area where there are significant differences between Python 2 and 3. In the interest of looking forward, this chapter assumes the Python 3 library organization because it is more logical. However, the functionality provided by the library modules is virtually identical between Python versions as of this writing.When applicable, Python 2 module names are noted in each section.

ftplib The ftplib module implements the client side of the FTP protocol. It’s rarely necessary to use this module directly because the urllib package provides a higher-level interface. However, this module may still be useful if you want to have more control over the low-level details of an FTP connection. In order to use this module, it may be helpful to know some of the details of the FTP protocol which is described in Internet RFC 959. A single class is defined for establishing an FTP connection: FTP[[host [, user [, passwd [, acct [, timeout]]]]]]

Creates an object representing an FTP connection. host is a string specifying a host name. user, passwd, and acct optionally specify a username, password, and account. If no arguments are given, the connect[] and login[] methods must be called explicitly to initiate the actual connection. If host is given, connect[] is automatically invoked. If user, passwd, and acct are given, login[] is invoked. timeout is a timeout period in seconds. An instance f of FTP has the following methods: f.abort[]

Attempts to abort a file transfer that is in progress.This may or may not work depending the remote server.

F

h Lib

fL

B

d

ff

498

Chapter 22 Internet Application Programming

f.close[]

Closes the FTP connection. After this has been invoked, no further operations can be performed on the FTP object f. f.connect[host [, port [, timeout]]]

Opens an FTP connection to a given host and port. host is a string specifying the host name. port is the integer port number of the FTP server and defaults to port 21. timeout is the timeout period in seconds. It is not necessary to call this if a host name was already given to FTP[]. f.cwd[pathname]

Changes the current working directory on the server to pathname. f.delete[filename]

Removes the file filename from the server. f.dir[[dirname [, ... [, callback]]]]

Generates a directory listing as produced by the 'LIST' command. dirname optionally supplies the name of a directory to list. In addition, if any additional arguments are supplied, they are simply passed as additional arguments to 'LIST’. If the last argument callback is a function, it is used as a callback function to process the returned directory listing data.This callback function works in the same way as the callback used by the retrlines[] method. By default, this method prints the directory list to sys.stdout. f.login[[user, [passwd [, acct]]]]

Logs in to the server using the specified username, password, and account. user is a string giving the username and defaults to 'anonymous'. passwd is a string containing the password and defaults to the empty string ''. acct is a string and defaults to the empty string. It is not necessary to call this method if this information was already given to FTP[]. f.mkd[pathname]

Creates a new directory on the server. f.ntransfercmd[command [, rest]]

The same as transfercmd[] except that a tuple [sock, size] is returned where sock is a socket object corresponding to the data connection and size is the expected size of the data in bytes, or None if the size could not be determined. f.pwd[]

Returns a string containing the current working directory on the server. f.quit[]

Closes the FTP connection by sending the 'QUIT' command to the server. f.rename[oldname,newname]

Renames a file on the server.

F

h Lib

fL

B

d

ff

ftplib

499

f.retrbinary[command, callback [, blocksize [, rest]]]

Returns the results of executing a command on the server using binary transfer mode. command is a string that specifies the appropriate file retrieval command and is almost always 'RETR filename'. callback is a callback function that is invoked each time a block of data is received.This callback function is invoked with a single argument which is the received data in the form of a string. blocksize is the maximum block size to use and defaults to 8192 bytes. rest is an optional offset into the file. If supplied, this specifies the position in the file where you want to start the transfer. However, this is not supported by all FTP servers so this may result in an error_reply exception. f.retrlines[command [, callback]]

Trả về kết quả thực hiện lệnh trên máy chủ bằng chế độ chuyển văn bản. Lệnh là một chuỗi chỉ định lệnh và thường là một cái gì đó giống như 'ret filename. Callback là một hàm gọi lại được gọi mỗi khi nhận được một dòng dữ liệu. Hàm gọi lại này được gọi với một đối số duy nhất là một chuỗi chứa dữ liệu nhận được. Nếu cuộc gọi lại bị bỏ qua, dữ liệu được trả về được in thành sys.stdout. f.rmd [tên đường dẫn]

Xóa một thư mục khỏi máy chủ. f.sendcmd [lệnh]

Gửi một lệnh đơn giản đến máy chủ và trả về phản hồi của máy chủ. Lệnh là một chuỗi chứa lệnh. Phương thức này chỉ nên được sử dụng cho các lệnh không liên quan đến việc chuyển dữ liệu. f.set_pasv [PASV]

Đặt chế độ thụ động. PASV là một lá cờ Boolean bật chế độ thụ động nếu đúng hoặc tắt nếu sai. Theo mặc định, chế độ thụ động được bật. f.size [tên tệp]

Trả về kích thước của tên tệp trong byte. Trả lại không nếu kích thước có thể được xác định vì một số lý do. f.storbinary [lệnh, tệp [, blocksize]]

Thực thi lệnh trên máy chủ và truyền dữ liệu bằng chế độ chuyển nhị phân. Lệnh là một chuỗi chỉ định lệnh cấp thấp. Nó hầu như luôn luôn được đặt thành 'lưu trữ tên tệp', trong đó tên tệp là tên của một tệp bạn muốn đặt trên máy chủ. Tệp là một đối tượng tệp mở mà dữ liệu sẽ được đọc bằng File.Read [BlockSize] và được chuyển sang máy chủ. BlockSize là khối khối để sử dụng trong quá trình chuyển. Theo mặc định, nó là 8192 byte. f.storlines [lệnh, tệp]

Thực thi lệnh trên máy chủ và chuyển dữ liệu bằng chế độ chuyển văn bản. Lệnh là một chuỗi chỉ định lệnh cấp thấp. Nó thường là 'lưu trữ tên tệp'. Tệp là một đối tượng tệp mở mà dữ liệu sẽ được đọc bằng File.Readline [] và được gửi đến máy chủ.

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

500

f.transfercmd [lệnh [, rest]]

Bắt đầu chuyển qua kết nối dữ liệu FTP. Nếu chế độ hoạt động đang được sử dụng, điều này sẽ gửi lệnh 'cổng' hoặc 'EPRT' và chấp nhận kết nối kết quả từ máy chủ. Nếu chế độ thụ động đang được sử dụng, điều này sẽ gửi lệnh 'EPSV' hoặc 'PASV' theo sau là kết nối với máy chủ. Trong cả hai trường hợp, một khi kết nối dữ liệu đã được thiết lập, lệnh FTP trong lệnh sau đó được phát hành. Hàm này trả về một đối tượng ổ cắm tương ứng với kết nối dữ liệu mở. Tham số REST tùy chọn chỉ định một byte bắt đầu bù vào các tệp được yêu cầu trên máy chủ. Tuy nhiên, điều này không được hỗ trợ trên tất cả các máy chủ và có thể dẫn đến ngoại lệ ERROR_REPLY.

Ví dụ Ví dụ sau đây cho thấy cách sử dụng mô -đun này để tải tệp lên máy chủ FTP: tên tệp tên người dùng tên tin

= = = =

"ftp.foo.com" "Dave" "1235" "somerfile.dat"

Nhập ftplib ftp_serv = ftplib.ftp [host, tên người dùng, mật khẩu] # Mở tệp bạn muốn gửi f = open [tên tệp, "rb"] # Gửi nó đến máy chủ FTP , f] # Đóng kết nối ftp_serv.close

Để tìm nạp các tài liệu từ máy chủ FTP, hãy sử dụng gói Urllib. Ví dụ: Hãy thử: Từ Urllib.Request Nhập Urlopen ngoại trừ Bộ nhập khẩu: Từ Urllib2 Nhập Urlopen

# Python 3 # Python 2

u = urlopen ["ftp: // tên người dùng: [email & nbsp; được bảo vệ]/somefile"] nội dung = U.Read []

HTTP

Bưu kiện

Gói HTTP bao gồm các mô-đun để viết máy khách và máy chủ HTTP cũng như hỗ trợ quản lý trạng thái [cookie]. Giao thức chuyển siêu văn bản [HTTP] là giao thức dựa trên văn bản đơn giản hoạt động như sau: 1. Máy khách kết nối với kết nối với kết nối với Máy chủ HTTP và gửi tiêu đề yêu cầu của biểu mẫu sau: Get /Document.html HTTP/1.0 Kết nối: Agent-Alive-Agent: Mozilla/4.61 [EN] [X11; U; Sunos 5.6 Sun4u] .uchicago.edu: 8000 Chấp nhận: hình ảnh/gif, hình ảnh/x-xbitmap, hình ảnh/jpeg, hình ảnh/pjpeg, hình ảnh/png, */ * Chấp nhận-mã hóa: GZIP ACCEP -1,*, UTF-8

Dữ liệu tùy chọn ...

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

501

f.transfercmd [lệnh [, rest]]

Dữ liệu ...

Dòng đầu tiên của phản hồi máy chủ cho biết phiên bản giao thức HTTP, mã thành công và thông báo trả về. Theo dòng phản hồi là một loạt các trường tiêu đề chứa thông tin về loại tài liệu được trả về, kích thước tài liệu, phần mềm máy chủ web, cookie, v.v. tài liệu được yêu cầu. Các phương thức yêu cầu sau đây là phương pháp phổ biến nhất: phương thức

Sự mô tả

Nhận bài đăng PUT PUT

Nhận một tài liệu. Đăng dữ liệu lên một biểu mẫu. Chỉ trả lại thông tin tiêu đề. Tải dữ liệu lên máy chủ.

Các mã phản hồi được chi tiết trong Bảng 22.1 được trả về nhất bởi các máy chủ. Cột hằng số biểu tượng là tên của một biến được xác định trước trong http.client giữ giá trị mã phản hồi số nguyên và có thể được sử dụng trong mã để cải thiện khả năng đọc. Bảng 22.1

Mã số

Mã phản hồi thường được trả về bởi các máy chủ Mô tả

Hằng số biểu tượng

Mã thành công [2xx] 200 201 202 204

Được tạo ra không được chấp nhận không có nội dung

Được tạo ra đã chấp nhận no_content

Chuyển hướng [3xx] 300 301 302 303

Nhiều lựa chọn được di chuyển vĩnh viễn di chuyển tạm thời không được sửa đổi

Nhiều_choices di chuyển_permanenty di chuyển_tempory not_modified

F

H lib

fl

B

d

ff

502

Chương 22 Lập trình ứng dụng Internet

Bảng 22.1

Mã số

Mã phản hồi thường được trả về bởi các máy chủ Mô tả

Hằng số biểu tượng

Mã thành công [2xx] 200 201 202 204

Được tạo ra không được chấp nhận không có nội dung

Được tạo ra đã chấp nhận no_content

Chuyển hướng [3xx] 300 301 302 303

Nhiều lựa chọn được di chuyển vĩnh viễn di chuyển tạm thời không được sửa đổi

Nhiều_choices di chuyển_permanenty di chuyển_tempory not_modified

F

H lib

fl

B

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

503

Bảng 22.1

Tiếp tục mô tả

Lỗi máy khách [4xx] 400 401 403 404

Yêu cầu xấu không được tìm thấy không được tìm thấy

Bad_Request trái phép Forbidden not_found

Gửi tiêu đề kiểu RFC-822, đến máy chủ. Nó gửi một dòng đến máy chủ, bao gồm tiêu đề, dấu hai chấm và một không gian và giá trị. Các đối số bổ sung được mã hóa dưới dạng các dòng tiếp tục trong tiêu đề. Tăng ngoại lệ không thể làm nếu H không ở trong trạng thái cho phép các tiêu đề được gửi. H.endheaders []

Gửi một dòng trống đến máy chủ, cho biết phần cuối của các dòng tiêu đề. H.Request [Phương pháp, url [, cơ thể [, tiêu đề]]]]

Gửi một yêu cầu HTTP hoàn chỉnh đến máy chủ. Phương thức và URL có ý nghĩa tương tự như đối với h.putRequest []. Body là một chuỗi tùy chọn chứa dữ liệu để tải lên máy chủ sau khi yêu cầu đã được gửi. Nếu cơ thể được cung cấp, độ dài ngữ cảnh: Tiêu đề sẽ tự động được đặt thành một giá trị thích hợp. Tiêu đề là một tiêu đề chứa từ điển: các cặp giá trị được đưa ra cho phương thức h.putheader []. H.GetResponse []

Nhận phản hồi từ máy chủ và trả về một thể hiện HTTPResponse có thể được sử dụng để đọc dữ liệu. Tăng một ngoại lệ trả lời nếu H không ở trong trạng thái mà sẽ nhận được phản hồi. Một phiên bản httpresponse, r, được trả về bởi phương thức getResponse [], hỗ trợ các phương thức sau:

F

H lib

fl

B

d

ff

504

Chương 22 Lập trình ứng dụng Internet

R.Read [[kích thước]]

Đọc lên đến kích thước byte từ máy chủ. Nếu kích thước bị bỏ qua, tất cả dữ liệu cho yêu cầu này được trả về. R.Getheader [Tên [, mặc định]]

Nhận một tiêu đề phản hồi. Tên là tên của tiêu đề. Mặc định là giá trị mặc định để trả về nếu không tìm thấy tiêu đề. r.getheaders []

Trả về một danh sách các bộ dữ liệu [tiêu đề, giá trị]. Một phiên bản httpresponse r cũng có các thuộc tính sau: R.Version

Phiên bản HTTP được sử dụng bởi máy chủ. R.Status

Mã trạng thái HTTP được trả về bởi máy chủ. R.REASY

Thông báo lỗi HTTP được trả về bởi máy chủ. r.length

Số byte còn lại trong phản hồi.

Các ngoại lệ Các ngoại lệ sau đây có thể được nêu ra trong quá trình xử lý các kết nối Ngoại lệ

Sự mô tả

Httpexception NotConnected InvalIdURL UnknownProtocol UnknownTransferencoding UnmplementedFileMode không hoàn thành BADSTATUSLINE

Lớp cơ sở của tất cả các lỗi liên quan đến HTTP. Yêu cầu đã được thực hiện nhưng không được kết nối. URL xấu hoặc số cổng được đưa ra. Số giao thức HTTP không xác định. Mã hóa chuyển nhượng không xác định. Chế độ tập tin không được thực hiện. Dữ liệu không đầy đủ nhận được. Mã trạng thái không xác định nhận được.

Các ngoại lệ sau đây có liên quan đến trạng thái kết nối HTTP/1.1. Vì HTTP/1.1 cho phép nhiều yêu cầu/phản hồi được gửi qua một kết nối duy nhất, nên các quy tắc bổ sung được áp đặt khi nào yêu cầu có thể được gửi và phản hồi nhận được. Thực hiện các hoạt động theo thứ tự sai sẽ tạo ra một ngoại lệ. Ngoại lệ

Sự mô tả

Httpexception NotConnected InvalIdURL UnknownProtocol UnknownTransferencoding UnmplementedFileMode không hoàn thành BADSTATUSLINE

Lớp cơ sở của tất cả các lỗi liên quan đến HTTP. Yêu cầu đã được thực hiện nhưng không được kết nối. URL xấu hoặc số cổng được đưa ra. Số giao thức HTTP không xác định. Mã hóa chuyển nhượng không xác định. Chế độ tập tin không được thực hiện. Dữ liệu không đầy đủ nhận được. Mã trạng thái không xác định nhận được.

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

505

R.Read [[kích thước]]

Đọc lên đến kích thước byte từ máy chủ. Nếu kích thước bị bỏ qua, tất cả dữ liệu cho yêu cầu này được trả về. R.Getheader [Tên [, mặc định]]

Nhận một tiêu đề phản hồi. Tên là tên của tiêu đề. Mặc định là giá trị mặc định để trả về nếu không tìm thấy tiêu đề. r.getheaders []

F

H lib

fl

B

d

ff

506

Chương 22 Lập trình ứng dụng Internet

# Gửi tất cả các phần biểu mẫu cho s trong các biểu mẫu: Conn.Send [s.encode ['latin-1']] không . Các trường biểu mẫu 'Tên', 'Email' # 'File_1', 'File_2', v.v. là những gì máy chủ từ xa đang mong đợi [rõ ràng điều này sẽ thay đổi]. server = ['localhost', 8080] url = '/cgi-bin/upload.py' formFields = {'name': 'Dave', 'email': '[email & nbsp; Hay

http.server [baseHttpserver, cgihttpserver, simpleHttpserver] Mô -đun http.server cung cấp các lớp khác nhau để triển khai các máy chủ HTTP. Trong Python 2, nội dung của mô -đun này được phân chia trên ba mô -đun thư viện: BaseHttpserver, CgiHttpserver và SimpleHttpserver.

Httpserver Lớp sau đây thực hiện một máy chủ HTTP cơ bản. Trong Python 2, nó nằm trong mô -đun BaseHttpserver. Httpserver [server_address, request_handler]

Tạo một đối tượng Httpserver mới. Server_Address là một tuple của biểu mẫu [máy chủ, cổng] mà máy chủ sẽ nghe. request_handler là một lớp xử lý có nguồn gốc từ BaseHttprequestHandler, được mô tả sau. Httpserver kế thừa trực tiếp từ tcpserver được xác định trong mô -đun socketserver. Vì vậy, nếu bạn muốn tùy chỉnh hoạt động của máy chủ HTTP theo bất kỳ cách nào, bạn

F

H lib

fl

B

d

ff

Gói HTTP

507

kế thừa từ httpserver và mở rộng nó. Đây là cách bạn sẽ xác định một máy chủ HTTP đa luồng chỉ chấp nhận kết nối từ một mạng con cụ thể: Hãy thử: từ http.server nhập httpserver từ socketserver nhập luồng

# Python 3

# Python 2

class myhttpserver [ThreadingMixin, httpserver]: def _ _init_ _ [self, addr, handler, subnet]: httpserver._ _init_ _ [self, addr, handler] , port = client_address nếu không hosts.startswith [mạng con]: Trả về return false httpserver.verify_request [self, request, client_address] # Ví dụ về cách máy chủ chạy Serv = myhttpserver [['', 8080] . '] serv.serve_forever []

Lớp HTTPServer chỉ liên quan đến giao thức HTTP cấp thấp. Để có máy chủ thực sự làm bất cứ điều gì, bạn phải cung cấp một lớp xử lý. Có hai trình xử lý tích hợp và một lớp cơ sở có thể được sử dụng để xác định tùy chỉnh của riêng bạn Xử lý. Những điều này được mô tả tiếp theo.

SimpleHTTPrequestHandler và CGIHTTPRequestHandler Hai lớp xử lý máy chủ web được đặt sẵn có thể được sử dụng nếu bạn muốn nhanh chóng thiết lập một máy chủ web độc lập đơn giản. Các lớp này hoạt động độc lập với bất kỳ máy chủ web nào của bên thứ ba như Apache. CGIHTTPrequestHandler [Yêu cầu, Client_Address, Server]

Phục vụ các tệp từ thư mục hiện tại và tất cả các thư mục con của nó. Ngoài ra, trình xử lý sẽ chạy một tệp dưới dạng tập lệnh CGI nếu nó nằm trong thư mục CGI đặc biệt [được xác định bởi biến lớp CGI_Directories được đặt thành ['/cgi-bin', '/htbin'] theo mặc định]. Handler hỗ trợ nhận, đầu và phương pháp bài. Tuy nhiên, nó không hỗ trợ chuyển hướng HTTP [mã HTTP 302], giới hạn việc sử dụng nó chỉ là các ứng dụng CGI đơn giản hơn. Đối với mục đích bảo mật, các tập lệnh CGI được thực thi với một UID của không ai. Trong Python 2, lớp này được xác định trong mô -đun CGIHTTPSERVER. SimpleHttprequestHandler [Yêu cầu, Client_Address, Server]

Phục vụ các tệp từ thư mục hiện tại và tất cả các thư mục con của nó. Lớp cung cấp hỗ trợ cho đầu và nhận các yêu cầu, tương ứng. Tất cả các trường hợp ngoại lệ của ioError dẫn đến lỗi "404 không tìm thấy tệp". Cố gắng truy cập một thư mục kết quả trong lỗi danh sách "403 thư mục không được hỗ trợ". Trong Python 2, lớp này được xác định trong mô -đun SimpleHttpserver. Cả hai trình xử lý này đều xác định các biến lớp sau có thể được thay đổi thông qua kế thừa nếu muốn: handler.server_version

Chuỗi phiên bản máy chủ được trả lại cho khách hàng. Theo mặc định, điều này được đặt thành một chuỗi, chẳng hạn như 'SimpleHttp/0,6'.

F

H lib

fl

B

d

ff

508

Gói HTTP

kế thừa từ httpserver và mở rộng nó. Đây là cách bạn sẽ xác định một máy chủ HTTP đa luồng chỉ chấp nhận kết nối từ một mạng con cụ thể: Hãy thử: từ http.server nhập httpserver từ socketserver nhập luồng

# Python 3

BaseHttprequestHandler Lớp BaseHttPrequestHandler là một lớp cơ sở mà sử dụng nếu bạn muốn xác định xử lý máy chủ HTTP tùy chỉnh của riêng mình. Các trình xử lý được xây dựng sẵn như SimpleHttPrequestHandler và CGIHTTPrequestHandler kế thừa từ điều này. Trong Python 2, lớp này được xác định trong mô -đun BaseHttpserver. BaseHttprequestHandler [Yêu cầu, Client_Address, Server]

Lớp xử lý cơ sở được sử dụng để xử lý các yêu cầu HTTP. Khi nhận được kết nối, các tiêu đề yêu cầu và HTTP được phân tích cú pháp. Sau đó, một nỗ lực được thực hiện để thực hiện một phương thức của biểu mẫu do_request dựa trên loại yêu cầu. Ví dụ: phương thức 'get' gọi do_get [] và phương thức 'bài đăng' gọi do_post. Theo mặc định, lớp này không làm gì cả, vì vậy các phương pháp này được dự kiến ​​sẽ được xác định trong các lớp con. Các biến lớp sau được xác định cho BaseHttprequestHandler và có thể được xác định lại trong các lớp con. BaseHttPrequestHandler.Server_Version

Chỉ định chuỗi phiên bản phần mềm máy chủ mà máy chủ báo cáo cho máy khách, ví dụ, 'servername/1.2'. BaseHttPrequestHandler.SYS_Version

Phiên bản hệ thống Python, chẳng hạn như 'Python/2.6'. BaseHttPrequestHandler.Error_Message_Format

Chuỗi định dạng được sử dụng để xây dựng các thông báo lỗi được gửi đến máy khách. Chuỗi định dạng được áp dụng cho một từ điển chứa mã thuộc tính, thông báo và giải thích. Ví dụ: '' 'phản hồi lỗi

Phản hồi lỗi

Mã lỗi %[Mã] d.

Tin nhắn: %[Tin nhắn] s.

Mã lỗi Giải thích: %[mã] s = %[giải thích] s. '' '

F

H lib

fl

B

d

ff

Gói HTTP

509

BaseHttPrequestHandler.Protocol_Version

Phiên bản giao thức HTTP được sử dụng trong các phản hồi. Mặc định là 'http/1.0'. BaseHttPrequestHandler.Responses

Ánh xạ mã lỗi HTTP số nguyên thành các bộ dữ liệu hai phần tử [thông báo, giải thích] mô tả vấn đề. Ví dụ: Mã số nguyên 404 được ánh xạ tới ["Không tìm thấy", "Không có gì phù hợp với URI đã cho"]. Mã số nguyên và chuỗi trong ánh xạ này được sử dụng khi tạo các thông báo lỗi như được xác định trong thuộc tính ERROR_Message_Format được hiển thị trước đó. Khi được tạo để xử lý một kết nối, một thể hiện, B, của basehttprequesthandler có các thuộc tính sau: thuộc tính

Sự mô tả

B.Client_address B.Command B.Path B.Request_Version B.Headers

Địa chỉ khách hàng dưới dạng tuple [máy chủ, cổng]. Loại yêu cầu, chẳng hạn như 'get', 'post', 'head', v.v. Đường dẫn yêu cầu như '/index.html'. Chuỗi phiên bản HTTP từ yêu cầu, chẳng hạn như 'http/1.0'. Các tiêu đề HTTP được lưu trữ trong một đối tượng ánh xạ. Để kiểm tra hoặc trích xuất nội dung của tiêu đề, hãy sử dụng các hoạt động từ điển như Headername trong B.Headers hoặc Headerval = B.Headers [Headername]. Luồng đầu vào để đọc dữ liệu đầu vào tùy chọn. Điều này được sử dụng khi máy khách đang tải lên dữ liệu [ví dụ: trong yêu cầu POST]. Luồng đầu ra để viết phản hồi lại cho khách hàng.

B.Rfile

B.wfile

Các phương pháp sau đây thường được sử dụng hoặc xác định lại trong các lớp con: B.Send_error [mã [, tin nhắn]]

Gửi phản hồi cho một yêu cầu không thành công. Mã là mã phản hồi HTTP số. Thông báo là một thông báo lỗi tùy chọn. log_error [] được gọi để ghi lại lỗi. Phương thức này tạo ra phản hồi lỗi hoàn chỉnh bằng cách sử dụng biến lớp ERROR_MESSAGE_FORMAT, gửi nó cho máy khách và đóng kết nối. Không có hoạt động nào nên được thực hiện sau khi gọi cái này. B.Send_Response [mã [, tin nhắn]]

Gửi phản hồi cho một yêu cầu thành công. Dòng phản hồi HTTP được gửi, theo sau là tiêu đề máy chủ và ngày. Mã là mã phản hồi HTTP và tin nhắn là một thông báo tùy chọn. log_request [] được gọi để ghi lại yêu cầu. B.Send_header [từ khóa, giá trị]

Viết một mục tiêu đề MIME vào luồng đầu ra. Từ khóa là từ khóa tiêu đề và giá trị là giá trị của nó. Điều này chỉ nên được gọi sau khi send_response []. B.end_headers []

Gửi một dòng trống để báo hiệu phần cuối của các tiêu đề MIME.

F

H lib

fl

B

d

ff

510

Gói HTTP

BaseHttPrequestHandler.Protocol_Version

Phiên bản giao thức HTTP được sử dụng trong các phản hồi. Mặc định là 'http/1.0'. BaseHttPrequestHandler.Responses

Ánh xạ mã lỗi HTTP số nguyên thành các bộ dữ liệu hai phần tử [thông báo, giải thích] mô tả vấn đề. Ví dụ: Mã số nguyên 404 được ánh xạ tới ["Không tìm thấy", "Không có gì phù hợp với URI đã cho"]. Mã số nguyên và chuỗi trong ánh xạ này được sử dụng khi tạo các thông báo lỗi như được xác định trong thuộc tính ERROR_Message_Format được hiển thị trước đó. Khi được tạo để xử lý một kết nối, một thể hiện, B, của basehttprequesthandler có các thuộc tính sau: thuộc tính

Sự mô tả

# PY 3 # PY 2

Class DicTrequestHandler [BaseHttprequestHandler]: def _ _init_ _ [self, thedict,*args, ** kwargs]: self.thedict = thedict base = self.Path [1:] # dải hàng đầu '/' nếu không phải là khóa trong self.thedict: self.send_error [404, "không có khóa như vậy"] loại ',' text/plain '] self.end_headers [] resp = "key: % s \ n" % key resp resp.encode ['latin-1']] # ví dụ sử dụng d = {'name': 'Dave', 'giá trị': [1,2,3,4,5], 'email': '[Email & nbsp; được bảo vệ ] '} Từ functools nhập một phần phục vụ = httpserver [["", 9000], part [dictrequestHandler, d]]

Để kiểm tra ví dụ này, hãy chạy máy chủ và sau đó nhập một URL như // localhost: 9000/name hoặc // localhost: 9000/giá trị vào trình duyệt. Nếu nó hoạt động, bạn sẽ thấy nội dung của từ điển được hiển thị. Ví dụ này cũng cho thấy một kỹ thuật làm thế nào để đưa máy chủ vào các lớp xử lý khởi tạo với các tham số bổ sung. Thông thường, các máy chủ tạo trình xử lý bằng cách sử dụng một tập hợp các đối số được xác định trước được chuyển đến _ _init_ _ []. Nếu bạn muốn thêm các tham số bổ sung, hãy sử dụng hàm functools.partial [] như được hiển thị. Điều này tạo ra một đối tượng có thể gọi được bao gồm tham số bổ sung của bạn nhưng bảo tồn chữ ký gọi mà máy chủ mong đợi.

F

H lib

fl

B

d

ff

Gói HTTP

511

http.cookies [cookie] Mô-đun http.cookies cung cấp hỗ trợ phía máy chủ để làm việc với cookie HTTP. Trong Python 2, mô -đun được gọi là cookie. Cookie được sử dụng để cung cấp quản lý trạng thái trong các máy chủ triển khai các phiên, đăng nhập người dùng và các tính năng liên quan. Để thả cookie trên trình duyệt của người dùng, máy chủ HTTP thường thêm tiêu đề HTTP tương tự như sau vào phản hồi Set-Cookie: phiên = 8273612; hết hạn = Mặt trời, 18-Feb-2001 15:00:00 GMT; \ path =/; tên miền = foo.bar.com

Ngoài ra, cookie có thể được đặt bằng cách nhúng JavaScript vào phần của tài liệu HTML:

Mô-đun HTTP.Cookies đơn giản hóa nhiệm vụ tạo các giá trị cookie bằng cách cung cấp một đối tượng giống như từ điển đặc biệt lưu trữ và quản lý các bộ sưu tập các giá trị cookie được gọi là morsels. Mỗi morsel có một tên, một giá trị và một tập hợp các thuộc tính tùy chọn chứa siêu dữ liệu được cung cấp cho trình duyệt {hết hạn, đường dẫn, nhận xét, miền, độ tuổi tối đa, an toàn, phiên bản, httponly}. Tên thường là trình nhận dạng đơn giản chẳng hạn như "Tên" và không được giống như một trong các tên siêu dữ liệu như "Hết hạn" hoặc "Đường dẫn". Giá trị thường là một chuỗi ngắn. Để tạo cookie, chỉ cần tạo một đối tượng cookie như thế này: c = c = SimpleCookie []

Tiếp theo, giá trị cookie [morsels] có thể được đặt bằng cách sử dụng gán từ điển thông thường: C ["Phiên"] = 8273612 C ["user"] = "beazley"

Các thuộc tính bổ sung của một trường hợp cụ thể được đặt như sau: c ["phiên"] ["đường dẫn"] = "/" c ["session"] ["domain"] = "foo.bar.com" C ["phiên" ] ["Hết hạn"] = "18-Feb-2001 15:00:00 GMT"

Để tạo đầu ra đại diện cho dữ liệu cookie như một tập hợp các tiêu đề HTTP, hãy sử dụng phương thức c.Output []. Ví dụ: in [c.Output []] # tạo hai dòng đầu ra # set-cookie: session = 8273612; hết hạn = ...; đường dẫn =/; Domain = ... # set-cookie: user = beazley

Khi trình duyệt gửi cookie trở lại máy chủ HTTP, nó được mã hóa dưới dạng chuỗi các cặp khóa = giá trị, chẳng hạn như "session = 8273612; user = beazley". Các thuộc tính tùy chọn như hết hạn, đường dẫn và miền không được trả về. Chuỗi cookie thường có thể được tìm thấy trong biến môi trường http_cookie, có thể được đọc bởi các ứng dụng CGI. .

Các tài liệu sau đây mô tả đối tượng SimpleCookie chi tiết hơn.

F

H lib

fl

B

d

ff

512

Gói HTTP

http.cookies [cookie] Mô-đun http.cookies cung cấp hỗ trợ phía máy chủ để làm việc với cookie HTTP. Trong Python 2, mô -đun được gọi là cookie. Cookie được sử dụng để cung cấp quản lý trạng thái trong các máy chủ triển khai các phiên, đăng nhập người dùng và các tính năng liên quan. Để thả cookie trên trình duyệt của người dùng, máy chủ HTTP thường thêm tiêu đề HTTP tương tự như sau vào phản hồi Set-Cookie: phiên = 8273612; hết hạn = Mặt trời, 18-Feb-2001 15:00:00 GMT; \ path =/; tên miền = foo.bar.com

Ngoài ra, cookie có thể được đặt bằng cách nhúng JavaScript vào phần của tài liệu HTML:

Mô-đun HTTP.Cookies đơn giản hóa nhiệm vụ tạo các giá trị cookie bằng cách cung cấp một đối tượng giống như từ điển đặc biệt lưu trữ và quản lý các bộ sưu tập các giá trị cookie được gọi là morsels. Mỗi morsel có một tên, một giá trị và một tập hợp các thuộc tính tùy chọn chứa siêu dữ liệu được cung cấp cho trình duyệt {hết hạn, đường dẫn, nhận xét, miền, độ tuổi tối đa, an toàn, phiên bản, httponly}. Tên thường là trình nhận dạng đơn giản chẳng hạn như "Tên" và không được giống như một trong các tên siêu dữ liệu như "Hết hạn" hoặc "Đường dẫn". Giá trị thường là một chuỗi ngắn. Để tạo cookie, chỉ cần tạo một đối tượng cookie như thế này: c = c = SimpleCookie []

Tiếp theo, giá trị cookie [morsels] có thể được đặt bằng cách sử dụng gán từ điển thông thường: C ["Phiên"] = 8273612 C ["user"] = "beazley"

Tải Cookie C với dữ liệu được tìm thấy trong RawData. Nếu RawData là một chuỗi, thì nó được giả định ở cùng định dạng với biến môi trường http_cookie trong chương trình CGI. Nếu RawData là một từ điển, mỗi cặp giá trị khóa được giải thích bằng cách đặt c [key] = value. Trong nội bộ, các cặp khóa/giá trị được sử dụng để lưu trữ giá trị cookie là các trường hợp của lớp vỏ. Một ví dụ, m, của morsel hoạt động như một từ điển và cho phép "hết hạn", "đường dẫn", "bình luận", "miền", "max-age", "an toàn", "phiên bản" và "httponly" được thiết lập. Ngoài ra, morsel m có các phương pháp và thuộc tính sau: M.Value

Một chuỗi chứa giá trị thô của cookie. M.Coded_Value

Một chuỗi chứa giá trị được mã hóa của cookie sẽ được gửi đến hoặc nhận được từ trình duyệt. M.Key

Tên cookie. M.SET [khóa, giá trị, mã hóa_value]

Đặt các giá trị của M.Key, M.Value và M.Coded_Value được hiển thị trước đó. M.isreservedkey [K]

Các kiểm tra xem K có phải là từ khóa dành riêng hay không, chẳng hạn như "hết hạn", "đường dẫn", "miền", v.v. M.Output [[attrs [, tiêu đề]]]]

Sản xuất chuỗi tiêu đề HTTP cho món này. ATTRS là một danh sách tùy chọn các thuộc tính bổ sung để bao gồm ["hết hạn", "đường dẫn", v.v.]. Tiêu đề là chuỗi tiêu đề để sử dụng ['set-cookie:' theo mặc định]. m.js_output [[attrs]]

Đầu ra mã JavaScript đặt cookie khi được thực thi.

F

H lib

fl

B

d

ff

Smtplib

513

M.OutputString [[attrs]]

Trả về chuỗi cookie mà không có bất kỳ tiêu đề HTTP hoặc mã JavaScript nào.

Ngoại lệ Nếu xảy ra lỗi trong quá trình phân tích cú pháp hoặc tạo giá trị cookie, ngoại lệ cookieerror được nêu ra.

http.cookiejar [Cookielib] Mô-đun http.cookiejar cung cấp hỗ trợ phía máy khách để lưu trữ và quản lý cookie HTTP. Trong Python 2, mô -đun được gọi là Cookielib. Vai trò chính của mô -đun này là cung cấp các đối tượng trong đó cookie HTTP có thể được lưu trữ để chúng có thể được sử dụng cùng với gói Urllib, được sử dụng để truy cập tài liệu trên Internet. Chẳng hạn, mô -đun http.cookiejar có thể được sử dụng để thu cookie và để truyền lại chúng trên các yêu cầu kết nối tiếp theo. Nó cũng có thể được sử dụng để làm việc với các tệp có chứa dữ liệu cookie như các tệp được tạo bởi các trình duyệt khác nhau. Các đối tượng sau được xác định bởi mô -đun: cookiejar []

Một đối tượng quản lý các giá trị cookie HTTP, lưu trữ cookie nhận được do kết quả của các yêu cầu HTTP và thêm cookie vào các yêu cầu HTTP đi. Cookie được lưu trữ hoàn toàn trong bộ nhớ và bị mất khi ví dụ cookiejar được thu thập rác. FileCookiejar [tên tệp [, tải trọng]]]

Tạo một thể hiện FileCookiejar lấy và lưu trữ thông tin cookie vào một tệp. Tên tệp là tên của tệp. DelayLoad, nếu đúng, cho phép truy cập lười biếng vào tệp. Đó là, tập tin won được đọc hoặc lưu trữ ngoại trừ theo yêu cầu. Mozillacookiejar [tên tệp [, trì hoãn]]

Tạo một thể hiện FileCookiejar tương thích với tệp mozilla cookies.txt. Lwpcookiejar [tên tệp [, độ trễ]]

Tạo một thể hiện FileCookiejar tương thích với định dạng tệp LIBWWW-PERL-Cookie3. Nó có phần hiếm khi làm việc trực tiếp với các phương pháp và thuộc tính của các đối tượng này. Nếu bạn cần biết giao diện lập trình cấp thấp của họ, hãy tham khảo tài liệu trực tuyến. Thay vào đó, thông thường hơn là chỉ cần khởi tạo một trong các đối tượng jar cookie và cắm nó vào một thứ khác muốn làm việc với cookie. Một ví dụ về điều này được hiển thị trong phần Urllib.Request của chương này.

SMTPLIB Mô-đun SMTPLIB cung cấp giao diện máy khách SMTP cấp thấp có thể được sử dụng để gửi thư bằng giao thức SMTP được mô tả trong RFC 821 và RFC 1869. Tài liệu trực tuyến. Tuy nhiên, sau đây bao gồm các phần hữu ích nhất của mô -đun này:

F

H lib

fl

B

d

ff

514

Smtplib

M.OutputString [[attrs]]

Trả về chuỗi cookie mà không có bất kỳ tiêu đề HTTP hoặc mã JavaScript nào.

Ngoại lệ Nếu xảy ra lỗi trong quá trình phân tích cú pháp hoặc tạo giá trị cookie, ngoại lệ cookieerror được nêu ra.

Logs into the server if authentication is required. user is a username, and password is a password. s.quit[]

Terminates the session by sending a 'QUIT' command to the server. s.sendmail[fromaddr, toaddrs, message]

Sends a mail message to the server. fromaddr is a string containing the email address of the sender. toaddrs is a list of strings containing the email addresses of recipients. message is a string containing a completely formatted RFC-822 compliant message. The email package is commonly used to create such messages. It is important to note that although message can be given as a text string, it should only contain valid ASCII characters with values in the range 0 to 127. Otherwise, you will get an encoding error. If you need to send a message in a different encoding such as UTF-8, encode it into a byte string first and supply the byte string as message.

Example The following example shows how the module can be used to send a message: import smtplib fromaddr = "[email protected]" toaddrs = ["[email protected]"] msg = "From: %s\r\nTo: %s\r\n\r\n" % [fromaddr, ",".join[toaddrs]] msg += """ Refinance your mortgage to buy stocks and Viagra! """ server = smtplib.SMTP['localhost'] server.sendmail[fromaddr, toaddrs, msg] server.quit[]

urllib

Package

The urllib package provides a high-level interface for writing clients that need to interact with HTTP servers, FTP servers, and local files.Typical applications include scraping data from web pages, automation, proxies, web crawlers, and so forth.This is one of the most highly configurable library modules, so every last detail is not presented here. Instead, the most common uses of the package are described. F

h Lib

fL

B

d

ff

urllib Package

515

In Python 2, the urllib functionality is spread across several different library modules including urllib, urllib2, urlparse, and robotparser. In Python 3, all of this functionality has been consolidated and reorganized under the urllib package.

urllib.request [urllib2] The urllib.request module provides functions and classes to open and fetch data from URLs. In Python 2, this functionality is found in a module urllib2. The most common use of this module is to fetch data from web servers using HTTP. For example, this code shows the easiest way to simply fetch a web page: try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen

# Python 3 # Python 2

u = urlopen["//docs.python.org/3.0/library/urllib.request.html"] data = u.read[]

Of course, many complexities arise when interacting with servers in the real world. For example, you might have to worry about proxy servers, authentication, cookies, user agents, and other matters. All of these are supported, but the code is more complicated [keep reading].

urlopen[] and Requests The most straightforward way to make a request is to use the urlopen[] function. urlopen[url [, data [, timeout]]]

Opens the URL url and returns a file-like object that can be used to read the returned data. url may either be a string containing a URL or an instance of the Request class, described shortly. data is a URL-encoded string containing form data to be uploaded to the server.When supplied, the HTTP 'POST' method is used instead of 'GET' [the default]. Data is generally created using a function such as urllib.parse.urlencode[]. timeout is an optional timeout in seconds for all blocking operations used internally. The file-like object u returned by urlopen[] supports the following methods: Method

Description

u.read[[nbytes]] u.readline[] u.readlines[] u.fileno[] u.close[] u.info[]

Reads nbytes of data as a byte string. Reads a single line of text as a byte string. Reads all input lines and returns a list. Returns the integer file descriptor. Closes the connection. Returns a mapping object with meta-information associated with the URL. For HTTP, the HTTP headers included with the server response are returned. For FTP, the headers include 'content-length'. For local files, the headers include a date, 'content-length', and 'content-type' field. Returns the HTTP response code as an integer—for example, 200 for success or 404 for file not found. Returns the real URL of the returned data, taking into account any redirection that may have occurred.

u.getcode[] u.geturl[]

F

h Lib

fL

B

d

ff

516

Chapter 22 Internet Application Programming

It is important to emphasize that the file-like object u operates in binary mode. If you need to process the response data as text, you will need to decode it using the codecs module or some other means. If an error occurs during download, an URLError exception is raised.This includes errors related to the HTTP protocol itself such as forbidden access or requests for authentication. For these kinds of errors, a server typically returns content that gives more descriptive information.To get this content, the exception instance itself operates as a file-like object that can be read. For example: try: u = urlopen["//www.python.org/perl.html"] resp = u.read[] except HTTPError as e: resp = e.read[]

Một lỗi rất phổ biến phát sinh với urlopen [] là truy cập các trang web thông qua máy chủ proxy. Ví dụ: nếu tổ chức của bạn định tuyến tất cả lưu lượng truy cập web thông qua proxy, các yêu cầu có thể thất bại. Nếu máy chủ proxy không yêu cầu bất kỳ loại xác thực nào, bạn có thể khắc phục điều này bằng cách chỉ đặt biến môi trường http_proxy trong từ điển os.environ. Ví dụ: os.environ ['http_proxy'] = '//example.com:12345'. Đối với các yêu cầu đơn giản, tham số URL đến urlopen [] là một chuỗi như '//www.python.org'. Nếu bạn cần làm bất cứ điều gì phức tạp hơn như thực hiện sửa đổi cho các tiêu đề yêu cầu HTTP, hãy tạo một phiên bản yêu cầu và sử dụng đó làm tham số URL. Yêu cầu [url [, data [, tiêu đề [, origin_req_host [, không thể kiểm soát]]]]]]

Tạo một thể hiện yêu cầu mới. URL chỉ định URL [ví dụ: '//www.foo.bar/spam.html']. Dữ liệu là dữ liệu được mã hóa URL được tải lên máy chủ trong các yêu cầu HTTP. Khi điều này được cung cấp, nó thay đổi loại yêu cầu HTTP từ 'nhận' thành 'Post'. Tiêu đề là một từ điển chứa các ánh xạ giá trị khóa đại diện cho nội dung của các tiêu đề HTTP. Origin_Req_Host được đặt thành bản lưu trữ yêu cầu của giao dịch, theo cách thức, nó có tên máy chủ mà từ đó yêu cầu có nguồn gốc. Không thể kiểm soát được đặt thành true nếu yêu cầu là cho một URL không thể kiểm soát được. Một URL không thể kiểm soát được xác định không chính thức là URL không được nhập trực tiếp bởi người dùng, ví dụ, một URL được nhúng trong một trang tải một hình ảnh. Giá trị mặc định của không thể xác định là sai. Một phiên bản r của yêu cầu có các phương thức sau: R.ADD_DATA [Dữ liệu]

Thêm dữ liệu vào một yêu cầu. Nếu yêu cầu là yêu cầu HTTP, phương thức sẽ được thay đổi thành 'Post'. Dữ liệu là dữ liệu được mã hóa URL như được mô tả cho Yêu cầu []. Điều này không nối dữ liệu vào bất kỳ dữ liệu được đặt trước đó; Nó chỉ đơn giản thay thế dữ liệu cũ bằng dữ liệu. R.ADD_HEADER [Key, Val]

Thêm thông tin tiêu đề cho yêu cầu. Khóa là tên tiêu đề và Val là giá trị tiêu đề. Cả hai đối số là chuỗi.

F

H lib

fl

B

d

ff

Gói Urllib

517

R.ADD_UNREDIRECED_HEADER [Key, Val]

Thêm thông tin tiêu đề vào một yêu cầu sẽ không được thêm vào các yêu cầu được chuyển hướng. Khóa và val có cùng ý nghĩa như đối với add_header []. r.get_data []

Trả về dữ liệu yêu cầu [nếu có]. r.get_full_url []

Trả về URL đầy đủ của một yêu cầu. r.get_host []

Trả về máy chủ mà yêu cầu sẽ được gửi. r.get_method []

Trả về phương thức HTTP, là 'nhận' hoặc 'bài đăng'. r.get_origin_req_host []

Trả về bản lưu trữ yêu cầu của giao dịch gốc. r.get_selector []

Trả về phần chọn của URL [ví dụ: '/index.html']. r.get_type []

Trả về loại URL [ví dụ: 'HTTP']. r.has_data []

Trả về true nếu dữ liệu là một phần của yêu cầu. R.IS_Unverifable []

Trả về đúng nếu yêu cầu không thể kiểm chứng được. r.has_header [tiêu đề]

Trả về đúng nếu yêu cầu có tiêu đề tiêu đề. r.set_proxy [máy chủ, loại]

Chuẩn bị yêu cầu kết nối với máy chủ proxy. Điều này thay thế máy chủ ban đầu bằng máy chủ và loại ban đầu của yêu cầu với loại. Phần chọn của URL được đặt thành URL ban đầu. Dưới đây là một ví dụ sử dụng đối tượng yêu cầu để thay đổi tiêu đề 'tác nhân người dùng' được sử dụng bởi urlopen []. Bạn có thể sử dụng điều này nếu bạn muốn một máy chủ nghĩ rằng bạn đang tạo kết nối từ Internet Explorer, Firefox hoặc một số trình duyệt khác . Tiêu đề = {'người dùng-Agent': 'Mozilla/4.0 [tương thích; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727]'} r = request ] U = Urlopen [R]

F

H lib

fl

B

d

ff

518

Gói Urllib

R.ADD_UNREDIRECED_HEADER [Key, Val]

Thêm thông tin tiêu đề vào một yêu cầu sẽ không được thêm vào các yêu cầu được chuyển hướng. Khóa và val có cùng ý nghĩa như đối với add_header []. r.get_data []

Trả về dữ liệu yêu cầu [nếu có]. r.get_full_url []

Trả về URL đầy đủ của một yêu cầu. r.get_host []

Trả về máy chủ mà yêu cầu sẽ được gửi. r.get_method []

Httpdigestauthhandler httphandler httpredirecthandler httpshandler proxyhandler proxybasicauthhandler proxydigestauthhandler

Theo mặc định, một dụng cụ mở luôn được tạo ra với trình xử lý ProxyHandler, UnknownHandler, Httphandler, httpshandler, httpdefaulterrorHandler, httpredirecthandler, ftphandler, fileHandler, và httperrorProcess. Các trình xử lý bổ sung được cung cấp dưới dạng đối số được thêm vào danh sách này. Tuy nhiên, nếu bất kỳ trình xử lý bổ sung nào có cùng loại với mặc định, họ sẽ được ưu tiên. Ví dụ: nếu bạn đã thêm một thể hiện của httphandler hoặc một số lớp có nguồn gốc từ httphandler, nó sẽ được sử dụng thay vì mặc định. Đối tượng được trả về bởi build_opener [] có một phương thức, mở [url [, data [, thời gian chờ]]], được sử dụng để mở URL theo tất cả các quy tắc được cung cấp bởi các trình xử lý khác nhau. Các đối số để mở [] như những gì được truyền đến hàm urlopen []. install_opener [mở]

Cài đặt một đối tượng mở khác để sử dụng làm công cụ mở URL toàn cầu được sử dụng bởi urlopen []. Mở mở thường là của một đối tượng mở được tạo bởi build_opener []. Một vài phần tiếp theo cho thấy cách tạo các trình mở tùy chỉnh cho một số kịch bản phổ biến hơn phát sinh khi sử dụng mô -đun urlib.request.

F

H lib

fl

B

d

ff

Gói Urllib

519

Xác thực mật khẩu Để xử lý các yêu cầu liên quan đến xác thực mật khẩu, bạn tạo một bộ mở với một số kết hợp của httpbasicuthHandler, httpDigestauthHandler, proxybasicuthHandler hoặc proxydigestauthHandler. Mỗi trình xử lý này có phương thức sau đây có thể được sử dụng để đặt mật khẩu: H.ADD_Password [Realm, URI, User, Passwd]

Thêm thông tin người dùng và mật khẩu cho một lĩnh vực và URI nhất định. Tất cả các tham số là chuỗi. URI có thể tùy ý là một chuỗi URI, trong trường hợp đó, thông tin người dùng và mật khẩu được áp dụng cho tất cả các URI trong chuỗi. Realm là một tên hoặc mô tả được liên kết với xác thực. Giá trị của nó phụ thuộc vào máy chủ từ xa. Tuy nhiên, nó thường là một tên phổ biến liên quan đến một tập hợp các trang web liên quan. URI là một URL cơ sở liên quan đến xác thực. Các giá trị điển hình cho Realm và URI có thể là một cái gì đó như ['Quản trị viên', '//www.somesite.com']. Người dùng và mật khẩu chỉ định tên người dùng và mật khẩu tương ứng. Dưới đây là một ví dụ về cách thiết lập bộ mở với xác thực cơ bản: auth = httpbasicauthHandler [] auth.add_password ["quản trị viên", "//www.secretlair.com" mở với xác thực được thêm vào mở = build_opener [auth] # mở url u = opener.open ["//www.secretlair.com/evilplan.html"]

Cookie HTTP để quản lý cookie HTTP, tạo một đối tượng mở với trình xử lý HTTPCookieProcessor được thêm vào nó. Ví dụ: cookiehand = httpcookieProcessor [] opener = build_opener [cookiehand] u = opener.open ["//www.example.com/"]

Theo mặc định, HTTPCookieProcessor sử dụng đối tượng cookiejar được tìm thấy trong mô -đun http.cookiejar. Các loại xử lý cookie khác nhau có thể được hỗ trợ bằng cách cung cấp một đối tượng cookiejar khác như một đối số cho httpcookieprocessor. Ví dụ: cookiehand = httpcookieprocessor [http.cookiejar.mozillacookiejar ["cookies.txt"]] opener = build_opener [cookiehand] u = opener.open ["//www.example.com/"]

Proxy Nếu các yêu cầu cần được chuyển hướng thông qua proxy, hãy tạo một thể hiện của proxyHandler. ProxyHandler [[proxy]]

Tạo một trình xử lý proxy mà các định tuyến yêu cầu thông qua proxy. Các proxy đối số là một từ điển ánh xạ tên giao thức [ví dụ: 'http', 'ftp', v.v.] vào URL của máy chủ proxy tương ứng.

F

H lib

fl

B

d

ff

520

Gói Urllib

Xác thực mật khẩu Để xử lý các yêu cầu liên quan đến xác thực mật khẩu, bạn tạo một bộ mở với một số kết hợp của httpbasicuthHandler, httpDigestauthHandler, proxybasicuthHandler hoặc proxydigestauthHandler. Mỗi trình xử lý này có phương thức sau đây có thể được sử dụng để đặt mật khẩu: H.ADD_Password [Realm, URI, User, Passwd]

Thêm thông tin người dùng và mật khẩu cho một lĩnh vực và URI nhất định. Tất cả các tham số là chuỗi. URI có thể tùy ý là một chuỗi URI, trong trường hợp đó, thông tin người dùng và mật khẩu được áp dụng cho tất cả các URI trong chuỗi. Realm là một tên hoặc mô tả được liên kết với xác thực. Giá trị của nó phụ thuộc vào máy chủ từ xa. Tuy nhiên, nó thường là một tên phổ biến liên quan đến một tập hợp các trang web liên quan. URI là một URL cơ sở liên quan đến xác thực. Các giá trị điển hình cho Realm và URI có thể là một cái gì đó như ['Quản trị viên', '//www.somesite.com']. Người dùng và mật khẩu chỉ định tên người dùng và mật khẩu tương ứng. Dưới đây là một ví dụ về cách thiết lập bộ mở với xác thực cơ bản: auth = httpbasicauthHandler [] auth.add_password ["quản trị viên", "//www.secretlair.com" mở với xác thực được thêm vào mở = build_opener [auth] # mở url u = opener.open ["//www.secretlair.com/evilplan.html"]

Cookie HTTP để quản lý cookie HTTP, tạo một đối tượng mở với trình xử lý HTTPCookieProcessor được thêm vào nó. Ví dụ: cookiehand = httpcookieProcessor [] opener = build_opener [cookiehand] u = opener.open ["//www.example.com/"]

Theo mặc định, HTTPCookieProcessor sử dụng đối tượng cookiejar được tìm thấy trong mô -đun http.cookiejar. Các loại xử lý cookie khác nhau có thể được hỗ trợ bằng cách cung cấp một đối tượng cookiejar khác như một đối số cho httpcookieprocessor. Ví dụ: cookiehand = httpcookieprocessor [http.cookiejar.mozillacookiejar ["cookies.txt"]] opener = build_opener [cookiehand] u = opener.open ["//www.example.com/"]

Phân tích các URL trong URLString và trả về một ví dụ Parseresult. default_scheme chỉ định sơ đồ ["http", "ftp", v.v.] sẽ được sử dụng nếu không có trong URL. Nếu allow_fragments bằng không, số nhận dạng phân đoạn không được phép. Một cá thể phân tích cú pháp r là một hình thức được đặt tên là biểu mẫu [sơ đồ, netloc, đường dẫn, tham số, truy vấn, đoạn]. Tuy nhiên, các thuộc tính chỉ đọc sau cũng được xác định: thuộc tính

Sự mô tả

R.Scheme R.Netloc R.Path R.Params R.Query R.Fragment R.Username

Định con của sơ đồ URL [ví dụ: 'http'] netloc định vị [ví dụ: 'www.python.org'] đường dẫn phân cấp [ví dụ: '/index.html'] tham số cho chuỗi truy vấn phần tử đường dẫn cuối cùng [ví dụ: 'name = Dave & id = 42'] Định danh phân đoạn mà không có thành phần tên người dùng '#' hàng đầu nếu Trình xác định netloc thuộc dạng 'Tên người dùng: [Email & NBSP; Từ trình xác định Netloc nếu nó có dạng 'Tên máy chủ: Cổng'

R.Password R.Hostname R.port

Một thể hiện phân tích cú pháp có thể được biến trở lại thành chuỗi URL bằng r.geturl [].

F

H lib

fl

B

d

ff

Gói Urllib

521

Urlunparse [Bộ phận]

Xây dựng một chuỗi URL từ một đại diện tuple của một URL được trả về bởi urlparse []. Các bộ phận phải là một tuple hoặc có thể lặp lại với sáu thành phần. urlsplit [url [, default_scheme [, allow_fragments]]]]

Giống như urlparse [] ngoại trừ phần tham số của URL không được sửa đổi trong đường dẫn. Điều này cho phép phân tích các URL trong đó các tham số có thể được gắn vào các thành phần đường dẫn riêng lẻ như 'Sơ đồ: // Netloc/Path2; Param1/Path2 ; param2/path3? Truy vấn#Fragment'. Kết quả là một thể hiện của splitresult, là một tuple có tên [Sơ đồ, netloc, đường dẫn, truy vấn, đoạn]. Các thuộc tính chỉ đọc sau đây cũng được xác định: thuộc tính

Sự mô tả

R.Scheme R.Netloc R.Path R.Query R.Fragment R.Username

Định con của sơ đồ URL [ví dụ: 'http'] netloc Eyper [ví dụ: 'www.python.org'] đường dẫn phân cấp [ví dụ: '/index.html'] Truy vấn chuỗi truy vấn [ví dụ: '] Định danh đoạn mà không có thành phần tên người dùng'#'hàng đầu nếu trình xác định netloc có dạng' Tên người dùng: [Email & NBSP; là của biểu mẫu 'tên máy chủ: cổng'

R.Password R.Hostname R.port

Một thể hiện phân tích cú pháp có thể được biến trở lại thành chuỗi URL bằng r.geturl [].

F

H lib

fl

B

F

H lib

fl

B

d

ff

522

Gói Urllib

Urlunparse [Bộ phận]

Xây dựng một chuỗi URL từ một đại diện tuple của một URL được trả về bởi urlparse []. Các bộ phận phải là một tuple hoặc có thể lặp lại với sáu thành phần. urlsplit [url [, default_scheme [, allow_fragments]]]]

Giống như urlparse [] ngoại trừ phần tham số của URL không được sửa đổi trong đường dẫn. Điều này cho phép phân tích các URL trong đó các tham số có thể được gắn vào các thành phần đường dẫn riêng lẻ như 'Sơ đồ: // Netloc/Path2; Param1/Path2 ; param2/path3? Truy vấn#Fragment'. Kết quả là một thể hiện của splitresult, là một tuple có tên [Sơ đồ, netloc, đường dẫn, truy vấn, đoạn]. Các thuộc tính chỉ đọc sau đây cũng được xác định: thuộc tính

R.Scheme R.Netloc R.Path R.Query R.Fragment R.Username

Gọi Trích dẫn [] và cũng thay thế tất cả các không gian bằng các dấu hiệu cộng. Chuỗi và an toàn giống như trong trích dẫn []. Mã hóa và lỗi giống như với trích dẫn []. quote_from_bytes [byte [, an toàn]]

Giống như trích dẫn [] nhưng chấp nhận chuỗi byte và thực hiện không mã hóa. Kết quả trả về là một chuỗi văn bản. Python 3 chỉ. unquote [chuỗi [, mã hóa [, lỗi]]]]

Thay thế các chuỗi thoát của biểu mẫu '%xx' bằng tương đương một ký tự của chúng. Mã hóa và lỗi chỉ định việc mã hóa và xử lý lỗi để giải mã dữ liệu theo '%xx' thoát. Mã hóa mặc định là 'UTF-8' và chính sách lỗi mặc định là 'thay thế'. Mã hóa và lỗi chỉ là Python 3. unquote_plus [chuỗi [, mã hóa

[, lỗi]]]

Giống như Unquote [] nhưng cũng thay thế các dấu hiệu cộng với không gian. unquote_to_bytes [chuỗi]

Giống như unquote [] nhưng không thực hiện giải mã và trả về chuỗi byte. URLENCODE [Truy vấn [, LOSEQ]]

Chuyển đổi các giá trị truy vấn trong truy vấn thành chuỗi được mã hóa URL phù hợp để bao gồm tham số truy vấn của URL hoặc để tải lên như một phần của yêu cầu POST. Truy vấn là một từ điển hoặc một chuỗi [khóa, giá trị]. Chuỗi kết quả là một chuỗi các cặp 'key = value' được phân tách bởi '&' Tham số là một cờ boolean nên được đặt thành true nếu bất kỳ giá trị nào trong truy vấn là một chuỗi, biểu thị nhiều giá trị cho cùng một khóa. Trong trường hợp này, chuỗi 'phím = v' riêng biệt được tạo cho mỗi v trong giá trị.

F

H lib

fl

B

d

ff

Gói Urllib

523

Các ví dụ Các ví dụ sau đây cho thấy cách biến từ điển các biến truy vấn thành URL phù hợp để sử dụng trong HTTP Nhận yêu cầu và cách bạn có thể phân tích URL: Hãy thử: từ Urllib. Urlparse, parse_qsl từ urlencode nhập urllib

# Python 3 # Python 2

# Ví dụ về việc tạo URL với các biến truy vấn được mã hóa đúng Form_fields = {'name': 'Dave', 'Email': '[Email & nbsp; "//www.somehost.com/cgi-bin/view.py?"+form_data # Ví dụ về phân tích URL vào các thành phần r = urlparse [url] in [r.scheme] # 'http' in [r. netloc] # 'www.somehost.com' print [r.Path] # ' Dave%40DabDabeaz.com 'Print [R.Fragment] #' '

Urllib.Error mô -đun urllib.Error xác định các ngoại lệ được sử dụng bởi gói urllib. ContentTooshort

Tăng lên khi lượng dữ liệu đã tải xuống nhỏ hơn số lượng dự kiến ​​[như được xác định bởi tiêu đề 'độ dài nội dung']. Được định nghĩa trong mô -đun Urllib trong Python 2. httperror

Được tăng lên để biểu thị các vấn đề với giao thức HTTP. Lỗi này có thể được sử dụng để báo hiệu các sự kiện như xác thực cần thiết. Ngoại lệ này cũng có thể được sử dụng làm đối tượng tệp để đọc dữ liệu được trả về bởi máy chủ được liên kết với lỗi. Đây là một lớp học con của Urlerror. Nó được định nghĩa trong mô -đun Urllib2 trong Python 2. Urlerror

Lỗi được đưa ra bởi người xử lý khi phát hiện sự cố. Đây là một lớp con của ioerror. Thuộc tính lý do của trường hợp ngoại lệ có nhiều thông tin hơn về vấn đề. Điều này được xác định trong mô -đun Urllib2 trong Python 2.

urllib.robotparser [robotparser] Mô -đun urllib.robotparser [robotparser trong python 2] được sử dụng để tìm nạp và phân tích nội dung của các tệp 'robot.txt' được sử dụng để hướng dẫn thu thập thông tin web. Tham khảo các tài liệu trực tuyến để biết thêm thông tin sử dụng.

F

H lib

fl

B

d

ff

Gói Urllib

524

Các ví dụ Các ví dụ sau đây cho thấy cách biến từ điển các biến truy vấn thành URL phù hợp để sử dụng trong HTTP Nhận yêu cầu và cách bạn có thể phân tích URL: Hãy thử: từ Urllib. Urlparse, parse_qsl từ urlencode nhập urllib

# Python 3 # Python 2

# Ví dụ về việc tạo URL với các biến truy vấn được mã hóa đúng Form_fields = {'name': 'Dave', 'Email': '[Email & nbsp; "//www.somehost.com/cgi-bin/view.py?"+form_data # Ví dụ về phân tích URL vào các thành phần r = urlparse [url] in [r.scheme] # 'http' in [r. netloc] # 'www.somehost.com' print [r.Path] # ' Dave%40DabDabeaz.com 'Print [R.Fragment] #' '

Urllib.Error mô -đun urllib.Error xác định các ngoại lệ được sử dụng bởi gói urllib. ContentTooshort

Tăng lên khi lượng dữ liệu đã tải xuống nhỏ hơn số lượng dự kiến ​​[như được xác định bởi tiêu đề 'độ dài nội dung']. Được định nghĩa trong mô -đun Urllib trong Python 2. httperror

Được tăng lên để biểu thị các vấn đề với giao thức HTTP. Lỗi này có thể được sử dụng để báo hiệu các sự kiện như xác thực cần thiết. Ngoại lệ này cũng có thể được sử dụng làm đối tượng tệp để đọc dữ liệu được trả về bởi máy chủ được liên kết với lỗi. Đây là một lớp học con của Urlerror. Nó được định nghĩa trong mô -đun Urllib2 trong Python 2. Urlerror

XMLRPC.Client [XMLRPCLIB] Mô-đun XMLRPC.Client được sử dụng để viết các máy khách XML-RPC. Trong Python 2, mô -đun này được gọi là xmlrpclib.to hoạt động như một máy khách, bạn tạo một thể hiện của serverProxy: serverProxy [uri [, vận chuyển [, mã hóa [, verbose [, allow_none [, use_datetime]]]]]]

uri là vị trí của máy chủ XML-RPC từ xa, ví dụ, " // www. foo.com/rpc2". Nếu cần thiết, thông tin xác thực cơ bản có thể được thêm vào URI bằng định dạng " // user: [email & nbsp; được bảo vệ]: port/path", trong đó người dùng: Pass là

Tên người dùng và mật khẩu. Thông tin này được mã hóa cơ sở-64 được mã hóa và đưa vào 'Tiêu đề ủy quyền:' về vận chuyển. Nếu Python được cấu hình với hỗ trợ OpenSSL, HTTPS cũng có thể được sử dụng. Giao thông chỉ định chức năng nhà máy để tạo

Đối tượng vận chuyển nội bộ được sử dụng cho giao tiếp cấp thấp. Đối số này chỉ được sử dụng nếu XML-RPC được sử dụng trên một số loại kết nối khác ngoài HTTP hoặc HTTPS. Hầu như không bao giờ cần thiết để cung cấp lập luận này trong sử dụng bình thường [tham khảo tài liệu trực tuyến để biết chi tiết]. Mã hóa chỉ định mã hóa, theo mặc định là UTF-8. Verbose hiển thị một số thông tin gỡ lỗi nếu đúng. allow_none, nếu đúng, cho phép giá trị không được gửi đến máy chủ từ xa. Theo mặc định, điều này bị vô hiệu hóa vì nó không được hỗ trợ phổ biến. use_dateTime là một lá cờ boolean nếu được đặt thành true, hãy sử dụng mô -đun DateTime để biểu diễn ngày và thời gian. Theo mặc định, điều này là sai. Một thể hiện, s, của ServerProxy một cách minh bạch hiển thị tất cả các phương thức trên máy chủ từ xa. Các phương thức được truy cập dưới dạng thuộc tính của s. Ví dụ: mã này có thời gian hiện tại từ một máy chủ từ xa cung cấp dịch vụ đó: >>> s = serverProxy ["//www.xmlrpc.com/rpc2"] >>> s

>>>

F

H lib

fl

B

d

ff

Gói XMLRPC

525

Đối với hầu hết các phần, các cuộc gọi RPC hoạt động giống như các chức năng Python thông thường. Tuy nhiên, chỉ có một số lượng hạn chế các loại đối số và giá trị trả về được hỗ trợ bởi giao thức XML-RPC: loại XML-RPC

Python tương đương

Boolean Integer Float String Stray Stray Dates nhị phân

Đúng và sai

Int Float String hoặc Unicode [chỉ phải chứa các ký tự có giá trị trong XML] Bất kỳ chuỗi nào chứa từ điển loại XML-RPC hợp lệ chứa các khóa và giá trị của các loại hợp lệ ngày và thời gian [xmlrpc.client.datetime]

Khi nhận được ngày, chúng được lưu trữ trong một trường hợp xmlrpc.client.datetime d. Thuộc tính D.Value chứa ngày dưới dạng chuỗi thời gian/ngày ISO 8601. Để chuyển đổi nó thành một thời gian tương thích với mô -đun thời gian, sử dụng d.timeTuple []. Khi nhận được dữ liệu nhị phân, nó được lưu trữ trong XMLRPC. Client.Binary thể hiện B.THE B.DATA thuộc tính chứa dữ liệu dưới dạng chuỗi byte. Xin lưu ý rằng các chuỗi được coi là Unicode và bạn sẽ phải lo lắng về việc sử dụng mã hóa phù hợp. Gửi các chuỗi byte Python 2 thô sẽ hoạt động nếu chúng chứa ASCII nhưng sẽ bị phá vỡ. Để xử lý vấn đề này, trước tiên hãy chuyển đổi thành chuỗi Unicode. Nếu bạn thực hiện cuộc gọi RPC với các đối số liên quan đến các loại không hợp lệ, bạn có thể nhận được một kiểu mẫu hoặc ngoại lệ xmlrpclib.fault. Nếu máy chủ XML-RPC từ xa hỗ trợ hướng nội, các phương thức sau có thể có sẵn: s.system.listmethods []

Trả về một danh sách các chuỗi liệt kê tất cả các phương thức được cung cấp bởi máy chủ XML-RPC. s.methodsignatures [tên]

Với tên của một phương thức, tên, trả về một danh sách các chữ ký gọi có thể có cho phương thức. Mỗi chữ ký là một danh sách các loại dưới dạng chuỗi được phân tách bằng dấu phẩy [ví dụ: 'Chuỗi, int, int'], trong đó mục đầu tiên là loại trả về và các mục còn lại là loại đối số. Nhiều chữ ký có thể được trả lại do quá tải. Trong các máy chủ XML-RPC được triển khai trong Python, chữ ký thường trống vì các hàm và phương thức được gõ linh hoạt. s.methodhelp [tên]

Với tên của một phương thức, tên, trả về một chuỗi tài liệu mô tả việc sử dụng phương thức đó. Chuỗi tài liệu có thể chứa đánh dấu HTML. Một chuỗi trống được trả về nếu không có tài liệu. Các chức năng tiện ích sau đây có sẵn trong mô -đun XMLRPCLIB: Boolean [Giá trị]

Tạo một đối tượng Boolean XML-RPC từ giá trị. Hàm này có trước sự tồn tại của loại Boolean Python, do đó bạn có thể thấy nó được sử dụng trong mã cũ hơn.

F

H lib

fl

B

d

ff

526

Gói XMLRPC

Đối với hầu hết các phần, các cuộc gọi RPC hoạt động giống như các chức năng Python thông thường. Tuy nhiên, chỉ có một số lượng hạn chế các loại đối số và giá trị trả về được hỗ trợ bởi giao thức XML-RPC: loại XML-RPC

Python tương đương

Tạo một đối tượng XML-RPC chứa một ngày. Ban ngày là chuỗi ngày định dạng ISO 8601, một bộ tple hoặc cấu trúc thời gian được trả về bởi thời gian.localtime [] hoặc một thể hiện DateTime từ mô -đun DateTime. Dumps [params [, methodname [, methodresponse [, mã hóa [, allow_none]]]]]]

Chuyển đổi các tham số thành một yêu cầu hoặc phản hồi XML-RPC, trong đó các params là một phần của các đối số hoặc một thể hiện của ngoại lệ lỗi. MethodName là tên của phương thức dưới dạng chuỗi. Phương thứcResponse là một lá cờ Boolean. Nếu đúng, thì kết quả là phản hồi XML-RPC. Trong trường hợp này, chỉ có một giá trị có thể được cung cấp trong params. Mã hóa chỉ định mã hóa văn bản trong XML được tạo và mặc định là UTF-8. allow_none là một lá cờ chỉ định xem không có ai được hỗ trợ làm loại tham số hay không. Không có gì không được đề cập rõ ràng bởi đặc tả XML-RPC, nhưng nhiều máy chủ hỗ trợ nó. Theo mặc định, allow_none là sai. tải [dữ liệu]

Chuyển đổi dữ liệu chứa yêu cầu hoặc phản hồi XML-RPC thành một tuple [params, methodname] trong đó các tham số là một bộ của tham số và tên phương thức là một chuỗi chứa tên phương thức. Nếu yêu cầu đại diện cho một điều kiện lỗi thay vì giá trị thực, thì ngoại lệ lỗi sẽ được nêu ra. Multicall [máy chủ]

Tạo một đối tượng đa bảng cho phép nhiều yêu cầu XML-RPC được đóng gói cùng nhau và được gửi dưới dạng một yêu cầu duy nhất. Đây có thể là một tối ưu hóa hiệu suất hữu ích nếu nhiều yêu cầu RPC khác nhau cần được thực hiện trên cùng một máy chủ. Máy chủ là một thể hiện của serverProxy, biểu thị kết nối với máy chủ từ xa. Đối tượng multicall được trả về được sử dụng chính xác giống như máy chủ. Tuy nhiên, thay vì thực hiện ngay các phương thức từ xa, phương thức gọi là xếp hàng cho đến khi đối tượng Multicall được gọi là hàm. Khi điều này xảy ra, các yêu cầu RPC được truyền đi. Giá trị trả về của thao tác này là một trình tạo mang lại kết quả trả về của mỗi hoạt động RPC theo trình tự. Lưu ý rằng multicall [] chỉ hoạt động nếu máy chủ từ xa cung cấp phương thức system.multicall []. Dưới đây là một ví dụ minh họa việc sử dụng Multicall: multi = multicall [máy chủ] multi.foo [4,6,7] # phương thức từ xa foo multi.bar ["Hello world"] # từ xa phương thức multi.spam [] # Phương thức từ xa Spam # Bây giờ, thực sự gửi yêu cầu XML-RPC và nhận kết quả trả về foo_result, barb_result, spam_result = multi []

F

H lib

fl

B

d

ff

Gói XMLRPC

527

Các ngoại lệ Các ngoại lệ sau được xác định trong XMLRPC.Client: lỗi

Cho biết lỗi XML-RPC. Thuộc tính FAGECODE chứa một chuỗi có loại lỗi. Thuộc tính FaultString chứa thông báo mô tả liên quan đến lỗi. Giao thức

Ví dụ, vấn đề với mạng cơ bản, ví dụ, URL xấu hoặc vấn đề kết nối thuộc loại nào đó. Thuộc tính URL chứa URI đã kích hoạt lỗi. Thuộc tính ErrCode chứa mã lỗi. Thuộc tính ERRMSG chứa chuỗi mô tả. Thuộc tính tiêu đề chứa tất cả các tiêu đề HTTP của yêu cầu kích hoạt lỗi.

XMLRPC.Server [SimpleXMLRPCServer, DOCXMLRPCSERVER] Mô-đun XMLRPC.Server chứa các lớp để triển khai các biến thể khác nhau của máy chủ XML-RPC. Trong Python 2, chức năng này được tìm thấy trong hai mô -đun riêng biệt: simplexmlrpcserver và docxmlrpcserver. SimpleXMLRPCServer [addr [, requestHandler [, logrequests]]]]

Tạo một máy chủ XML-RPC nghe trên addr địa chỉ ổ cắm [ví dụ: ['localhost', 8080]]. RequestHandler là chức năng nhà máy tạo ra các đối tượng yêu cầu xử lý khi nhận được kết nối. Theo mặc định, nó được đặt thành SimplexMLRPCrequestHandler, hiện là trình xử lý duy nhất có sẵn. LogRequests là một lá cờ Boolean cho biết có đăng nhập các yêu cầu đến hay không. Giá trị mặc định là true. Docxmlrpcserver [addr [, requestHandler [, logrequest]]

Tạo một tài liệu XML-RPC, cũng đáp ứng các yêu cầu của HTTP [thường được gửi bởi một trình duyệt]. Nếu nhận được, máy chủ sẽ tạo tài liệu từ các chuỗi tài liệu được tìm thấy trong tất cả các phương thức và đối tượng đã đăng ký. Các đối số có ý nghĩa tương tự như đối với SimplexMLRPCServer. Một ví dụ, s, của simplexmlrpcserver hoặc docxmlrpcserver có các phương thức sau: s.register_function [func [, name]]

Đăng ký một chức năng mới, Func, với máy chủ XML-RPC. Tên là một tên tùy chọn để sử dụng cho chức năng. Nếu tên được cung cấp, nó có tên mà máy khách sẽ sử dụng để truy cập vào chức năng. Tên này có thể chứa các ký tự không phải là một phần của số nhận dạng Python hợp lệ, bao gồm các khoảng thời gian [.]. Nếu tên không được cung cấp, thì tên chức năng thực tế của func được sử dụng thay thế. s.register_instance [instance [, allow_doted_names]]

Đăng ký một đối tượng mà được sử dụng để giải quyết các tên phương thức không được đăng ký bằng phương thức Đăng ký_function []. Nếu cá thể thể hiện xác định phương thức _Dispatch [self, methodname, params], nó được gọi để xử lý các yêu cầu. MethodName là tên của phương thức và params là một tuple chứa các đối số. Giá trị trả về của _Dispatch [] được trả về cho máy khách. Nếu không có phương thức _Dispatch [] được xác định, phiên bản là

F

H lib

fl

B

d

ff

528

Chương 22 Lập trình ứng dụng Internet

Đã kiểm tra xem tên phương thức có khớp với tên của bất kỳ phương thức nào được xác định không. Nếu vậy, phương thức được gọi là trực tiếp. Tham số allow_doted_names là một cờ cho biết liệu tìm kiếm phân cấp có nên được thực hiện khi kiểm tra tên phương thức hay không. Ví dụ: nếu nhận được yêu cầu cho phương thức 'foo.bar.spam', điều này sẽ xác định xem việc tìm kiếm cho instance.foo.bar.spam có được thực hiện hay không. Theo mặc định, điều này là sai. Nó không nên được đặt thành đúng trừ khi khách hàng đã được xác minh. Mặt khác, nó mở ra một lỗ hổng bảo mật có thể cho phép những kẻ xâm nhập thực thi mã Python tùy ý. Lưu ý rằng, nhiều nhất, chỉ có một trường hợp có thể được đăng ký tại một thời điểm. s.register_introspection_functions []

Thêm các hàm hướng nội XML-rpc System.listMethods [], System.MethodHelp [] và System.MethodSignature [] vào máy chủ XML-RPC. System.methodHelp [] Trả về chuỗi tài liệu cho một phương thức [nếu có]. HỆ THỐNG SYLE.METHODSIGNature [] chỉ cần trả về một thông báo cho biết rằng thao tác không được hỗ trợ [vì python được gõ động, thông tin loại có sẵn]. s.register_multicall_fifts []

Thêm hỗ trợ chức năng đaall XML-RPC bằng cách thêm hàm System.Multicall [] vào máy chủ. Một thể hiện của docxmlrpcserver cung cấp thêm cung cấp các phương thức sau: s.set_server_title [server_title]

Đặt tiêu đề của máy chủ trong tài liệu HTML. Chuỗi được đặt trong thẻ HTML. s.set_server_name [server_name]

Đặt tên của máy chủ trong tài liệu HTML. Chuỗi xuất hiện ở đầu trang trong một thẻ. S.Set_Server_Documentation [server_documentation]

Thêm một đoạn mô tả vào đầu ra HTML được tạo. Chuỗi này được thêm ngay sau tên máy chủ, nhưng trước khi mô tả các hàm XML-RPC. Mặc dù thông thường đối với máy chủ XML-RPC hoạt động như một quy trình độc lập, nhưng nó cũng có thể chạy bên trong tập lệnh CGI. Các lớp sau được sử dụng cho điều này: CGIXMLRPCrequestHandler [[cho phép_none [, mã hóa]]]]

Một trình xử lý yêu cầu CGI hoạt động theo cách tương tự như SimplexMLRPCServer. Các đối số có ý nghĩa tương tự như được mô tả cho SimplexMLRPCServer. DoccgixmlrpcrequestHandler []

Một trình xử lý yêu cầu CGI hoạt động theo cách tương tự như docxmlrpcserver. Xin lưu ý rằng khi viết bài này, các đối số cuộc gọi khác với CGIXMLRPCrequestHandler []. Đây có thể là một lỗi Python vì vậy bạn nên tham khảo tài liệu trực tuyến trong các bản phát hành trong tương lai. Một thể hiện, C, của CGI Handler có các phương thức giống như máy chủ XML-RPC bình thường để đăng ký các chức năng và phiên bản. Tuy nhiên, họ cũng xác định các phương pháp sau:

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

529

Đã kiểm tra xem tên phương thức có khớp với tên của bất kỳ phương thức nào được xác định không. Nếu vậy, phương thức được gọi là trực tiếp. Tham số allow_doted_names là một cờ cho biết liệu tìm kiếm phân cấp có nên được thực hiện khi kiểm tra tên phương thức hay không. Ví dụ: nếu nhận được yêu cầu cho phương thức 'foo.bar.spam', điều này sẽ xác định xem việc tìm kiếm cho instance.foo.bar.spam có được thực hiện hay không. Theo mặc định, điều này là sai. Nó không nên được đặt thành đúng trừ khi khách hàng đã được xác minh. Mặt khác, nó mở ra một lỗ hổng bảo mật có thể cho phép những kẻ xâm nhập thực thi mã Python tùy ý. Lưu ý rằng, nhiều nhất, chỉ có một trường hợp có thể được đăng ký tại một thời điểm. s.register_introspection_functions []

Thêm các hàm hướng nội XML-rpc System.listMethods [], System.MethodHelp [] và System.MethodSignature [] vào máy chủ XML-RPC. System.methodHelp [] Trả về chuỗi tài liệu cho một phương thức [nếu có]. HỆ THỐNG SYLE.METHODSIGNature [] chỉ cần trả về một thông báo cho biết rằng thao tác không được hỗ trợ [vì python được gõ động, thông tin loại có sẵn]. s.register_multicall_fifts []

Thêm hỗ trợ chức năng đaall XML-RPC bằng cách thêm hàm System.Multicall [] vào máy chủ. Một thể hiện của docxmlrpcserver cung cấp thêm cung cấp các phương thức sau: s.set_server_title [server_title]

Đặt tiêu đề của máy chủ trong tài liệu HTML. Chuỗi được đặt trong thẻ HTML. s.set_server_name [server_name]

Đặt tên của máy chủ trong tài liệu HTML. Chuỗi xuất hiện ở đầu trang trong một thẻ. S.Set_Server_Documentation [server_documentation]

F

H lib

fl

B

d

ff

530

Chương 22 Lập trình ứng dụng Internet

Tùy chỉnh máy chủ nâng cao Các mô-đun máy chủ XML-RPC rất dễ sử dụng cho các loại điện toán phân tán cơ bản. Ví dụ: XML-RPC có thể được sử dụng làm giao thức để điều khiển cấp cao của các hệ thống khác trên mạng, miễn là tất cả chúng đều đang chạy một máy chủ XML-RPC phù hợp. Các đối tượng thú vị hơn cũng có thể được truyền giữa các hệ thống nếu bạn sử dụng mô -đun Pickle. Một mối quan tâm với XML-RPC là bảo mật. Theo mặc định, máy chủ XML-RPC chạy dưới dạng dịch vụ mở trên mạng, vì vậy bất kỳ ai biết địa chỉ và cổng của máy chủ đều có thể kết nối với nó [trừ khi nó được bảo vệ bởi tường lửa]. Ngoài ra, các máy chủ XML-RPC không giới hạn về lượng dữ liệu có thể được gửi trong một yêu cầu. Kẻ tấn công có khả năng gặp sự cố máy chủ bằng cách gửi yêu cầu POST HTTP với tải trọng lớn đến mức độ xả. Nếu bạn muốn giải quyết bất kỳ vấn đề nào trong số này, bạn sẽ cần tùy chỉnh các lớp máy chủ XMLRPC hoặc trình xử lý yêu cầu. Tất cả các lớp máy chủ được kế thừa từ TCPServer trong mô -đun SocketServer.SUS, các máy chủ có thể được tùy chỉnh theo cách tương tự như các lớp máy chủ ổ cắm khác [ví dụ: thêm luồng, freoking hoặc xác thực địa chỉ khách hàng]. Một trình bao bọc xác thực có thể được đặt xung quanh trình xử lý yêu cầu bằng cách kế thừa từ simplexmlrpcrequestHandler hoặc docxmlrpcrequestHandler và mở rộng phương thức do_post []. Dưới đây là một ví dụ giới hạn kích thước của các yêu cầu đến: Hãy thử: Từ XMLRPC.Server Nhập [SimplexMLRPCServer, SimplexMLRPCrequestHandler] Ngoại trừ Bộ nhập khẩu . S = SimplexMLRPCServer [['', 8080], MaxSizeXMLRPChandler]

Nếu bạn muốn thêm bất kỳ loại xác thực dựa trên HTTP nào, nó cũng có thể được thực hiện theo cách tương tự.

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

Tùy chỉnh máy chủ nâng cao Các mô-đun máy chủ XML-RPC rất dễ sử dụng cho các loại điện toán phân tán cơ bản. Ví dụ: XML-RPC có thể được sử dụng làm giao thức để điều khiển cấp cao của các hệ thống khác trên mạng, miễn là tất cả chúng đều đang chạy một máy chủ XML-RPC phù hợp. Các đối tượng thú vị hơn cũng có thể được truyền giữa các hệ thống nếu bạn sử dụng mô -đun Pickle. Một mối quan tâm với XML-RPC là bảo mật. Theo mặc định, máy chủ XML-RPC chạy dưới dạng dịch vụ mở trên mạng, vì vậy bất kỳ ai biết địa chỉ và cổng của máy chủ đều có thể kết nối với nó [trừ khi nó được bảo vệ bởi tường lửa]. Ngoài ra, các máy chủ XML-RPC không giới hạn về lượng dữ liệu có thể được gửi trong một yêu cầu. Kẻ tấn công có khả năng gặp sự cố máy chủ bằng cách gửi yêu cầu POST HTTP với tải trọng lớn đến mức độ xả. Nếu bạn muốn giải quyết bất kỳ vấn đề nào trong số này, bạn sẽ cần tùy chỉnh các lớp máy chủ XMLRPC hoặc trình xử lý yêu cầu. Tất cả các lớp máy chủ được kế thừa từ TCPServer trong mô -đun SocketServer.SUS, các máy chủ có thể được tùy chỉnh theo cách tương tự như các lớp máy chủ ổ cắm khác [ví dụ: thêm luồng, freoking hoặc xác thực địa chỉ khách hàng]. Một trình bao bọc xác thực có thể được đặt xung quanh trình xử lý yêu cầu bằng cách kế thừa từ simplexmlrpcrequestHandler hoặc docxmlrpcrequestHandler và mở rộng phương thức do_post []. Dưới đây là một ví dụ giới hạn kích thước của các yêu cầu đến: Hãy thử: Từ XMLRPC.Server Nhập [SimplexMLRPCServer, SimplexMLRPCrequestHandler] Ngoại trừ Bộ nhập khẩu . S = SimplexMLRPCServer [['', 8080], MaxSizeXMLRPChandler]

Nếu bạn muốn thêm bất kỳ loại xác thực dựa trên HTTP nào, nó cũng có thể được thực hiện theo cách tương tự.

23 Lập trình web P

Ython được sử dụng rộng rãi khi xây dựng các trang web và phục vụ một số vai trò khác nhau trong khả năng này. Đầu tiên, các tập lệnh Python thường là một cách hữu ích để chỉ cần tạo một tập hợp các trang HTML tĩnh sẽ được cung cấp bởi một máy chủ web. Ví dụ: tập lệnh có thể được sử dụng để lấy nội dung thô và trang trí nó với các tính năng bổ sung mà bạn thường thấy trên một trang web [thanh điều hướng, thanh bên, quảng cáo, bảng kiểu, v.v.]. Đây chủ yếu chỉ là vấn đề xử lý tệp và văn bản Xử lý các bài phát hành đã được đề cập trong các phần khác của cuốn sách. Thứ hai, các tập lệnh Python được sử dụng để tạo nội dung động. Ví dụ, một trang web có thể hoạt động bằng cách sử dụng máy chủ web tiêu chuẩn như Apache nhưng sẽ sử dụng các tập lệnh Python để xử lý động các loại yêu cầu nhất định. Việc sử dụng Python chủ yếu liên quan đến xử lý biểu mẫu. Ví dụ: trang HTML có thể bao gồm một biểu mẫu như thế này:

F

H lib

fl

B

d

ff

Chương 22 Lập trình ứng dụng Internet

532

Ython được sử dụng rộng rãi khi xây dựng các trang web và phục vụ một số vai trò khác nhau trong khả năng này. Đầu tiên, các tập lệnh Python thường là một cách hữu ích để chỉ cần tạo một tập hợp các trang HTML tĩnh sẽ được cung cấp bởi một máy chủ web. Ví dụ: tập lệnh có thể được sử dụng để lấy nội dung thô và trang trí nó với các tính năng bổ sung mà bạn thường thấy trên một trang web [thanh điều hướng, thanh bên, quảng cáo, bảng kiểu, v.v.]. Đây chủ yếu chỉ là vấn đề xử lý tệp và văn bản Xử lý các bài phát hành đã được đề cập trong các phần khác của cuốn sách. Thứ hai, các tập lệnh Python được sử dụng để tạo nội dung động. Ví dụ, một trang web có thể hoạt động bằng cách sử dụng máy chủ web tiêu chuẩn như Apache nhưng sẽ sử dụng các tập lệnh Python để xử lý động các loại yêu cầu nhất định. Việc sử dụng Python chủ yếu liên quan đến xử lý biểu mẫu. Ví dụ: trang HTML có thể bao gồm một biểu mẫu như thế này:

Tên của bạn: Địa chỉ email của bạn:

Trong biểu mẫu, thuộc tính hành động đặt tên cho tập lệnh Python 'đăng ký.py' sẽ thực thi trên máy chủ khi biểu mẫu được gửi. Một kịch bản phổ biến khác liên quan đến việc tạo nội dung động là với AJAX [JavaScript không đồng bộ và XML]. Với AJAX, Trình xử lý sự kiện JavaScript được liên kết với các yếu tố HTML nhất định trên một trang. Ví dụ: khi chuột di chuyển qua một phần tử tài liệu cụ thể, hàm JavaScript có thể thực thi và gửi yêu cầu HTTP đến máy chủ web được xử lý [có thể bằng tập lệnh Python]. Khi nhận được phản hồi liên quan, một chức năng JavaScript khác thực hiện để xử lý dữ liệu phản hồi và hiển thị kết quả. Có nhiều cách để kết quả có thể được trả về. Ví dụ: một máy chủ có thể trả về dữ liệu dưới dạng văn bản, XML, JSON hoặc bất kỳ số định dạng nào khác. Dưới đây là một ví dụ về tài liệu HTML minh họa một cách để thực hiện bật lên Hover trong đó di chuyển chuột qua các phần tử được chọn khiến cửa sổ bật lên xuất hiện.

F

H lib

fl

B

d

ff

CGI

533

Hình 23.1 Hiển thị trình duyệt có thể có trong đó văn bản nền chỉ là một tài liệu HTML thông thường và cửa sổ bật lên được tạo động bởi tập lệnh popupdata.py.

Phần còn lại của chương này mô tả các mô-đun tích hợp liên quan đến giao diện cấp thấp theo đó giao diện Python với máy chủ web và khung. để viết các thành phần tích hợp với các khung web khác nhau của Python.

CGI Mô -đun CGI được sử dụng để triển khai các tập lệnh CGI, các chương trình thường được thực hiện bởi máy chủ web khi muốn xử lý đầu vào của người dùng từ biểu mẫu hoặc tạo nội dung động thuộc loại nào đó. Khi một yêu cầu tương ứng với tập lệnh CGI được gửi, máy chủ web thực hiện chương trình CGI dưới dạng quy trình con. Các chương trình CGI nhận được đầu vào từ hai nguồn: Sys.stdin và các biến môi trường do máy chủ đặt

Sự mô tả

Auth_type nội dung_length content_type document_root gateway_interface http_accept http_cookie http_from http_referer http_user_agent path_info path_translated query_string

Phương pháp xác thực Độ dài dữ liệu được truyền trong sys.stdin Loại tài liệu dữ liệu truy vấn Thư mục gốc CGI Các loại MIME MIME được chấp nhận bởi máy khách NetScape Giá trị cookie liên tục Địa chỉ email của khách hàng Truy vấn chuỗi địa chỉ IP từ xa của máy chủ máy chủ từ xa của máy khách

F

H lib

fl

B

d

ff

534

CGI

Hình 23.1 Hiển thị trình duyệt có thể có trong đó văn bản nền chỉ là một tài liệu HTML thông thường và cửa sổ bật lên được tạo động bởi tập lệnh popupdata.py.

Sự mô tả

Auth_type nội dung_length content_type document_root gateway_interface http_accept http_cookie http_from http_referer http_user_agent path_info path_translated query_string

Phương pháp xác thực Độ dài dữ liệu được truyền trong sys.stdin Loại tài liệu dữ liệu truy vấn Thư mục gốc CGI Các loại MIME MIME được chấp nhận bởi máy khách NetScape Giá trị cookie liên tục Địa chỉ email của khách hàng Truy vấn chuỗi địa chỉ IP từ xa của máy chủ máy chủ từ xa của máy khách

Chương 23 Lập trình web

Biến đổi

Remote_ident remote_user request_method script_name

Người dùng thực hiện yêu cầu Phương thức người dùng được xác thực

Server_name server_port server_protocol server_software

Như đầu ra, một chương trình CGI viết vào các sys.stdout đầu ra tiêu chuẩn. Các chi tiết đẫm máu của lập trình CGI có thể được tìm thấy trong một cuốn sách như lập trình CGI với Perl, phiên bản thứ 2, của Shishir Gundavaram [O KhănReilly & Associates, 2000]. Đối với mục đích của chúng tôi, thực sự chỉ có hai điều cần biết. Đầu tiên, nội dung của biểu mẫu HTML được chuyển đến chương trình CGI theo chuỗi văn bản được gọi là chuỗi truy vấn. Trong Python, nội dung của chuỗi truy vấn được truy cập bằng lớp FieldStorage. Ví dụ: Nhập CGI Form = CGI.FieldStorage [] name = form.getValue ['name'] email = form.getValue ['email']

# Nhận trường 'Tên' từ biểu mẫu # Nhận trường 'Email' từ biểu mẫu

Thứ hai, đầu ra của chương trình CGI bao gồm hai phần: tiêu đề HTTP và dữ liệu thô [thường là HTML]. Một dòng trống luôn tách biệt hai thành phần này. Một tiêu đề HTTP đơn giản trông như thế này: in 'Loại nội dung: Text/html \ r' print '\ r'

# HTML Đầu ra # dòng trống [Yêu cầu!]

Phần còn lại của đầu ra là đầu ra thô. Ví dụ: In 'Tập lệnh CGI của tôi' In 'Hello World!' In 'Bạn là %s [ %s]' %[tên, email]

Đó là thông lệ tiêu chuẩn mà các tiêu đề HTTP được chấm dứt bằng cách sử dụng quy ước chính của Windows là '\ r \ n'.That là lý do tại sao' \ r 'xuất hiện trong ví dụ. Nếu bạn cần báo hiệu một lỗi, bao gồm một tiêu đề 'trạng thái đặc biệt:' trong đầu ra. Ví dụ: in in in

H lib

fl

B

d

ff

CGI

535

Hình 23.1 Hiển thị trình duyệt có thể có trong đó văn bản nền chỉ là một tài liệu HTML thông thường và cửa sổ bật lên được tạo động bởi tập lệnh popupdata.py.

Sự mô tả

f.name f.filename f.value f.file f.type f.type_options

Tên trường, nếu tên tệp phía máy khách được chỉ định được sử dụng trong giá trị tải lên dưới dạng đối tượng giống như tệp chuỗi mà dữ liệu có thể được đọc từ điển loại nội dung của các tùy chọn được chỉ định trên dòng loại nội dung của HTTP yêu cầu ; Không có nếu không được chỉ định từ điển của các tùy chọn xử lý một đối tượng giống như từ điển chứa tất cả các nội dung tiêu đề HTTP

F.Disp vị trí f.dispations_options f.headers

Các giá trị từ một biểu mẫu có thể được trích xuất bằng các phương thức sau: form.getValue [fieldName [, mặc định]]

Trả về giá trị của một trường đã cho với tên trường. Nếu một trường được xác định hai lần, hàm này sẽ trả về một danh sách tất cả các giá trị được xác định. Nếu mặc định được cung cấp, nó chỉ định giá trị để trả về nếu trường không có. Một thận trọng với phương thức này là nếu cùng một tên trường được bao gồm hai lần trong yêu cầu, giá trị trả về sẽ là một danh sách chứa cả hai giá trị. Để đơn giản hóa lập trình, bạn có thể sử dụng form.getFirst [], chỉ đơn giản là trả về giá trị đầu tiên tìm. form.getFirst [fieldName [, mặc định]]

Trả về giá trị đầu tiên được xác định cho một trường với tên trường tên. Nếu mặc định được cung cấp, nó chỉ định giá trị để trả về nếu trường không có. form.getList [FieldName]

Trả về một danh sách tất cả các giá trị được xác định cho FieldName. Nó luôn trả về một danh sách, ngay cả khi chỉ có một giá trị được xác định và trả về một danh sách trống nếu không có giá trị tồn tại. Ngoài ra, mô -đun CGI xác định một lớp, minifieldStorage, chỉ chứa tên và giá trị thuộc tính. Lớp này được sử dụng để biểu diễn các trường riêng lẻ của một biểu mẫu được truyền trong chuỗi truy vấn, trong khi trường đại học được sử dụng để chứa nhiều trường và dữ liệu đa dạng.

F

H lib

fl

B

d

ff

536

Chương 23 Lập trình web

Các trường hợp của FieldStorage được truy cập như từ điển Python, trong đó các khóa là tên trường trên biểu mẫu. Khi được truy cập theo cách này, các đối tượng được trả về là bản thân chúng là một trường hợp của FieldStorage cho dữ liệu đa điểm [loại nội dung là 'đa dạng/dữ liệu hình thức' ' ] hoặc tải lên tệp, một thể hiện của minifieldStorage cho các trường đơn giản [loại nội dung là 'Ứng dụng/X-www-form-urlencoded'] hoặc danh sách các trường hợp đó trong trường hợp một biểu mẫu chứa nhiều trường có cùng tên. Ví dụ: form = cgi.fieldStorage [] nếu "tên" không ở dạng: lỗi ["Tên bị thiếu"] Tên trả về = form ['name']. Giá trị email = form ['email'].

# Nhận trường 'Tên' từ biểu mẫu # Nhận trường 'Email' từ biểu mẫu

Nếu một trường đại diện cho một tệp được tải lên, việc truy cập thuộc tính giá trị sẽ đọc toàn bộ tệp vào bộ nhớ dưới dạng chuỗi byte. Bởi vì điều này có thể tiêu thụ một lượng lớn bộ nhớ trên máy chủ, nên có thể đọc dữ liệu được tải lên theo các phần nhỏ hơn bằng cách đọc trực tiếp từ thuộc tính tệp. Chẳng hạn, ví dụ sau đọc dữ liệu được tải lên từng dòng: fileItem = form ['userFile'] nếu fileitem.file: # Đó là một tệp được tải lên; Đếm các dòng lineCount = 0 trong khi true: line = fileItem.file.Readline [] nếu không dòng: break linecount = linecount + 1

Các chức năng tiện ích sau đây thường được sử dụng trong các tập lệnh CGI: Escape [S [, QUOTE]]

Chuyển đổi các ký tự '&', '' trong chuỗi s thành các chuỗi an toàn html-safe như '&', ''. Nếu trích dẫn cờ tùy chọn là đúng, ký tự trích dẫn kép ["] cũng được dịch thành '"'. parse_header [chuỗi]

Phân tích dữ liệu được cung cấp sau trường tiêu đề HTTP, chẳng hạn như 'loại nội dung'. Dữ liệu được chia thành một giá trị chính và từ điển các tham số thứ cấp được trả về trong một bộ xử lý. Ví dụ: lệnh parse_header ['text/html; a = hello; b = "world"']]

Trả về kết quả này: ['Text/html', {'a': 'xin chào', 'b': 'thế giới'}]. parse_multipart [fp, pdict] parse_multipart [fp, pdict]

Phân tích đầu vào của loại 'Multipart/Form-data' như được sử dụng thường được sử dụng với các tải lên tệp. FP là tệp đầu vào và PDICT là một từ điển chứa các tham số của tiêu đề loại nội dung. Nó trả về một tên trường ánh xạ từ điển vào danh sách các giá trị. Chức năng này không hoạt động với dữ liệu đa điểm lồng nhau. Lớp FieldStorage nên được sử dụng thay thế.

F

H lib

fl

B

d

ff

Chương 23 Lập trình web

537

Các trường hợp của FieldStorage được truy cập như từ điển Python, trong đó các khóa là tên trường trên biểu mẫu. Khi được truy cập theo cách này, các đối tượng được trả về là bản thân chúng là một trường hợp của FieldStorage cho dữ liệu đa điểm [loại nội dung là 'đa dạng/dữ liệu hình thức' ' ] hoặc tải lên tệp, một thể hiện của minifieldStorage cho các trường đơn giản [loại nội dung là 'Ứng dụng/X-www-form-urlencoded'] hoặc danh sách các trường hợp đó trong trường hợp một biểu mẫu chứa nhiều trường có cùng tên. Ví dụ: form = cgi.fieldStorage [] nếu "tên" không ở dạng: lỗi ["Tên bị thiếu"] Tên trả về = form ['name']. Giá trị email = form ['email'].

# Nhận trường 'Tên' từ biểu mẫu # Nhận trường 'Email' từ biểu mẫu

Nếu một trường đại diện cho một tệp được tải lên, việc truy cập thuộc tính giá trị sẽ đọc toàn bộ tệp vào bộ nhớ dưới dạng chuỗi byte. Bởi vì điều này có thể tiêu thụ một lượng lớn bộ nhớ trên máy chủ, nên có thể đọc dữ liệu được tải lên theo các phần nhỏ hơn bằng cách đọc trực tiếp từ thuộc tính tệp. Chẳng hạn, ví dụ sau đọc dữ liệu được tải lên từng dòng: fileItem = form ['userFile'] nếu fileitem.file: # Đó là một tệp được tải lên; Đếm các dòng lineCount = 0 trong khi true: line = fileItem.file.Readline [] nếu không dòng: break linecount = linecount + 1

Các chức năng tiện ích sau đây thường được sử dụng trong các tập lệnh CGI: Escape [S [, QUOTE]]

Chuyển đổi các ký tự '&', '' trong chuỗi s thành các chuỗi an toàn html-safe như '&', ''. Nếu trích dẫn cờ tùy chọn là đúng, ký tự trích dẫn kép ["] cũng được dịch thành '"'. parse_header [chuỗi]

Viết một tiêu đề HTTP tối thiểu và in tất cả các thông tin được cung cấp cho tập lệnh ở định dạng HTML. Chủ yếu được sử dụng để gỡ lỗi để đảm bảo môi trường CGI của bạn được thiết lập chính xác.

Lời khuyên lập trình CGI Trong thời đại hiện tại của các khung web, kịch bản CGI dường như đã không còn thời trang. Tuy nhiên, nếu bạn định sử dụng nó, có một vài mẹo lập trình có thể đơn giản hóa cuộc sống của bạn. Đầu tiên, đừng viết các tập lệnh CGI trong đó bạn đang sử dụng một số lượng lớn các câu lệnh in để tạo ra đầu ra HTML được mã hóa cứng. Chương trình kết quả sẽ là một mớ hỗn độn khủng khiếp của Python và HTML không chỉ không thể đọc được mà còn không thể đọc được để duy trì. Một cách tiếp cận tốt hơn là dựa vào các mẫu. Tối thiểu, đối tượng String.Template có thể được sử dụng cho điều này. Dưới đây là một ví dụ phác thảo khái niệm: Nhập CGI từ Chuỗi nhập mẫu def Lỗi [thông báo]: TEMP = Mẫu [Open ["errorMsg.html"]. Đọc []] in '\ r' in temp.subst acad [{'message': message}] form = cgi.fieldStorage [] name = form.getFirst ['name'] email = form.getfirst ['email'] nếu không tên: lỗi .

F

H lib

fl

B

d

ff

Chương 23 Lập trình web

538

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

Trong ví dụ này, lỗi của các tệp.html 'và' Thành công.html 'là các trang HTML có tất cả đầu ra nhưng bao gồm các thay thế biến $ tương ứng với các giá trị được tạo động được sử dụng trong tập lệnh CGI. Ví dụ: tệp 'thành công.html' có thể trông như thế này:

Thành công

Chào mừng $ Tên. Bạn đã đăng ký thành công vào bản tin của chúng tôi. Mã xác nhận của bạn là $ xác nhận.

Hoạt động Temp.Subst acad [] trong tập lệnh chỉ đơn giản là điền vào các biến trong tệp này. Một lợi ích rõ ràng của phương pháp này là nếu bạn muốn thay đổi sự xuất hiện của đầu ra, bạn chỉ cần sửa đổi các tệp mẫu, chứ không phải tập lệnh CGI. Có nhiều động cơ mẫu thứ ba có sẵn cho Python, có lẽ có số lượng lớn hơn các khung web. Chúng lấy khái niệm khuôn mẫu và xây dựng nó theo những cách đáng kể. Xem //wiki.python.org/moin/templating thêm chi tiết. Thứ hai, nếu bạn cần lưu dữ liệu từ tập lệnh CGI, hãy thử sử dụng cơ sở dữ liệu. Mặc dù đủ dễ dàng để ghi dữ liệu trực tiếp vào các tệp, máy chủ web hoạt động đồng thời và trừ khi bạn đã thực hiện các bước để khóa và đồng bộ hóa các tài nguyên đúng cách, có thể các tệp sẽ bị hỏng. Các máy chủ cơ sở dữ liệu và giao diện Python liên quan của họ thường không có vấn đề này. Vì vậy, nếu bạn cần lưu dữ liệu, hãy thử sử dụng một mô-đun như SQLite3 hoặc mô-đun của bên thứ ba cho một cái gì đó như MySQL. Cuối cùng, nếu bạn thấy mình viết hàng tá tập lệnh CGI và mã phải xử lý các chi tiết cấp thấp của HTTP như cookie, xác thực, mã hóa, v.v. Sử dụng một khung là để bạn không phải lo lắng về những chi tiết đó, ít nhất là không nhiều. Vì vậy, don lồng phát minh lại bánh xe.

Ghi chú n

Quá trình cài đặt chương trình CGI khác nhau theo loại máy chủ web đang được sử dụng. Về mặt các chương trình được đặt trong một thư mục CGI-Bin đặc biệt. Một máy chủ cũng có thể yêu cầu cấu hình bổ sung. Bạn nên tham khảo tài liệu cho máy chủ hoặc quản trị viên máy chủ để biết thêm chi tiết.

F

H lib

fl

B

d

ff

Chương 23 Lập trình web

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

539

Trong ví dụ này, lỗi của các tệp.html 'và' Thành công.html 'là các trang HTML có tất cả đầu ra nhưng bao gồm các thay thế biến $ tương ứng với các giá trị được tạo động được sử dụng trong tập lệnh CGI. Ví dụ: tệp 'thành công.html' có thể trông như thế này:

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

# In các giá trị trang đầu ra = {'name': name, 'email': email, 'xác nhận:' [] in temp.substologists [giá trị]

Trong ví dụ này, lỗi của các tệp.html 'và' Thành công.html 'là các trang HTML có tất cả đầu ra nhưng bao gồm các thay thế biến $ tương ứng với các giá trị được tạo động được sử dụng trong tập lệnh CGI. Ví dụ: tệp 'thành công.html' có thể trông như thế này:

cgitb This module provides an alternative exception handler that displays a detailed report whenever an uncaught exception occurs.The report contains source code, values of parameters, and local variables. Originally, this module was developed to help debug CGI scripts, but it can be used in any application. enable[[display [, logdir [, context [, format]]]]]

Enables special exception handling. display is a flag that determines whether any information is displayed when an error occurs.The default value is 1. logdir specifies a directory in which error reports will be written to files instead of printed to standard output.When logdir is given, each error report is written to a unique file created by the tempfile.mkstemp[] function. context is an integer specifying the number of lines of source code to display around lines upon which the exception occurred. format is a string that specifies the output format. A format of 'html' specifies HTML [the default]. Any other value results in plain-text format. handle[[info]]

Handles an exception using the default settings of the enable[] function. info is a tuple [exctype, excvalue, tb] where exctype is an exception type, excvalue is an exception value, and tb is a traceback object.This tuple is normally obtained using sys.exc_info[]. If info is omitted, the current exception is used.

F

h Lib

fL

B

d

ff

540

Chapter 23 Web Programming

Note To enable special exception handling in CGI scripts, include the line import cgitb; enable[] at the beginning of the script.

wsgiref WSGI [Python Web Server Gateway Interface] is a standardized interface between webservers and web applications that is designed to promote portability of applications across different webservers and frameworks. An official description of the standard is found in PEP 333 [//www.python.org/dev/peps/pep-0333]. More information about the standard and its use can also be found at //www.wsgi.org.The wsgiref package is a reference implementation that can be used for testing, validation, and simple deployments.

The WSGI Specification With WSGI, a web application is implemented as a function or callable object webapp[environ, start_response] that accepts two arguments. environ is a dictionary of environment settings that is minimally required to have the following values which have the same meaning and names as is used in CGI scripting: environ Variables

Description

CONTENT_LENGTH CONTENT_TYPE HTTP_ACCEPT HTTP_COOKIE HTTP_REFERER HTTP_USER_AGENT PATH_INFO QUERY_STRING REQUEST_METHOD SCRIPT_NAME SERVER_NAME SERVER_PORT SERVER_PROTOCOL

Length of data passed Type of query data MIME types accepted by the client Netscape persistent cookie value Referring URL Client browser Extra path information passed Query string Method ['GET' or 'POST'] Name of the program Server host name Server port number Server protocol

In addition, the environ dictionary is required to contain the following WSGI-specific values: environ Variables

Description

wsgi.version wsgi.url_scheme

Tuple representing the WSGI version [e.g., [1,0] for WSGI 1.0]. String representing the scheme component of the URL. For example, 'http' or 'https'. A file-like object representing the input stream. Additional data such as form data or uploads are read from this. A file-like object opened in text mode for writing error output.

wsgi.input wsgi.errors

F

h Lib

fL

B

d

ff

wsgiref

541

environ Variables

Description

wsgi.multithread

A Boolean flag that’s True if the application can be executed concurrently by another thread in the same process. A Boolean flag that’s True if the application can be executed concurrently by another process. A Boolean flag that’s True if the application will only be executed once during the lifetime of the executing process.

wsgi.multiprocess wsgi.run_once

The start_response parameter is a callable object of the form start_response[status, headers] that is used by the application to start a response. status is a string such as '200 OK' or '404 Not Found'. headers is a list of tuples, each of the form [name, value] corresponding to a HTTP header to be included in the response—for example, ['Content-type','text/html']. The data or body of a response is returned by the web application function as an iterable object that produces a sequence of byte strings or text strings that only contain characters which can be encoded as a single byte [e.g., compatible with the ISO-8859-1 or Latin-1 character set]. Examples include a list of byte strings or a generator function producing byte strings. If an application needs to do any kind of character encoding such as UTF-8, it must do this itself. Here is an example of a simple WSGI application that reads form fields and produces some output, similar to what was shown in the cgi module section: import cgi def subscribe_app[environ, start_response]: fields = cgi.FieldStorage[environ['wsgi.input'], environ=environ] name = fields.getvalue["name"] email = fields.getvalue["email"] # Various processing status = "200 OK" headers = [['Content-type','text/plain']] start_response[status, headers] response = [ 'Hi %s. Thank you for subscribing.' % name, 'You should expect a response soon.' ] return [line.encode['utf-8'] for line in response]

Có một vài chi tiết quan trọng trong ví dụ này. Đầu tiên, các thành phần ứng dụng WSGI không được gắn với khung cụ thể, máy chủ web hoặc bộ mô -đun thư viện. Trong ví dụ, chúng tôi chỉ sử dụng một mô -đun thư viện, CGI, đơn giản vì nó có một số hàm tiện lợi để phân tích các biến truy vấn. Được xây dựng như một danh sách các chuỗi. Câu lệnh cuối cùng trong ứng dụng này là một biểu thức trình tạo biến tất cả các chuỗi thành chuỗi byte. Nếu bạn sử dụng Python 3, thì đây là một bước quan trọng, tất cả các ứng dụng WSGI dự kiến ​​sẽ trả về các byte được mã hóa, không phải là dữ liệu Unicode không được mã hóa. Để triển khai ứng dụng WSGI, nó phải được đăng ký với khung lập trình web mà bạn đang sử dụng. Đối với điều này, bạn sẽ phải đọc hướng dẫn.

F

H lib

fl

B

d

ff

542

Chương 23 Lập trình web

Gói WSGIREF Gói WSGIREF cung cấp triển khai tham chiếu của tiêu chuẩn WSGI cho phép các ứng dụng được kiểm tra trong các máy chủ độc lập hoặc được thực thi dưới dạng tập lệnh CGI thông thường.

wsgiref.simple_server mô-đun WSGiref.Simple_Server thực hiện một máy chủ HTTP độc lập đơn giản chạy một ứng dụng WSGI duy nhất. Chỉ có hai chức năng quan tâm: make_server [máy chủ, cổng, ứng dụng]

Tạo một máy chủ HTTP chấp nhận các kết nối trên máy chủ và cổng số máy chủ đã cho. Ứng dụng là một hàm hoặc đối tượng có thể gọi được thực hiện ứng dụng WSGI. Để chạy máy chủ, hãy sử dụng s.serve_forver [] trong đó s là một thể hiện của máy chủ được trả về. demo_app [Môi trường, Start_Response]

Một ứng dụng WSGI hoàn chỉnh trả về một trang với tin nhắn Hello Hello World trên đó. Điều này có thể được sử dụng làm đối số ứng dụng cho make_server [] để xác minh rằng máy chủ đang hoạt động chính xác. Dưới đây là một ví dụ về việc chạy một máy chủ WSGI đơn giản: def my_app [Envir, start_response]: # Một số ứng dụng start_response ["200 OK", [ không

WSGiref.Handlers Mô -đun WSGiref.Handlers chứa các đối tượng xử lý để thiết lập môi trường thực thi WSGI để các ứng dụng có thể chạy trong một máy chủ web khác [ví dụ: tập lệnh CGI theo Apache]. Có một số đối tượng khác nhau. Cgihandler []

Tạo một đối tượng xử lý WSGI chạy bên trong môi trường CGI tiêu chuẩn. Trình xử lý này thu thập thông tin từ các biến môi trường tiêu chuẩn và các luồng I/O như được mô tả trong mô -đun thư viện CGI. BasecgiHandler [stdin, stdout, stderr, môi trường [, multithread [, multiprocess]]]]

Tạo một trình xử lý WSGI hoạt động trong môi trường CGI, nhưng trong đó các luồng I/O tiêu chuẩn và các biến môi trường có thể được thiết lập theo một cách khác. Stdin, stdout và stderr chỉ định các đối tượng giống như tệp cho các luồng I/O tiêu chuẩn. Môi trường là một từ điển của các biến môi trường được dự kiến ​​đã chứa các biến môi trường CGI tiêu chuẩn. MultiThread và Multiprocess là các cờ boolean được sử dụng để đặt các biến môi trường wsgi.multithread và wsgi.multiprocess. Theo mặc định, đa luồng là đúng và đa xử lý là sai.

F

H lib

fl

B

d

ff

Chương 23 Lập trình web

543

Gói WSGIREF Gói WSGIREF cung cấp triển khai tham chiếu của tiêu chuẩn WSGI cho phép các ứng dụng được kiểm tra trong các máy chủ độc lập hoặc được thực thi dưới dạng tập lệnh CGI thông thường.

wsgiref.simple_server mô-đun WSGiref.Simple_Server thực hiện một máy chủ HTTP độc lập đơn giản chạy một ứng dụng WSGI duy nhất. Chỉ có hai chức năng quan tâm: make_server [máy chủ, cổng, ứng dụng]

Tạo một máy chủ HTTP chấp nhận các kết nối trên máy chủ và cổng số máy chủ đã cho. Ứng dụng là một hàm hoặc đối tượng có thể gọi được thực hiện ứng dụng WSGI. Để chạy máy chủ, hãy sử dụng s.serve_forver [] trong đó s là một thể hiện của máy chủ được trả về. demo_app [Môi trường, Start_Response]

Một ứng dụng WSGI hoàn chỉnh trả về một trang với tin nhắn Hello Hello World trên đó. Điều này có thể được sử dụng làm đối số ứng dụng cho make_server [] để xác minh rằng máy chủ đang hoạt động chính xác. Dưới đây là một ví dụ về việc chạy một máy chủ WSGI đơn giản: def my_app [Envir, start_response]: # Một số ứng dụng start_response ["200 OK", [ không

Lưu ý tài liệu trong phần này chủ yếu nhắm vào người dùng WSGI muốn tạo các đối tượng ứng dụng. Mặt khác, nếu bạn đang triển khai một khung web khác cho Python, bạn nên tham khảo PEP 333 để biết chi tiết chính thức về chính xác những gì cần thiết để tạo ra WSGI hỗ trợ khung của bạn. Nếu bạn đang sử dụng khung web của bên thứ ba, bạn sẽ cần tham khảo tài liệu khung để biết chi tiết liên quan đến hỗ trợ của nó cho các đối tượng WSGI. Cho rằng WSGI là một đặc điểm kỹ thuật được ban phước chính thức với việc triển khai tham chiếu trong thư viện tiêu chuẩn, ngày càng phổ biến đối với các khung để cung cấp một số mức hỗ trợ cho nó.

F

H lib

fl

B

d

ff

544

Chương 23 Lập trình web

Webbrowser Mô-đun Webbrowser cung cấp các chức năng tiện ích để mở tài liệu trong trình duyệt web theo cách độc lập với nền tảng. Việc sử dụng chính của mô-đun này là trong các tình huống phát triển và thử nghiệm. Ví dụ: nếu bạn đã viết một tập lệnh tạo ra đầu ra HTML, bạn có thể sử dụng các chức năng trong mô -đun này để tự động hướng trình duyệt hệ thống của bạn để xem kết quả. Mở [url [, mới [, autoraise]]]]

Hiển thị URL với trình duyệt mặc định trên hệ thống. Nếu mới là 0, URL được mở trong cùng một cửa sổ với trình duyệt đang chạy, nếu có thể. Nếu mới là 1, một cửa sổ trình duyệt mới được tạo. Nếu mới là 2, URL được mở trong một tab mới trong trình duyệt. Nếu autoraise là đúng, cửa sổ trình duyệt được nâng lên. Open_New [URL]

Hiển thị URL trong một cửa sổ mới của trình duyệt mặc định. Giống như mở [url, 1]. open_new_tab [url]

Hiển thị URL trong một tab mới của trình duyệt mặc định. Giống như mở [url, 2]. Nhận [[Tên]]

Trả về một đối tượng bộ điều khiển để thao tác trình duyệt. Tên là tên của loại trình duyệt và thường là một chuỗi như 'netscape', 'mozilla', 'kfm', 'grail', 'windows-default', 'Internet-config' hoặc 'dòng lệnh'. Đối tượng bộ điều khiển được trả về có các phương thức mở [] và open_new [] chấp nhận các đối số tương tự và thực hiện cùng một thao tác với hai hàm trước đó. Nếu tên bị bỏ qua, một đối tượng bộ điều khiển cho trình duyệt mặc định được trả về. Đăng ký [Tên, Constructor [, Bộ điều khiển]]

Đăng ký một loại trình duyệt mới để sử dụng với hàm get []. Tên là tên của trình duyệt. Constructor được gọi mà không có đối số để tạo đối tượng bộ điều khiển để mở các trang trong trình duyệt. Bộ điều khiển là một thể hiện bộ điều khiển để sử dụng thay thế. Nếu được cung cấp, hàm tạo bị bỏ qua và có thể không có. Một thể hiện bộ điều khiển, c, được trả về bởi hàm get [] có các phương thức sau: c.open [url [, new]]

Giống như hàm open []. c.open_new [url]

Giống như hàm open_new [].

F

H lib

fl

B

d

ff

Chương 23 Lập trình web

Webbrowser Mô-đun Webbrowser cung cấp các chức năng tiện ích để mở tài liệu trong trình duyệt web theo cách độc lập với nền tảng. Việc sử dụng chính của mô-đun này là trong các tình huống phát triển và thử nghiệm. Ví dụ: nếu bạn đã viết một tập lệnh tạo ra đầu ra HTML, bạn có thể sử dụng các chức năng trong mô -đun này để tự động hướng trình duyệt hệ thống của bạn để xem kết quả. Mở [url [, mới [, autoraise]]]]

Hiển thị URL với trình duyệt mặc định trên hệ thống. Nếu mới là 0, URL được mở trong cùng một cửa sổ với trình duyệt đang chạy, nếu có thể. Nếu mới là 1, một cửa sổ trình duyệt mới được tạo. Nếu mới là 2, URL được mở trong một tab mới trong trình duyệt. Nếu autoraise là đúng, cửa sổ trình duyệt được nâng lên. Open_New [URL]

Hiển thị URL trong một cửa sổ mới của trình duyệt mặc định. Giống như mở [url, 1]. open_new_tab [url]

Hiển thị URL trong một tab mới của trình duyệt mặc định. Giống như mở [url, 2]. Nhận [[Tên]]

Trả về một đối tượng bộ điều khiển để thao tác trình duyệt. Tên là tên của loại trình duyệt và thường là một chuỗi như 'netscape', 'mozilla', 'kfm', 'grail', 'windows-default', 'Internet-config' hoặc 'dòng lệnh'. Đối tượng bộ điều khiển được trả về có các phương thức mở [] và open_new [] chấp nhận các đối số tương tự và thực hiện cùng một thao tác với hai hàm trước đó. Nếu tên bị bỏ qua, một đối tượng bộ điều khiển cho trình duyệt mặc định được trả về. Đăng ký [Tên, Constructor [, Bộ điều khiển]]

Đăng ký một loại trình duyệt mới để sử dụng với hàm get []. Tên là tên của trình duyệt. Constructor được gọi mà không có đối số để tạo đối tượng bộ điều khiển để mở các trang trong trình duyệt. Bộ điều khiển là một thể hiện bộ điều khiển để sử dụng thay thế. Nếu được cung cấp, hàm tạo bị bỏ qua và có thể không có. Một thể hiện bộ điều khiển, c, được trả về bởi hàm get [] có các phương thức sau: c.open [url [, new]]

F

H lib

fl

B

d

ff

546

Chương 23 Lập trình web

Webbrowser Mô-đun Webbrowser cung cấp các chức năng tiện ích để mở tài liệu trong trình duyệt web theo cách độc lập với nền tảng. Việc sử dụng chính của mô-đun này là trong các tình huống phát triển và thử nghiệm. Ví dụ: nếu bạn đã viết một tập lệnh tạo ra đầu ra HTML, bạn có thể sử dụng các chức năng trong mô -đun này để tự động hướng trình duyệt hệ thống của bạn để xem kết quả. Mở [url [, mới [, autoraise]]]]

Hiển thị URL trong một cửa sổ mới của trình duyệt mặc định. Giống như mở [url, 1]. open_new_tab [url]

Hiển thị URL trong một tab mới của trình duyệt mặc định. Giống như mở [url, 2]. Nhận [[Tên]]

Trả về một đối tượng bộ điều khiển để thao tác trình duyệt. Tên là tên của loại trình duyệt và thường là một chuỗi như 'netscape', 'mozilla', 'kfm', 'grail', 'windows-default', 'Internet-config' hoặc 'dòng lệnh'. Đối tượng bộ điều khiển được trả về có các phương thức mở [] và open_new [] chấp nhận các đối số tương tự và thực hiện cùng một thao tác với hai hàm trước đó. Nếu tên bị bỏ qua, một đối tượng bộ điều khiển cho trình duyệt mặc định được trả về. Đăng ký [Tên, Constructor [, Bộ điều khiển]]

Đăng ký một loại trình duyệt mới để sử dụng với hàm get []. Tên là tên của trình duyệt. Constructor được gọi mà không có đối số để tạo đối tượng bộ điều khiển để mở các trang trong trình duyệt. Bộ điều khiển là một thể hiện bộ điều khiển để sử dụng thay thế. Nếu được cung cấp, hàm tạo bị bỏ qua và có thể không có. Một thể hiện bộ điều khiển, c, được trả về bởi hàm get [] có các phương thức sau: c.open [url [, new]]

Mã hóa một chuỗi byte S bằng cách sử dụng mã hóa cơ sở 64. Altchars, nếu được đưa ra, là một chuỗi hai nhân vật chỉ định các ký tự thay thế để sử dụng cho các ký tự '+' và '/' thường xuất hiện trong đầu ra cơ sở 64. Điều này rất hữu ích nếu mã hóa cơ sở 64 được sử dụng với tên tệp hoặc URL. B64Decode [S [, Altchars]]

Decodes String s, được mã hóa dưới dạng cơ sở 64 và trả về chuỗi byte với dữ liệu được giải mã. Altchars, nếu được đưa ra, là một chuỗi hai ký tự chỉ định các ký tự thay thế cho '+' và '/' thường xuất hiện trong dữ liệu được mã hóa cơ sở 64. Kiểu hàng được nâng lên nếu đầu vào chứa các ký tự bên ngoài hoặc được đệm không chính xác. Standard_b64encode [S]

Mã hóa chuỗi byte S bằng cách sử dụng mã hóa Base 64 tiêu chuẩn. Standard_B64Decode [S]

Giải mã chuỗi S bằng cách sử dụng mã hóa cơ sở tiêu chuẩn 64. urlsafe_b64encode [s]

Mã hóa chuỗi byte s bằng cơ sở 64 nhưng sử dụng các ký tự '-' và '_' thay vì '+' và '/', tương ứng. Giống như b64encode [s, '-_']. URLSAFE_B64DECODE [S]

Giải mã chuỗi S được mã hóa với mã hóa cơ sở URL an toàn 64. B32encode [s]

Mã hóa chuỗi byte S bằng cách sử dụng mã hóa cơ sở 32. B32Decode [s [, caseprint [, MAP01]]]]

Giải mã chuỗi S bằng cách sử dụng mã hóa cơ sở 32. Nếu Caseprint là đúng, cả chữ hoa và chữ thường được chấp nhận. Nếu không, chỉ có chữ hoa có thể xuất hiện [mặc định]. MAP01, nếu có, chỉ định chữ cái nào chữ số 1 bản đồ [ví dụ: chữ 'i' hoặc chữ 'l']. Nếu đối số này được đưa ra, chữ số '0' cũng được ánh xạ tới

F

H lib

fl

B

d

ff

Binascii

547

chữ 'o'. Một kiểu mẫu được nâng lên nếu chuỗi đầu vào chứa các ký tự bên ngoài hoặc được đệm không chính xác. B16encode [s]

Mã hóa một chuỗi byte S bằng cách sử dụng mã hóa cơ sở 16 [hex]. B16Decode [S [, Caseprint]]

Giải mã chuỗi S bằng cách sử dụng mã hóa cơ sở 16 [hex]. Nếu CASEPRIP là đúng, các chữ cái có thể là chữ hoa hoặc chữ thường. Mặt khác, các chữ cái thập lục phân 'A' - 'f' phải là chữ hoa [mặc định]. Tăng TypeError nếu chuỗi đầu vào chứa các ký tự bên ngoài hoặc bị dị tật theo bất kỳ cách nào. Các chức năng sau là một phần của giao diện mô -đun 64 cơ sở cũ mà bạn có thể thấy được sử dụng trong mã Python hiện có: giải mã [đầu vào, đầu ra]

Giải mã cơ sở dữ liệu được mã hóa 64. Đầu vào là tên tệp hoặc đối tượng tệp mở để đọc. Đầu ra là tên tệp hoặc đối tượng tệp mở để viết ở chế độ nhị phân. Decodestring [s]

Giải mã một chuỗi được mã hóa cơ sở 64, s. Trả về một chuỗi chứa dữ liệu nhị phân được giải mã. mã hóa [đầu vào, đầu ra]

Mã hóa dữ liệu bằng cơ sở 64. Đầu vào là tên tệp hoặc đối tượng tệp mở để đọc ở chế độ nhị phân. Đầu ra là một tên tệp hoặc một đối tượng tệp mở để viết. mã hóa [các]

Mã hóa một chuỗi byte, s, sử dụng cơ sở 64.

Binascii Mô-đun Binascii chứa các hàm ở mức độ thấp để chuyển đổi dữ liệu giữa nhị phân và một loạt các mã hóa ASCII, như cơ sở 64, Binhex và uuencoding. a2b_uu [s]

Chuyển đổi một dòng văn bản Uuencoded thành nhị phân và trả về chuỗi byte. Các dòng thường chứa 45 [nhị phân] byte, ngoại trừ dòng cuối cùng có thể ít hơn. Dữ liệu dòng có thể được theo sau bởi khoảng trắng. B2A_UU [dữ liệu]

Chuyển đổi một chuỗi dữ liệu nhị phân thành một dòng các ký tự ASCII được phân bổ uuencoded. Độ dài dữ liệu không nên quá 45 byte. Nếu không, ngoại lệ lỗi được nêu ra. a2b_base64 [chuỗi]

Chuyển đổi một chuỗi cơ sở 64 văn bản được mã hóa thành nhị phân và trả về chuỗi byte. B2A_BASE64 [Dữ liệu]

Chuyển đổi một chuỗi dữ liệu nhị phân thành một dòng các ký tự ASCII được mã hóa cơ sở 64. Độ dài dữ liệu không nên quá 57 byte nếu đầu ra kết quả được truyền qua email [nếu không nó có thể bị cắt].

F

H lib

fl

B

d

ff

548

Binascii

chữ 'o'. Một kiểu mẫu được nâng lên nếu chuỗi đầu vào chứa các ký tự bên ngoài hoặc được đệm không chính xác. B16encode [s]

Mã hóa một chuỗi byte S bằng cách sử dụng mã hóa cơ sở 16 [hex]. B16Decode [S [, Caseprint]]

Giải mã chuỗi S bằng cách sử dụng mã hóa cơ sở 16 [hex]. Nếu CASEPRIP là đúng, các chữ cái có thể là chữ hoa hoặc chữ thường. Mặt khác, các chữ cái thập lục phân 'A' - 'f' phải là chữ hoa [mặc định]. Tăng TypeError nếu chuỗi đầu vào chứa các ký tự bên ngoài hoặc bị dị tật theo bất kỳ cách nào. Các chức năng sau là một phần của giao diện mô -đun 64 cơ sở cũ mà bạn có thể thấy được sử dụng trong mã Python hiện có: giải mã [đầu vào, đầu ra]

Giải mã cơ sở dữ liệu được mã hóa 64. Đầu vào là tên tệp hoặc đối tượng tệp mở để đọc. Đầu ra là tên tệp hoặc đối tượng tệp mở để viết ở chế độ nhị phân. Decodestring [s]

Giải mã một chuỗi được mã hóa cơ sở 64, s. Trả về một chuỗi chứa dữ liệu nhị phân được giải mã. mã hóa [đầu vào, đầu ra]

Mã hóa dữ liệu bằng cơ sở 64. Đầu vào là tên tệp hoặc đối tượng tệp mở để đọc ở chế độ nhị phân. Đầu ra là một tên tệp hoặc một đối tượng tệp mở để viết. mã hóa [các]

Mã hóa một chuỗi byte, s, sử dụng cơ sở 64.

Binascii Mô-đun Binascii chứa các hàm ở mức độ thấp để chuyển đổi dữ liệu giữa nhị phân và một loạt các mã hóa ASCII, như cơ sở 64, Binhex và uuencoding. a2b_uu [s]

Computes the CRC-32 checksum of the byte string data. crc is an optional initial CRC value. If omitted, crc defaults to 0.

csv The csv module is used to read and write files consisting of comma-separated values [CSV]. A CSV file consists of rows of text, each row consisting of values separated by a delimiter character, typically a comma [,] or a tab. Here’s an example: Blues,Elwood,"1060 W Addison","Chicago, IL 60613","B263-1655-2187",116,56

Variants of this format commonly occur when working with databases and spreadsheets. For instance, a database might export tables in CSV format, allowing the tables to be read by other programs. Subtle complexities arise when fields contain the delimiter character. For instance, in the preceding example, one of the fields contains a comma and must be placed in quotes.This is why using basic string operations such as split[','] are often not enough to work with such files.

F

h Lib

fL

B

d

ff

csv

reader[csvfile [, dialect

549

[, **fmtparams]]

Returns a reader object that produces the values for each line of input of the input file csvfile. csvfile is any iterable object that produces a complete line of text on each iteration.The returned reader object is an iterator that produces a list of strings on each iteration.The dialect parameter is either a string containing the name of a dialect or a Dialect object.The purpose of the dialect parameter is to account for differences between different CSV encodings.The only built-in dialects supported by this module are 'excel' [which is the default value] and 'excel-tab', but others can be defined by the user as described later in this section. fmtparams is a set of keyword arguments that customize various aspects of the dialect.The following keyword arguments can be given: Keyword Argument

Description

delimiter doublequote

Character used to separate fields [the default is ',']. Boolean flag that determines how the quote character [quotechar] is handled when it appears in a field. If True, the character is simply doubled. If False, an escape character [escapechar] is used as a prefix. The default is True. Character used as an escape character when the delimiter appears in a field and quoting is QUOTE_NONE. The default value is None. Line termination sequence ['\r\n' is the default]. Character used to quote fields that contain the delimiter ['"' is the default]. If True, whitespace immediately following the delimiter is ignored [False is the default].

escapechar

lineterminator quotechar skipinitialspace

writer[csvfile [, dialect [, **fmtparam]]]

Returns a writer object that can be used to create a CSV file. csvfile is any file-like object that supports a write[] method. dialect has the same meaning as for reader[] and is used to handle differences between various CSV encodings. fmtparams has the same meaning as for readers. However, one additional keyword argument is available: Keyword Argument

Description

quoting

Controls the quoting behavior of output data. It’s set to one of QUOTE_ALL [quotes all fields], QUOTE_MINIMAL [only quote fields that contain the delimiter or start with the quote character], QUOTE_NONNUMERIC [quote all nonnumeric fields], or QUOTE_NONE [never quote fields]. The default value is QUOTE_MINIMAL.

A writer instance, w, supports the following methods: w.writerow[row]

Writes a single row of data to the file. row must be a sequence of strings or numbers.

F

h Lib

fL

B

d

ff

550

Chapter 24 Internet Data Handling and Encoding

w.writerows[rows]

Writes multiple rows of data. rows must be a sequence of rows as passed to the writerow[] method. DictReader[csvfile [, fieldnames [, restkey [, restval [, dialect [, ➥**fmtparams]]]]]]

Returns a reader object that operates like the ordinary reader but returns dictionary objects instead of lists of strings when reading the file. fieldnames provides a list of field names used as keys in the returned dictionary. If omitted, the dictionary key names are taken from the first row of the input file. restkey provides the name of a dictionary key that’s used to store excess data—for instance, if a row has more data fields than field names. restval is a default value that’s used as the value for fields that are missing from the input—for instance, if a row does not have enough fields.The default value of restkey and restval is None. dialect and fmtparams have the same meaning as for reader[]. DictWriter[csvfile, fieldnames [, restval [, extrasaction [, dialect [, ➥**fmtparams]]]]]

Returns a writer object that operates like the ordinary writer but writes dictionaries into output rows. fieldnames specifies the order and names of attributes that will be written to the file. restval is the value that’s written if the dictionary being written is missing one of the field names in fieldnames. extrasaction is a string that specifies what to do if a dictionary being written has keys not listed in fieldnames.The default value of extrasaction is 'raise', which raises a ValueError exception. A value of 'ignore' may be used, in which case extra values in the dictionary are ignored. dialect and fmtparams have the same meaning as with writer[]. A DictWriter instance, w, supports the following methods: w.writerow[row]

Viết một hàng dữ liệu duy nhất vào tệp. Hàng phải là một từ điển ánh xạ tên trường thành các giá trị. W.Writerows [hàng]

Viết nhiều hàng dữ liệu. Hàng phải là một chuỗi các hàng như được chuyển đến phương thức writerow []. Sniffer []

Tạo một đối tượng Sniffer được sử dụng để thử và tự động phát hiện định dạng của tệp CSV. Một ví dụ sniffer, s, có các phương pháp sau: s.sniff [mẫu [, phân định]]

Nhìn vào dữ liệu trong mẫu và trả về một đối tượng phương ngữ thích hợp đại diện cho định dạng dữ liệu. Mẫu là một phần của tệp CSV chứa ít nhất một hàng dữ liệu. Delimiters, nếu được cung cấp, là một chuỗi chứa các ký tự phân cách trường có thể. s.has_header [mẫu]

Nhìn vào dữ liệu CSV trong mẫu và trả về đúng nếu hàng đầu tiên trông giống như một bộ sưu tập các tiêu đề cột.

F

H lib

fl

B

d

ff

CSV

551

Phương ngữ Nhiều chức năng và phương pháp trong mô -đun CSV liên quan đến tham số phương ngữ đặc biệt. Mục đích của tham số này là phù hợp với các quy ước định dạng khác nhau của các tệp CSV [không có định dạng tiêu chuẩn chính thức của Hồi giáo] Các giá trị được phân chia và các giá trị được phân phối theo tab, trích dẫn các quy ước, v.v. Các phương ngữ được xác định bằng cách kế thừa từ phương ngữ lớp và xác định cùng một tập hợp các thuộc tính như các tham số định dạng được cung cấp cho các hàm của người đọc [] và writer [] [Delimiter, DoubleQuote, Escapechar, lineterminator, quotechar, trích dẫn, skipinitialspace]. Các chức năng tiện ích sau đây được sử dụng để quản lý phương ngữ: register_dialect [tên, phương ngữ]

Đăng ký một đối tượng phương ngữ mới, phương ngữ, dưới tên. unregister_disl [tên]

Xóa đối tượng phương ngữ với tên tên. get_dialect [tên]

Trả về đối tượng phương ngữ với tên tên. list_dialects []

Trả về một danh sách tất cả các tên phương ngữ đã đăng ký. Hiện tại, chỉ có hai phương ngữ tích hợp: 'Excel' và 'Excel-tab'.

Ví dụ Nhập CSV # Đọc tệp CSV cơ bản f = Open ["scmods.csv", "r"] cho r trong csv.reader [f]: lastName, firstName, street, city, zip = r print ["{0} {1} {2} {3} {4} ". Định dạng [*r]] ',' đường phố ',' thành phố ',' zip ']] cho a in r: print ["{firstName} {lastName} {street} {city} {zip}". định dạng [** a] Dữ liệu tệp CSV cơ bản = [['Blues', 'Elwood', '1060 W Addison', 'Chicago', 'IL', '60613'], ['McGurn', 'Jack', '4802 N Broadway', ' Chicago ',' il ',' 60640 '],] f = open ["address.csv", "w"] w = csv.writer [f] w.writerows [data] f.close []

F

H lib

fl

B

d

ff

552

CSV

Phương ngữ Nhiều chức năng và phương pháp trong mô -đun CSV liên quan đến tham số phương ngữ đặc biệt. Mục đích của tham số này là phù hợp với các quy ước định dạng khác nhau của các tệp CSV [không có định dạng tiêu chuẩn chính thức của Hồi giáo] Các giá trị được phân chia và các giá trị được phân phối theo tab, trích dẫn các quy ước, v.v. Các phương ngữ được xác định bằng cách kế thừa từ phương ngữ lớp và xác định cùng một tập hợp các thuộc tính như các tham số định dạng được cung cấp cho các hàm của người đọc [] và writer [] [Delimiter, DoubleQuote, Escapechar, lineterminator, quotechar, trích dẫn, skipinitialspace]. Các chức năng tiện ích sau đây được sử dụng để quản lý phương ngữ: register_dialect [tên, phương ngữ]

Đăng ký một đối tượng phương ngữ mới, phương ngữ, dưới tên. unregister_disl [tên]

Xóa đối tượng phương ngữ với tên tên. get_dialect [tên]

Trả về đối tượng phương ngữ với tên tên. list_dialects []

Trả về một danh sách tất cả các tên phương ngữ đã đăng ký. Hiện tại, chỉ có hai phương ngữ tích hợp: 'Excel' và 'Excel-tab'.

Ví dụ Nhập CSV # Đọc tệp CSV cơ bản f = Open ["scmods.csv", "r"] cho r trong csv.reader [f]: lastName, firstName, street, city, zip = r print ["{0} {1} {2} {3} {4} ". Định dạng [*r]] ',' đường phố ',' thành phố ',' zip ']] cho a in r: print ["{firstName} {lastName} {street} {city} {zip}". định dạng [** a] Dữ liệu tệp CSV cơ bản = [['Blues', 'Elwood', '1060 W Addison', 'Chicago', 'IL', '60613'], ['McGurn', 'Jack', '4802 N Broadway', ' Chicago ',' il ',' 60640 '],] f = open ["address.csv", "w"] w = csv.writer [f] w.writerows [data] f.close []

Chương 24 Xử lý và mã hóa dữ liệu Internet

e-mail

Bưu kiện

Gói email cung cấp nhiều chức năng và đối tượng để thể hiện, phân tích cú pháp và thao tác các thông báo email được mã hóa theo tiêu chuẩn MIME. Bao gồm mọi chi tiết của gói email là không thực tế ở đây, cũng như không được hầu hết các độc giả quan tâm. Vì vậy, phần còn lại của phần này tập trung vào hai vấn đề thực tế phổ biến, việc phân tích các tin nhắn email để trích xuất thông tin hữu ích và tạo tin nhắn email vì vậy rằng chúng có thể được gửi bằng mô -đun SMTPLIB.

Email phân tích cú pháp ở cấp cao nhất, mô -đun email cung cấp hai chức năng cho các thông báo phân tích cú pháp: message_from_file [f]

F

H lib

fl

B

d

ff

Gói email

553

m.get_charset []

Trả về bộ ký tự được liên kết với tải trọng tin nhắn [ví dụ: 'ISO-8859-1']. m.get_charsets [[mặc định]]

Trả về một danh sách tất cả các bộ ký tự xuất hiện trong tin nhắn. Đối với các tin nhắn đa điểm, danh sách sẽ đại diện cho bộ ký tự của mỗi phân nhóm. Bộ ký tự của mỗi phần được lấy từ các tiêu đề 'loại nội dung' xuất hiện trong tin nhắn. Nếu không có bộ ký tự nào được chỉ định hoặc phần tiêu đề loại nội dung bị thiếu, thì ký tự được đặt cho phần đó được đặt thành giá trị của mặc định [không có gì theo mặc định]. m.get_content_charset [[mặc định]]

Trả về bộ ký tự từ tiêu đề 'loại nội dung' đầu tiên trong tin nhắn. Nếu tiêu đề không được tìm thấy hoặc không có bộ ký tự được chỉ định, mặc định sẽ được trả về. m.get_content_maintype []

Trả về loại nội dung chính [ví dụ: 'Text' hoặc 'Multipart']. m.get_content_subtype []

Trả về loại phụ [ví dụ: 'đơn giản' hoặc 'hỗn hợp']. m.get_content_type []

Trả về một chuỗi chứa loại nội dung tin nhắn [ví dụ: 'đa/hỗn hợp' hoặc 'văn bản/plain']. m.get_default_type []

Trả về loại nội dung mặc định [ví dụ: 'Text/Plain' cho các tin nhắn đơn giản]. m.get_filename [[mặc định]]

Trả về tham số tên tệp từ tiêu đề 'định vị nội dung', nếu có. Trả về mặc định nếu tiêu đề bị thiếu hoặc không có tham số tên tệp. m.get_param [param [, mặc định [, tiêu đề [, unquote]]]]]]

Các tiêu đề email thường có các tham số được đính kèm với chúng như các phần 'Charset' và 'định dạng' của loại tiêu đề 'loại nội dung: Text/Plain; Charset = "UTF-8"; Định dạng = Flowed'. Phương thức này trả về giá trị của một tham số tiêu đề cụ thể. PARAM là tên tham số, mặc định là giá trị mặc định để trả về nếu không tìm thấy tham số, tiêu đề là tên của tiêu đề và không cần thiết chỉ định xem có phải không thông báo tham số hay không. Nếu không có giá trị nào được đưa ra cho tiêu đề, các tham số được lấy từ tiêu đề 'loại nội dung'. Giá trị mặc định của Unquote là đúng. Giá trị trả về là một chuỗi hoặc 3-Tuple [Charset, Ngôn ngữ, Giá trị] trong sự kiện Tham số được mã hóa theo quy ước RFC-2231. Trong trường hợp này, Charset là một chuỗi như 'ISO-8859-1', ngôn ngữ là một chuỗi chứa mã ngôn ngữ như 'en' và giá trị là giá trị tham số. m.get_params [[mặc định [, tiêu đề [, unquote]]]]]

Trả về tất cả các tham số cho tiêu đề làm danh sách. Mặc định Chỉ định giá trị để trả về nếu tiêu đề không được tìm thấy. Nếu tiêu đề bị bỏ qua, tiêu đề 'loại nội dung' được sử dụng. Unquote là một lá cờ chỉ định xem có phải các giá trị không cần thiết hay không [đúng theo mặc định]. Nội dung

F

H lib

fl

B

d

ff

554

Gói email

m.get_charset []

Trả về bộ ký tự được liên kết với tải trọng tin nhắn [ví dụ: 'ISO-8859-1']. m.get_charsets [[mặc định]]

Trả về một danh sách tất cả các bộ ký tự xuất hiện trong tin nhắn. Đối với các tin nhắn đa điểm, danh sách sẽ đại diện cho bộ ký tự của mỗi phân nhóm. Bộ ký tự của mỗi phần được lấy từ các tiêu đề 'loại nội dung' xuất hiện trong tin nhắn. Nếu không có bộ ký tự nào được chỉ định hoặc phần tiêu đề loại nội dung bị thiếu, thì ký tự được đặt cho phần đó được đặt thành giá trị của mặc định [không có gì theo mặc định]. m.get_content_charset [[mặc định]]

Trả về bộ ký tự từ tiêu đề 'loại nội dung' đầu tiên trong tin nhắn. Nếu tiêu đề không được tìm thấy hoặc không có bộ ký tự được chỉ định, mặc định sẽ được trả về. m.get_content_maintype []

Trả về loại nội dung chính [ví dụ: 'Text' hoặc 'Multipart']. m.get_content_subtype []

Trả về loại phụ [ví dụ: 'đơn giản' hoặc 'hỗn hợp']. m.get_content_type []

Trả về một chuỗi chứa loại nội dung tin nhắn [ví dụ: 'đa/hỗn hợp' hoặc 'văn bản/plain']. m.get_default_type []

Một danh sách tất cả các lỗi tin nhắn được tìm thấy khi phân tích cú pháp tin nhắn. Tham khảo tài liệu trực tuyến cho mô -đun Email.Errors để biết thêm chi tiết. Ví dụ sau minh họa cách sử dụng lớp tin nhắn trong khi phân tích thông báo email. Mã sau đọc một tin nhắn email, in một bản tóm tắt ngắn các tiêu đề hữu ích, in các phần văn bản đơn giản của tin nhắn và lưu bất kỳ tệp đính kèm nào. Nhập email Nhập Sys F = Open [sys.argv [1], "r"] m = email.message_from_file [f]

# Mở tệp tin nhắn # thông báo phân tích cú pháp

F

H lib

fl

B

d

ff

Gói email

555

# In tóm tắt ngắn của người gửi/người nhận in ["từ: % s" % m ["từ"]] in ["đến: % s" % m ["đến"]] in ["chủ đề: % s" % m . Chỉ cần in tải trọng tải trọng = m.get_payload [decode = true] charet = m.get_content_charset ['ISO-8859-1'] in [pailload.decode [charet]] Đi qua tất cả các phần con và # 1. in văn bản/các đoạn đơn giản # 2. Lưu bất kỳ tệp đính kèm nào cho s trong M.Walk []: fileName = s.get_filename [] nếu fileName: in ["Lưu tệp đính kèm: % s" % filename] data = s.get_payload [decode = true] open [fileName, "wb"]. write [dữ liệu] 4

Trong ví dụ này, điều quan trọng là phải nhấn mạnh rằng các hoạt động trích xuất tải trọng của một thông điệp luôn trả về chuỗi byte. Nếu tải trọng đại diện cho văn bản, bạn cũng cần giải mã nó theo một số ký tự.

Biêm email để soạn tin nhắn email, bạn có thể tạo một phiên bản trống của đối tượng tin nhắn, được xác định trong mô -đun email. ]. Thông điệp[]

Tạo một thông điệp mới ban đầu trống. Một thể hiện m của tin nhắn hỗ trợ các phương thức sau để điền thông báo với nội dung, tiêu đề và thông tin khác. m.add_header [tên, giá trị, ** params]

Thêm một tiêu đề tin nhắn mới. Tên là tên của tiêu đề, giá trị là giá trị của tiêu đề và params là một tập hợp các đối số từ khóa cung cấp các tham số tùy chọn bổ sung. Ví dụ: add_header ['foo', 'thanh', spam = 'chính'] thêm dòng tiêu đề 'foo: bar; spam = "chính" 'cho tin nhắn. M.AS_String [[UNIXFROM]]

Chuyển đổi toàn bộ thông báo thành một chuỗi. Unixfrom là một lá cờ Boolean. Nếu điều này được đặt thành True, kiểu Unix 'từ ... dòng xuất hiện dưới dạng dòng đầu tiên. Theo mặc định, unixfrom là sai.

F

H lib

fl

B

d

ff

556

Gói email

# In tóm tắt ngắn của người gửi/người nhận in ["từ: % s" % m ["từ"]] in ["đến: % s" % m ["đến"]] in ["chủ đề: % s" % m . Chỉ cần in tải trọng tải trọng = m.get_payload [decode = true] charet = m.get_content_charset ['ISO-8859-1'] in [pailload.decode [charet]] Đi qua tất cả các phần con và # 1. in văn bản/các đoạn đơn giản # 2. Lưu bất kỳ tệp đính kèm nào cho s trong M.Walk []: fileName = s.get_filename [] nếu fileName: in ["Lưu tệp đính kèm: % s" % filename] data = s.get_payload [decode = true] open [fileName, "wb"]. write [dữ liệu] 4

Trong ví dụ này, điều quan trọng là phải nhấn mạnh rằng các hoạt động trích xuất tải trọng của một thông điệp luôn trả về chuỗi byte. Nếu tải trọng đại diện cho văn bản, bạn cũng cần giải mã nó theo một số ký tự.

Biêm email để soạn tin nhắn email, bạn có thể tạo một phiên bản trống của đối tượng tin nhắn, được xác định trong mô -đun email. ]. Thông điệp[]

Tạo một thông điệp mới ban đầu trống. Một thể hiện m của tin nhắn hỗ trợ các phương thức sau để điền thông báo với nội dung, tiêu đề và thông tin khác. m.add_header [tên, giá trị, ** params]

Thêm một tiêu đề tin nhắn mới. Tên là tên của tiêu đề, giá trị là giá trị của tiêu đề và params là một tập hợp các đối số từ khóa cung cấp các tham số tùy chọn bổ sung. Ví dụ: add_header ['foo', 'thanh', spam = 'chính'] thêm dòng tiêu đề 'foo: bar; spam = "chính" 'cho tin nhắn. M.AS_String [[UNIXFROM]]

Chuyển đổi toàn bộ thông báo thành một chuỗi. Unixfrom là một lá cờ Boolean. Nếu điều này được đặt thành True, kiểu Unix 'từ ... dòng xuất hiện dưới dạng dòng đầu tiên. Theo mặc định, unixfrom là sai.

Chương 24 Xử lý và mã hóa dữ liệu Internet

M.Attach [tải trọng]

Đặt toàn bộ tải trọng tin nhắn thành tải trọng. Đối với các tin nhắn đơn giản, tải trọng có thể là một chuỗi byte chứa thân thông báo. Đối với tin nhắn đa, tải trọng là danh sách các đối tượng tin nhắn. Charset tùy chọn chỉ định tập ký tự được sử dụng để mã hóa văn bản [xem set_charset].

F

H lib

fl

B

d

ff

Gói email

557

m.set_type [loại [, tiêu đề [, Requote]]]]

Đặt loại được sử dụng trong tiêu đề 'loại nội dung'. Loại là một chuỗi chỉ định loại, chẳng hạn như 'text/plain' hoặc 'multipart/hỗn hợp'. Tiêu đề chỉ định một tiêu đề thay thế khác với tiêu đề 'loại nội dung' mặc định. Requote Báo giá Giá trị của bất kỳ tham số nào đã được gắn vào tiêu đề. Theo mặc định, điều này là đúng. m.set_unixfrom [unixfrom]

Đặt văn bản của dòng 'từ ...' kiểu Unix. UnixFrom là một chuỗi chứa văn bản hoàn chỉnh bao gồm văn bản 'từ'. Văn bản này chỉ là đầu ra nếu tham số UNIXFROM của M.AS_String [] được đặt thành true. Thay vì tạo các đối tượng tin nhắn thô và xây dựng chúng từ đầu mỗi lần, có một bộ sưu tập các đối tượng tin nhắn được xây dựng sẵn tương ứng với các loại nội dung khác nhau. Các đối tượng tin nhắn này đặc biệt hữu ích để tạo các tin nhắn MIME nhiều phần. Chẳng hạn, bạn sẽ tạo một thông báo mới và đính kèm các phần khác nhau bằng phương thức tin nhắn đính kèm []. Mỗi đối tượng này được xác định trong một mô hình con khác nhau, được ghi nhận trong mỗi mô tả. MImeApplication [Data [, SubType [, Trình mã hóa [, ** params]]]]]

Được xác định trong email.mime.application. Tạo một thông báo chứa dữ liệu ứng dụng. Dữ liệu là một chuỗi byte chứa dữ liệu thô. SubType chỉ định phân nhóm dữ liệu và là 'luồng octet' theo mặc định. Trình mã hóa là một chức năng mã hóa tùy chọn từ Subpackage email.encoders. Theo mặc định, dữ liệu được mã hóa dưới dạng cơ sở 64. PARAMS đại diện cho các đối số từ khóa và giá trị từ khóa tùy chọn sẽ được thêm vào tiêu đề 'loại nội dung' của thông báo. MIMEAUDIO [DATA [, SUBTYPE [, Bộ mã hóa [, ** params]]]]]

Được xác định trong email.mime.audio. Tạo một thông báo chứa dữ liệu âm thanh. Dữ liệu là một chuỗi byte chứa dữ liệu âm thanh nhị phân thô. SubType Chỉ định loại dữ liệu và là một chuỗi như 'mpeg' hoặc 'wav'. Nếu không có phân nhóm nào được cung cấp, loại âm thanh sẽ được đoán bằng cách xem dữ liệu bằng mô -đun SNDHDR. Bộ mã hóa và thông số có ý nghĩa tương tự như đối với MImeApplication. MIMEIMAGE [DATA [, SUBTYPE [, Bộ mã hóa [, ** params]]]]]

Được xác định trong email.mime.image. Tạo một thông báo chứa dữ liệu hình ảnh. Dữ liệu là một chuỗi byte chứa dữ liệu hình ảnh thô. SubType Chỉ định loại hình ảnh và là một chuỗi như 'jpg' hoặc 'png'. Nếu không có phân nhóm nào được cung cấp, loại sẽ được đoán bằng một hàm trong mô -đun IMGHDR. Bộ mã hóa và thông số có ý nghĩa tương tự như đối với MImeApplication. Mimemessage [MSG [, SubType]]

Được xác định trong email.mime.message. Tạo một tin nhắn MIME phi đa dạng mới. MSG là một đối tượng tin nhắn chứa tải trọng ban đầu của tin nhắn. Loại phụ là loại tin nhắn và mặc định là 'RFC822'. Mimemultipart [[SubType [, Boundary [, Subparts [, ** params]]]]]]

Được xác định trong email.mime.multipart. Tạo một thông báo MIME Multiart mới. SubType Chỉ định phân nhóm tùy chọn được thêm vào tiêu đề ‘Nội dung: Tiêu đề Multipart/Subtype '. Theo mặc định, phân nhóm là 'hỗn hợp'. Ranh giới là một chuỗi chỉ định bộ phân cách ranh giới được sử dụng để tạo mỗi phần con tin nhắn. Nếu được đặt thành không

F

H lib

fl

B

d

ff

Gói email

558

m.set_type [loại [, tiêu đề [, Requote]]]]

Đặt loại được sử dụng trong tiêu đề 'loại nội dung'. Loại là một chuỗi chỉ định loại, chẳng hạn như 'text/plain' hoặc 'multipart/hỗn hợp'. Tiêu đề chỉ định một tiêu đề thay thế khác với tiêu đề 'loại nội dung' mặc định. Requote Báo giá Giá trị của bất kỳ tham số nào đã được gắn vào tiêu đề. Theo mặc định, điều này là đúng. m.set_unixfrom [unixfrom]

Đặt văn bản của dòng 'từ ...' kiểu Unix. UnixFrom là một chuỗi chứa văn bản hoàn chỉnh bao gồm văn bản 'từ'. Văn bản này chỉ là đầu ra nếu tham số UNIXFROM của M.AS_String [] được đặt thành true. Thay vì tạo các đối tượng tin nhắn thô và xây dựng chúng từ đầu mỗi lần, có một bộ sưu tập các đối tượng tin nhắn được xây dựng sẵn tương ứng với các loại nội dung khác nhau. Các đối tượng tin nhắn này đặc biệt hữu ích để tạo các tin nhắn MIME nhiều phần. Chẳng hạn, bạn sẽ tạo một thông báo mới và đính kèm các phần khác nhau bằng phương thức tin nhắn đính kèm []. Mỗi đối tượng này được xác định trong một mô hình con khác nhau, được ghi nhận trong mỗi mô tả. MImeApplication [Data [, SubType [, Trình mã hóa [, ** params]]]]]

m = mimemultipart [] m ["to"] = người nhận m ["từ"] = người gửi m ["chủ đề"] = chủ đề m.attach [mimetext [cơ thể]] .read[],"mpeg"] apart.add_header["Content-Disposition","attachment",filename=audio] m.attach[apart] # Send the email message s = smtplib.SMTP[] s.connect[] s.sendmail [người gửi, [người nhận], m.as_string []] s.close []

Ghi chú n

N

Một số tùy chọn tùy chỉnh và cấu hình nâng cao chưa được thảo luận. Người đọc nên tham khảo tài liệu trực tuyến để sử dụng nâng cao mô -đun này. Gói email đã trải qua ít nhất bốn phiên bản khác nhau, trong đó giao diện lập trình cơ bản đã được thay đổi [tức là, các mô hình con được đổi tên, các lớp chuyển đến các vị trí khác nhau, v.v.]. Phần này đã ghi lại phiên bản 4.0 của giao diện được sử dụng trong cả hai Python 2.6 và Python 3.0. Nếu bạn đang làm việc với mã kế thừa, các khái niệm cơ bản vẫn được áp dụng, nhưng bạn có thể phải điều chỉnh vị trí của các lớp và mô hình con.

F

H lib

fl

B

d

ff

HMAC

559

Hashlib Mô -đun Hashlib thực hiện một loạt các thuật toán tiêu hóa an toàn và thông báo như MD5 và SHA1.

Sự mô tả

md5 [] sha1 [] sha224 [] sha256 []

MD5 Hash [128 bit] SHA1 Hash [160 bit] Sha224 Hash [224 bit] SHA256 Hash [256 bit] HASH SHA384 [384 bit]

sha384 [] sha512 []

Một thể hiện D của đối tượng Digest được trả về bởi bất kỳ chức năng nào trong số này có giao diện sau: Phương thức hoặc Thuộc tính

Sự mô tả

md5 [] sha1 [] sha224 [] sha256 []

MD5 Hash [128 bit] SHA1 Hash [160 bit] Sha224 Hash [224 bit] SHA256 Hash [256 bit] HASH SHA384 [384 bit]

sha384 [] sha512 []

Một thể hiện D của đối tượng Digest được trả về bởi bất kỳ chức năng nào trong số này có giao diện sau: Phương thức hoặc Thuộc tính

D.Update [dữ liệu]

Cập nhật hàm băm với dữ liệu mới. Dữ liệu phải là một chuỗi byte. Các cuộc gọi lặp đi lặp lại giống như một cuộc gọi duy nhất với dữ liệu được nối. Trả về giá trị của tiêu hóa dưới dạng chuỗi byte thô. Trả về một chuỗi văn bản với giá trị của tiêu hóa được mã hóa dưới dạng một loạt các chữ số hex. Trả về một bản sao của Digest. Bản sao bảo tồn trạng thái bên trong của Digest ban đầu. Kích thước của băm kết quả trong byte. Kích thước khối bên trong của thuật toán băm trong byte.

D.Digest [] D.HexDigest [] D.Copy [] D.Digest_Size D.Block_Size

F

H lib

fl

B

d

ff

560

HMAC

Hashlib Mô -đun Hashlib thực hiện một loạt các thuật toán tiêu hóa an toàn và thông báo như MD5 và SHA1.

Sự mô tả

md5 [] sha1 [] sha224 [] sha256 []

MD5 Hash [128 bit] SHA1 Hash [160 bit] Sha224 Hash [224 bit] SHA256 Hash [256 bit] HASH SHA384 [384 bit]

sha384 [] sha512 []

Một thể hiện D của đối tượng Digest được trả về bởi bất kỳ chức năng nào trong số này có giao diện sau: Phương thức hoặc Thuộc tính

D.Update [dữ liệu]

Cập nhật hàm băm với dữ liệu mới. Dữ liệu phải là một chuỗi byte. Các cuộc gọi lặp đi lặp lại giống như một cuộc gọi duy nhất với dữ liệu được nối. Trả về giá trị của tiêu hóa dưới dạng chuỗi byte thô. Trả về một chuỗi văn bản với giá trị của tiêu hóa được mã hóa dưới dạng một loạt các chữ số hex. Trả về một bản sao của Digest. Bản sao bảo tồn trạng thái bên trong của Digest ban đầu. Kích thước của băm kết quả trong byte. Kích thước khối bên trong của thuật toán băm trong byte.

# Gửi tin nhắn ở đâu đó. Ra đại diện cho một ổ cắm hoặc một số kênh I/O khác mà chúng tôi đang gửi dữ liệu. h = hmac.new [secret_key] h.update [data] out.send [data] # Gửi dữ liệu ra.send [h.Digest []] # Gửi Digest # Nhận thông báo # biểu thị ổ cắm hoặc một số khác Kênh I/O # ra mà chúng tôi đang nhận dữ liệu. h = hmac.new [secret_key] data = in.receive [] # Nhận dữ liệu tin nhắn H.Update [Data] Digest = in.Receive [] # Nhận tiêu hóa được gửi bởi người gửi nếu Digest! = H.Digest [] : nâng cao xác thực HERROR ['Tin nhắn không được xác thực']

F

H lib

fl

B

d

ff

Htmlparser

561

HTMLPARSER Trong Python 3, mô -đun này được gọi là html.parser. Mô -đun HTMLPARSER xác định một lớp htmlparser có thể được sử dụng để phân tích các tài liệu HTML và XHTML. . Htmlparser []

Đây là một lớp cơ sở được sử dụng để tạo trình phân tích cú pháp HTML. Nó được khởi tạo mà không có bất kỳ đối số. Một thể hiện h của htmlparser có các phương thức sau: h.close []

Đóng trình phân tích cú pháp và buộc xử lý bất kỳ dữ liệu không được phân bổ còn lại nào. Phương pháp này được gọi sau khi tất cả dữ liệu HTML đã được đưa cho trình phân tích cú pháp. H.Feed [dữ liệu]

Cung cấp dữ liệu mới cho trình phân tích cú pháp. Dữ liệu này sẽ được phân tích ngay lập tức. Tuy nhiên, nếu dữ liệu không đầy đủ [ví dụ, nó kết thúc bằng phần tử HTML không hoàn chỉnh], phần không hoàn chỉnh sẽ được đệm và phân tích cú pháp trong thời gian tiếp theo [] được gọi với nhiều dữ liệu hơn. H.GetPos []

Trả về số dòng hiện tại và bù ký tự vào dòng đó dưới dạng tuple [dòng, bù]. h.get_starttag_text []

Trả về văn bản tương ứng với thẻ bắt đầu được mở gần đây nhất. h.handle_charref [tên]

Phương thức xử lý này được gọi bất cứ khi nào một tham chiếu ký tự như '&#ref;' gặp phải. Tên là một chuỗi chứa tên của tham chiếu. Ví dụ: khi phân tích cú pháp '', tên sẽ được đặt thành '229'. h.handle_comment [dữ liệu]

Phương pháp xử lý này được gọi bất cứ khi nào một bình luận gặp phải. Dữ liệu là một chuỗi chứa văn bản của nhận xét. Ví dụ: khi phân tích cú pháp nhận xét '', dữ liệu sẽ chứa văn bản 'bình luận'. h.handle_data [dữ liệu]

Trình xử lý này được gọi để xử lý dữ liệu xuất hiện giữa các thẻ. Dữ liệu là một chuỗi chứa văn bản. h.handle_decl [Decl]

Trình xử lý này được gọi để xử lý khai báo như ''. Decl là một chuỗi chứa văn bản của Tuyên bố không bao gồm hàng đầu ''.

F

H lib

fl

B

d

ff

562

Htmlparser

HTMLPARSER Trong Python 3, mô -đun này được gọi là html.parser. Mô -đun HTMLPARSER xác định một lớp htmlparser có thể được sử dụng để phân tích các tài liệu HTML và XHTML. . Htmlparser []

Đây là một lớp cơ sở được sử dụng để tạo trình phân tích cú pháp HTML. Nó được khởi tạo mà không có bất kỳ đối số. Một thể hiện h của htmlparser có các phương thức sau: h.close []

Đóng trình phân tích cú pháp và buộc xử lý bất kỳ dữ liệu không được phân bổ còn lại nào. Phương pháp này được gọi sau khi tất cả dữ liệu HTML đã được đưa cho trình phân tích cú pháp. H.Feed [dữ liệu]

F

H lib

fl

B

d

ff

602

Htmlparser

HTMLPARSER Trong Python 3, mô -đun này được gọi là html.parser. Mô -đun HTMLPARSER xác định một lớp htmlparser có thể được sử dụng để phân tích các tài liệu HTML và XHTML. . Htmlparser []

Đây là một lớp cơ sở được sử dụng để tạo trình phân tích cú pháp HTML. Nó được khởi tạo mà không có bất kỳ đối số. Một thể hiện h của htmlparser có các phương thức sau: h.close []

Đóng trình phân tích cú pháp và buộc xử lý bất kỳ dữ liệu không được phân bổ còn lại nào. Phương pháp này được gọi sau khi tất cả dữ liệu HTML đã được đưa cho trình phân tích cú pháp. H.Feed [dữ liệu]

Cung cấp dữ liệu mới cho trình phân tích cú pháp. Dữ liệu này sẽ được phân tích ngay lập tức. Tuy nhiên, nếu dữ liệu không đầy đủ [ví dụ, nó kết thúc bằng phần tử HTML không hoàn chỉnh], phần không hoàn chỉnh sẽ được đệm và phân tích cú pháp trong thời gian tiếp theo [] được gọi với nhiều dữ liệu hơn. H.GetPos []

Trả về số dòng hiện tại và bù ký tự vào dòng đó dưới dạng tuple [dòng, bù]. h.get_starttag_text []

Trả về văn bản tương ứng với thẻ bắt đầu được mở gần đây nhất. h.handle_charref [tên]

Phương thức xử lý này được gọi bất cứ khi nào một tham chiếu ký tự như '&#ref;' gặp phải. Tên là một chuỗi chứa tên của tham chiếu. Ví dụ: khi phân tích cú pháp '', tên sẽ được đặt thành '229'. h.handle_comment [dữ liệu]

Loại chuyển đổi từ C sang Python Hàm C sau được sử dụng để chuyển đổi các giá trị chứa trong các biến C thành đối tượng Python: PyObject *Py_BuildValue [định dạng char *, ...]

Điều này xây dựng một đối tượng Python từ một loạt các biến C. Định dạng là một chuỗi mô tả chuyển đổi mong muốn. Các đối số còn lại là các giá trị của các biến C sẽ được chuyển đổi. Trình xác định định dạng tương tự như được sử dụng với các hàm pyarg_parsetuple*, như trong Bảng 26.4.

F

H lib

fl

B

d

ff

Mô -đun mở rộng

Bảng 26.4

603

Định dạng xác định cho py_buildValue []

Định dạng

Loại Python

Loại c

Sự mô tả

"" "S"

Không có chuỗi

void char *

"S#"

Sợi dây

char *, int

"Y"

Byte

char *

"Y#"

Byte

char *, int

"Y"

Byte

char *

"Y#"

"z" "z#" "u"

Chuỗi hoặc không có chuỗi hoặc không có unicode

char * char *, int py_unicode *

"u#" "u"

char *, int

"Y"

Byte

char *

"Y#"

"z" "z#" "u"

Chuỗi hoặc không có chuỗi hoặc không có unicode

char * char *, int py_unicode *

F

H lib

fl

B

d

ff

604

Mô -đun mở rộng

Bảng 26.4

Định dạng xác định cho py_buildValue []

Định dạng

Loại Python

Loại c

Sự mô tả

"" "S"

Không có chuỗi

void char *

"S#"

Sợi dây

char *, int

"Y"

Byte

char *, int

"Y"

Byte

char *

Byte

char *

Byte

char *

"Y#"

"z" "z#" "u"

Chuỗi hoặc không có chuỗi hoặc không có unicode

char * char *, int py_unicode *

"u#" "u"

Unicode Unicode

F

H lib

fl

B

d

ff

Mô -đun mở rộng

605

Py_unicode * char *

"U#"

Thêm giá trị macro vào một mô -đun dưới dạng chuỗi.

Các mô -đun mở rộng xử lý lỗi biểu thị lỗi bằng cách trả lại NULL cho trình thông dịch. Trước khi trả lại null, một ngoại lệ phải được đặt bằng một trong các chức năng sau: void pyerr_nomemory []

Tăng một ngoại lệ bộ nhớ. void pyerr_setfromerrno [pyobject *exc]

Tăng một ngoại lệ. Exc là một đối tượng ngoại lệ. Giá trị của ngoại lệ được lấy từ biến ERRNO trong thư viện C. void pyerr_setfromerrnowithfilename [pyobject *exc, char *filename]

Giống như pyerr_setfromerrno [], nhưng cũng bao gồm tên tệp trong giá trị ngoại lệ. void pyerr_setobject [pyobject *exc, pyobject *val]

Tăng một ngoại lệ. Exc là một đối tượng ngoại lệ và Val là một đối tượng chứa giá trị của ngoại lệ. void pyerr_setstring [pyobject *exc, char *msg]

Tăng một ngoại lệ. Exc là một đối tượng ngoại lệ và MSG là một thông điệp mô tả những gì đã sai. Đối số Exc

Ngoại lệ Python

PyExc_ArithmeticError PyExc_AssertionError PyExc_AttributeError PyExc_EnvironmentError PyExc_EOFError PyExc_Exception PyExc_FloatingPointError PyExc_ImportError PyExc_IndexError PyExc_IOError PyExc_KeyError PyExc_KeyboardInterrupt PyExc_LookupError PyExc_MemoryError PyExc_NameError PyExc_NotImplementedError

Arithmeticerror asserSerror Attributionerror erenerror eoferror ngoại lệ floatingpuluminterror Ứng dụng indexError ioerror keyerror keyboardinterRupt

F

H lib

fl

B

d

ff

606

Chương 26 Mở rộng và nhúng Python

C Tên

Ngoại lệ Python

PyExc_ArithmeticError PyExc_AssertionError PyExc_AttributeError PyExc_EnvironmentError PyExc_EOFError PyExc_Exception PyExc_FloatingPointError PyExc_ImportError PyExc_IndexError PyExc_IOError PyExc_KeyError PyExc_KeyboardInterrupt PyExc_LookupError PyExc_MemoryError PyExc_NameError PyExc_NotImplementedError

Arithmeticerror asserSerror Attributionerror erenerror eoferror ngoại lệ floatingpuluminterror Ứng dụng indexError ioerror keyerror keyboardinterRupt

F

H lib

fl

B

F

H lib

fl

B

d

ff

Chương 26 Mở rộng và nhúng Python

607

C Tên

PyExc_OSError PyExc_OverflowError PyExc_ReferenceError PyExc_RuntimeError PyExc_StandardError PyExc_StopIteration PyExc_SyntaxError PyExc_SystemError PyExc_SystemExit PyExc_TypeError PyExc_UnicodeError PyExc_UnicodeEncodeError PyExc_UnicodeDecodeError PyExc_UnicodeTranslateError PyExc_ValueError PyExc_WindowsError PyExc_ZeroDivisionError

Oserror Overflowerror Tham khảo HEDTITTITITEORROR STONEERROR STOPITATION SYNTAXERROR System

Các chức năng sau được sử dụng để truy vấn hoặc xóa trạng thái ngoại lệ của trình thông dịch: void pyerr_clear []

Chủ đề Một khóa phiên dịch toàn cầu được sử dụng để ngăn chặn nhiều hơn một luồng thực thi trong trình thông dịch cùng một lúc. Nếu một hàm được viết trong một mô -đun mở rộng sẽ thực hiện trong một thời gian dài, nó sẽ chặn việc thực thi các luồng khác cho đến khi hoàn thành. Điều này là do khóa được giữ bất cứ khi nào một hàm mở rộng được gọi. Nếu mô-đun mở rộng an toàn, các macro sau có thể được sử dụng để giải phóng và làm lại khóa phiên dịch toàn cầu: PY_BEGIN_AWLOW_THREADS

Phát hành khóa phiên dịch toàn cầu và cho phép các chủ đề khác chạy trong trình thông dịch. Phần mở rộng C không được gọi bất kỳ chức năng nào trong API Python C trong khi khóa được phát hành. Py_end_allow_threads

Lấy phản hồi khóa phiên dịch toàn cầu. Phần mở rộng sẽ chặn cho đến khi khóa có thể có được thành công trong trường hợp này.

F

H lib

fl

B

d

ff

608

Chương 26 Mở rộng và nhúng Python

Ví dụ sau đây minh họa việc sử dụng các macro này: pyobject *py_wrapper [pyobject *self, pyobject *args] {... pyarg_parsetuple [args, ...] Py_end_allow_threads ... trả về py_buildvalue [fmt, result]; }

Nhúng trình phiên dịch Python, trình thông dịch Python cũng có thể được nhúng vào các ứng dụng C.Với nhúng, trình thông dịch Python hoạt động như một thư viện lập trình trong đó các chương trình C có thể khởi tạo trình thông dịch và các đối tượng được thực hiện trong Python.

Một mẫu nhúng với việc nhúng, chương trình C của bạn phụ trách thông dịch viên. Dưới đây là một chương trình C đơn giản minh họa việc nhúng tối thiểu nhất có thể: #include int main [int argc, char ** argv] {py_initialize []; Pyrun_simplestring ["in ['hello world']"]; Py_finalize []; trả lại 0; }

Trong ví dụ này, trình thông dịch được khởi tạo, một tập lệnh ngắn được thực thi dưới dạng chuỗi và trình thông dịch bị tắt. Trước khi tiến hành thêm bất kỳ điều gì, thường là một ý tưởng tốt để có được ví dụ trước làm việc trước.

Biên dịch và liên kết để biên dịch một trình thông dịch được nhúng trên UNIX, mã của bạn phải bao gồm tệp và liên kết tiêu đề "python.h" với thư viện phiên dịch như libpython2.6.a. Tệp tiêu đề thường được tìm thấy trong/usr/local/bao gồm /python2.6, và thư viện thường được tìm thấy trong /usr/local/lib/python2.6/config. Đối với Windows, bạn sẽ cần xác định vị trí các tệp này trong thư mục cài đặt Python. Xin lưu ý rằng thông dịch viên có thể phụ thuộc vào các thư viện khác mà bạn cần bao gồm khi liên kết. Thật không may, điều này có xu hướng dành riêng cho nền tảng và liên quan đến cách Python được cấu hình trên máy của bạn, bạn có thể phải loay hoay một chút.

Hoạt động và thiết lập trình thông dịch cơ bản Các chức năng sau được sử dụng để thiết lập trình thông dịch và chạy tập lệnh: int pyrun_anyfile [file *fp, char *fileName]

Nếu FP là một thiết bị tương tác như TTY trong Unix, hàm này sẽ gọi pyrun_interactiveLoop []. Nếu không, pyrun_simplefile [] được gọi. Tên tệp là

F

H lib

fl

B

d

ff

Chương 26 Mở rộng và nhúng Python

609

Ví dụ sau đây minh họa việc sử dụng các macro này: pyobject *py_wrapper [pyobject *self, pyobject *args] {... pyarg_parsetuple [args, ...] Py_end_allow_threads ... trả về py_buildvalue [fmt, result]; }

Nhúng trình phiên dịch Python, trình thông dịch Python cũng có thể được nhúng vào các ứng dụng C.Với nhúng, trình thông dịch Python hoạt động như một thư viện lập trình trong đó các chương trình C có thể khởi tạo trình thông dịch và các đối tượng được thực hiện trong Python.

Một mẫu nhúng với việc nhúng, chương trình C của bạn phụ trách thông dịch viên. Dưới đây là một chương trình C đơn giản minh họa việc nhúng tối thiểu nhất có thể: #include int main [int argc, char ** argv] {py_initialize []; Pyrun_simplestring ["in ['hello world']"]; Py_finalize []; trả lại 0; }

Trong ví dụ này, trình thông dịch được khởi tạo, một tập lệnh ngắn được thực thi dưới dạng chuỗi và trình thông dịch bị tắt. Trước khi tiến hành thêm bất kỳ điều gì, thường là một ý tưởng tốt để có được ví dụ trước làm việc trước.

Biên dịch và liên kết để biên dịch một trình thông dịch được nhúng trên UNIX, mã của bạn phải bao gồm tệp và liên kết tiêu đề "python.h" với thư viện phiên dịch như libpython2.6.a. Tệp tiêu đề thường được tìm thấy trong/usr/local/bao gồm /python2.6, và thư viện thường được tìm thấy trong /usr/local/lib/python2.6/config. Đối với Windows, bạn sẽ cần xác định vị trí các tệp này trong thư mục cài đặt Python. Xin lưu ý rằng thông dịch viên có thể phụ thuộc vào các thư viện khác mà bạn cần bao gồm khi liên kết. Thật không may, điều này có xu hướng dành riêng cho nền tảng và liên quan đến cách Python được cấu hình trên máy của bạn, bạn có thể phải loay hoay một chút.

Hoạt động và thiết lập trình thông dịch cơ bản Các chức năng sau được sử dụng để thiết lập trình thông dịch và chạy tập lệnh: int pyrun_anyfile [file *fp, char *fileName]

Nếu FP là một thiết bị tương tác như TTY trong Unix, hàm này sẽ gọi pyrun_interactiveLoop []. Nếu không, pyrun_simplefile [] được gọi. Tên tệp là

Nhúng thông dịch viên Python

một chuỗi cho một tên cho luồng đầu vào. Tên này sẽ xuất hiện khi trình thông dịch báo cáo lỗi. Nếu tên tệp là null, một chuỗi mặc định của "???" được sử dụng làm tên tệp. int pyrun_simplefile [file *fp, char *fileName]

Trả về tiền tố cho các tệp độc lập với nền tảng được cài đặt. Đây là giá trị tương tự như được tìm thấy trong sys.prefix. char *py_getexecprefix []

Trả về EXEC-PREFIX cho các tệp phụ thuộc vào nền tảng được cài đặt. Đây là giá trị tương tự như được tìm thấy trong sys.exec_prefix. char *py_getProgramfullPath []

Trả về tên đường dẫn đầy đủ của Python có thể thực thi. char *py_getpath []

Trả về đường dẫn tìm kiếm mô-đun mặc định. Đường dẫn được trả về dưới dạng chuỗi bao gồm các tên thư mục được phân tách bằng các dấu phân cách phụ thuộc vào nền tảng [: trên Unix,; trên DOS/Windows].

F

H lib

fl

B

d

ff

610

Chương 26 Mở rộng và nhúng Python

int pysys_setargv [int argc, char ** argv]

Đặt các tùy chọn dòng lệnh được sử dụng để điền vào giá trị của sys.argv. Điều này chỉ nên được gọi trước py_initialize [].

Truy cập Python từ C Mặc dù có nhiều cách mà người phiên dịch có thể được truy cập từ C, bốn nhiệm vụ thiết yếu là phổ biến nhất với việc nhúng: N Nhập các mô -đun thư viện Python [mô phỏng câu lệnh nhập] Các chức năng, lớp và phương thức N truy cập các thuộc tính của các đối tượng [dữ liệu, phương thức, v.v.] Tất cả các hoạt động này có thể được thực hiện bằng các hoạt động cơ bản này được xác định trong API Python C: PyObject *Pyimport_ImportModule [Const Char *

Nhập một modname mô -đun và trả về một tham chiếu đến đối tượng mô -đun được liên kết. PyObject *PyObject_GetAttrString [pyobject *obj, const char *name]

Nhận một thuộc tính từ một đối tượng. Đây là giống như obj.name. int PyObject_setAttrString [pyobject *obj, const char *name, pyObject *value]

Đặt một thuộc tính trên một đối tượng. Đây là giống như obj.name = value. PyObject *pyeval_callobject [pyobject *func, pyobject *args]

Gọi func với các đối số tranh luận. Func là một đối tượng có thể gọi được Python [chức năng, phương thức, lớp, v.v.]. Args là một tuple của các lập luận. PyObject *pyeval_callobjectwithKeywords [PyObject *func, pyObject *args, pyobject *kwargs]

Gọi func với các đối số vị trí tranh luận và từ khóa đối số kwargs. Func là một đối tượng có thể gọi được, Args là một tuple và Kwargs là một từ điển. Ví dụ sau đây minh họa việc sử dụng các chức năng này bằng cách gọi và sử dụng các phần khác nhau của mô -đun RE từ chương trình C.this in tất cả các dòng được đọc từ Stdin có chứa biểu thức thông thường Python do người dùng cung cấp. #include "python.h" int main [int pyobject pyobject pyobject pyobject pyobject char

argc, char ** argv] { *re; *re_compile; *Pat; *Pat_search; *args; bộ đệm [256];

if [argc! = 2] {fprintf [stderr, "sử dụng: %s mẫu \ n", argv [0]]; Thoát [1]; } Py_initialize [];

F

H lib

fl

B

d

ff

Chương 26 Mở rộng và nhúng Python

611

int pysys_setargv [int argc, char ** argv]

Đặt các tùy chọn dòng lệnh được sử dụng để điền vào giá trị của sys.argv. Điều này chỉ nên được gọi trước py_initialize [].

Truy cập Python từ C Mặc dù có nhiều cách mà người phiên dịch có thể được truy cập từ C, bốn nhiệm vụ thiết yếu là phổ biến nhất với việc nhúng: N Nhập các mô -đun thư viện Python [mô phỏng câu lệnh nhập] Các chức năng, lớp và phương thức N truy cập các thuộc tính của các đối tượng [dữ liệu, phương thức, v.v.] Tất cả các hoạt động này có thể được thực hiện bằng các hoạt động cơ bản này được xác định trong API Python C: PyObject *Pyimport_ImportModule [Const Char *

Nhập một modname mô -đun và trả về một tham chiếu đến đối tượng mô -đun được liên kết. PyObject *PyObject_GetAttrString [pyobject *obj, const char *name]

F

H lib

fl

B

d

ff

612

Chương 26 Mở rộng và nhúng Python

CTYPES Mô -đun CTYPES cung cấp cho Python quyền truy cập vào các hàm C được xác định trong DLL và các thư viện được chia sẻ. Mặc dù bạn cần biết một số chi tiết về thư viện C cơ bản [tên, đối số gọi, loại, v.v.], bạn có thể sử dụng CTYPE để truy cập mã C mà không phải viết mã bao bọc mở rộng C hoặc biên dịch bất cứ thứ gì với trình biên dịch C. CTYPES là một mô -đun thư viện khá lớn với nhiều chức năng nâng cao. Ở đây, chúng tôi bao gồm các phần thiết yếu của nó cần thiết để đi.

Tải các thư viện được chia sẻ Các lớp sau được sử dụng để tải thư viện chia sẻ C và trả về một thể hiện đại diện cho nội dung của nó: CDLL [tên [, chế độ [, xử lý [, use_errno [, use_last_error]]]]

Một lớp đại diện cho một thư viện chia sẻ C tiêu chuẩn. Tên là tên của thư viện, chẳng hạn như 'libc.so.6' hoặc 'msvcrt.dll'. Chế độ cung cấp các cờ xác định cách thức thư viện được tải và được truyền đến hàm dlopen [] bên dưới trên Unix. Nó có thể được đặt thành bitwise-hoặc của rtld_local, rtld_global hoặc rtld_default [mặc định]. Trên Windows, chế độ bị bỏ qua. Xử lý chỉ định một tay cầm cho một thư viện đã được tải [nếu có]. Theo mặc định, nó không có. Use_errno là một lá cờ Boolean thêm một lớp an toàn thêm xung quanh việc xử lý biến C errno trong thư viện được tải. Theo mặc định, USS_ERRNO là sai. use_last_error là một lá cờ boolean cho phép một cặp chức năng get_last_error [] và set_last_error [] có thể được sử dụng để thao tác mã lỗi hệ thống. Những thứ này được sử dụng phổ biến hơn trên Windows. Theo mặc định, USS_LAST_ERROR là sai. Windll [name [, mode [, xử lý [, use_errno [, use_last_error]]]]]]]

Giống như CDLL [] ngoại trừ các hàm trong thư viện được giả định để tuân theo các quy ước gọi Windows StdCall [Windows]. Chức năng tiện ích sau đây có thể được sử dụng để định vị các thư viện được chia sẻ trên hệ thống và xây dựng tên phù hợp để sử dụng làm tham số tên trong các lớp trước. Nó được định nghĩa trong ctypes.util Submodule: find_l Library [tên]

Được xác định trong ctypes.util. Trả về một tên đường dẫn tương ứng với tên thư viện. Tên là tên thư viện không có bất kỳ hậu tố tệp nào như 'libc', 'libm', v.v. Hành vi của chức năng này phụ thuộc nhiều hệ thống và phụ thuộc vào cấu hình cơ bản của các thư viện và môi trường được chia sẻ [ví dụ: cài đặt của LD_L Library_Path và các tham số khác]. Trả lại không nếu thư viện có thể định vị được.

Các hàm nước ngoài Các phiên bản thư viện được chia sẻ bởi lớp CDLL [] hoạt động dưới dạng proxy cho thư viện C bên dưới. Để thư viện truy cập nội dung, bạn chỉ cần sử dụng Tra cứu thuộc tính [toán tử]. Ví dụ:

F

H lib

fl

B

d

ff

Chương 26 Mở rộng và nhúng Python

613

CTYPES Mô -đun CTYPES cung cấp cho Python quyền truy cập vào các hàm C được xác định trong DLL và các thư viện được chia sẻ. Mặc dù bạn cần biết một số chi tiết về thư viện C cơ bản [tên, đối số gọi, loại, v.v.], bạn có thể sử dụng CTYPE để truy cập mã C mà không phải viết mã bao bọc mở rộng C hoặc biên dịch bất cứ thứ gì với trình biên dịch C. CTYPES là một mô -đun thư viện khá lớn với nhiều chức năng nâng cao. Ở đây, chúng tôi bao gồm các phần thiết yếu của nó cần thiết để đi.

Tải các thư viện được chia sẻ Các lớp sau được sử dụng để tải thư viện chia sẻ C và trả về một thể hiện đại diện cho nội dung của nó: CDLL [tên [, chế độ [, xử lý [, use_errno [, use_last_error]]]]

Một lớp đại diện cho một thư viện chia sẻ C tiêu chuẩn. Tên là tên của thư viện, chẳng hạn như 'libc.so.6' hoặc 'msvcrt.dll'. Chế độ cung cấp các cờ xác định cách thức thư viện được tải và được truyền đến hàm dlopen [] bên dưới trên Unix. Nó có thể được đặt thành bitwise-hoặc của rtld_local, rtld_global hoặc rtld_default [mặc định]. Trên Windows, chế độ bị bỏ qua. Xử lý chỉ định một tay cầm cho một thư viện đã được tải [nếu có]. Theo mặc định, nó không có. Use_errno là một lá cờ Boolean thêm một lớp an toàn thêm xung quanh việc xử lý biến C errno trong thư viện được tải. Theo mặc định, USS_ERRNO là sai. use_last_error là một lá cờ boolean cho phép một cặp chức năng get_last_error [] và set_last_error [] có thể được sử dụng để thao tác mã lỗi hệ thống. Những thứ này được sử dụng phổ biến hơn trên Windows. Theo mặc định, USS_LAST_ERROR là sai. Windll [name [, mode [, xử lý [, use_errno [, use_last_error]]]]]]]

Giống như CDLL [] ngoại trừ các hàm trong thư viện được giả định để tuân theo các quy ước gọi Windows StdCall [Windows]. Chức năng tiện ích sau đây có thể được sử dụng để định vị các thư viện được chia sẻ trên hệ thống và xây dựng tên phù hợp để sử dụng làm tham số tên trong các lớp trước. Nó được định nghĩa trong ctypes.util Submodule: find_l Library [tên]

Được xác định trong ctypes.util. Trả về một tên đường dẫn tương ứng với tên thư viện. Tên là tên thư viện không có bất kỳ hậu tố tệp nào như 'libc', 'libm', v.v. Hành vi của chức năng này phụ thuộc nhiều hệ thống và phụ thuộc vào cấu hình cơ bản của các thư viện và môi trường được chia sẻ [ví dụ: cài đặt của LD_L Library_Path và các tham số khác]. Trả lại không nếu thư viện có thể định vị được.

Các hàm nước ngoài Các phiên bản thư viện được chia sẻ bởi lớp CDLL [] hoạt động dưới dạng proxy cho thư viện C bên dưới. Để thư viện truy cập nội dung, bạn chỉ cần sử dụng Tra cứu thuộc tính [toán tử]. Ví dụ:

Nhúng thông dịch viên Python

>>> nhập ctypes >>> libc = ctypes.cdll ["/usr/lib/libc.dylib"] >>> libc.rand [] 16807 >>> libc.atoi ["12345"]

F

H lib

fl

B

d

ff

614

Chương 26 Mở rộng và nhúng Python

Bảng 26.5

Ctypes DataTypes

Tên loại Ctypes

C Kiểu dữ liệu

Giá trị python

c_bool c_bytes c_char

Bool đã ký char char

Đúng hoặc sai ký tự đơn số nguyên nhỏ

c_char_p c_double c_longdouble c_float c_int c_int8 c_int16 c_int32 c_int64 c_long c_longlong c_short c_size_t c_ubyte c_uint c_uint8 c_uint

Char * Double Double Float Int Đã ký char ngắn int dài dài dài dài Size_t Unfign Char Unsign Int Unsign Char Unsign SHORT không dấu int unsign dài không dấu dài không dấu dài không dấu khoảng trống ngắn * wchar_t wchar_t *

Chuỗi kết thúc hoặc byte điểm nổi điểm nổi điểm nổi số nguyên số nguyên số nguyên số nguyên số nguyên 32-bit số nguyên 64-bit số nguyên 64 bit Số nguyên 64 bit Số nguyên số nguyên không dấu 6-BIT Số nguyên không dấu Số nguyên không dấu 64 bit số nguyên không dấu không dấu số nguyên không dấu Số nguyên không dấu Số nguyên không dấu ký tự unicode không kết thúc

Để tạo một loại đại diện cho con trỏ C, áp dụng chức năng sau cho một trong các loại khác: con trỏ [loại]

Xác định một loại là một loại con trỏ để loại. Ví dụ: con trỏ [C_INT] đại diện cho loại C int *. Để xác định một loại biểu thị một mảng C có kích thước cố định, nhân một loại hiện có với số lượng kích thước mảng. Ví dụ: C_INT*4 đại diện cho kiểu dữ liệu C Int [4]. Để xác định một loại đại diện cho cấu trúc C hoặc liên kết, bạn kế thừa từ một trong các lớp cơ sở cấu trúc hoặc liên minh. Trong mỗi lớp dẫn xuất, bạn xác định một biến lớp _fields_ mô tả nội dung. _fields_ là danh sách 2 hoặc 3 bộ dữ

F

H lib

fl

B

d

ff

Chương 26 Mở rộng và nhúng Python

615

Bảng 26.5

Ctypes DataTypes

Tên loại Ctypes

C Kiểu dữ liệu

Giá trị python

c_bool c_bytes c_char

Bool đã ký char char

Đúng hoặc sai ký tự đơn số nguyên nhỏ

c_char_p c_double c_longdouble c_float c_int c_int8 c_int16 c_int32 c_int64 c_long c_longlong c_short c_size_t c_ubyte c_uint c_uint8 c_uint

Char * Double Double Float Int Đã ký char ngắn int dài dài dài dài Size_t Unfign Char Unsign Int Unsign Char Unsign SHORT không dấu int unsign dài không dấu dài không dấu dài không dấu khoảng trống ngắn * wchar_t wchar_t *

F

H lib

fl

B

d

ff

616

Chương 26 Mở rộng và nhúng Python

Bảng 26.5

Ctypes DataTypes

Phương pháp xây dựng loại thay thế Tất cả các trường hợp của các loại CTYPE như C_INT, con trỏ, v.v. có một số phương thức lớp được sử dụng để tạo các trường hợp của các loại CTYPE từ vị trí bộ nhớ và các đối tượng khác. Ty.From_Buffer [Nguồn [, Offset]]

Tạo một thể hiện của loại CTYPES TY có chung bộ đệm bộ nhớ như nguồn. Nguồn phải là bất kỳ đối tượng nào khác hỗ trợ giao diện bộ đệm có thể ghi [ví dụ: bytearray, các đối tượng mảng trong mô -đun mảng, MMAP, v.v.]. Offset là số byte từ đầu bộ đệm để sử dụng. Ty.From_Buffer_Copy [Nguồn [, Offset]]

Giống như ty.from_buffer [] ngoại trừ việc một bản sao của bộ nhớ được tạo và nguồn đó có thể chỉ được đọc. ty.from_address [địa chỉ]

Tạo một thể hiện của CTYPES TYPE TY từ địa chỉ bộ nhớ thô được chỉ định là một số nguyên. ty.from_param [obj]

Tạo một thể hiện của loại ctypes Ty từ một đối tượng Python obj. Điều này chỉ hoạt động nếu đối tượng được truyền OBJ có thể được điều chỉnh thành loại thích hợp. Ví dụ, một số nguyên Python có thể được điều chỉnh thành một thể hiện C_INT. ty.in_dll [thư viện, tên]

Tạo một thể hiện của ctypes type Ty từ một biểu tượng trong thư viện được chia sẻ. Thư viện là một thể hiện của thư viện được tải như đối tượng được tạo bởi lớp CDLL. Tên là tên của một ký hiệu. Phương thức này có thể được sử dụng để đặt trình bao bọc CTYPES xung quanh các biến toàn cầu được xác định trong thư viện. Ví dụ sau đây cho thấy cách bạn có thể tạo tham chiếu đến trạng thái INT biến toàn cầu được xác định trong thư viện libexample.so. libexample = ctypes.cdll ["libexample.so"] status = ctypes.c_int.in_dll [libexample, "status"]

F

H lib

fl

B

d

ff

Nhúng thông dịch viên Python

617

Các chức năng tiện ích Các chức năng tiện ích sau đây được xác định bởi CTYPE: Địa chỉ [COBJ]

Trả về địa chỉ bộ nhớ của Cobj như một số nguyên. COBJ phải là một ví dụ của loại CTYPES. Căn chỉnh [ctype_or_obj]

Trả về các yêu cầu căn chỉnh số nguyên của loại hoặc đối tượng CTYPES. CTYPE_OR_OBJ phải là loại ctypes hoặc một thể hiện của một loại. Diễn viên [Cobj, Ctype]

Đưa một đối tượng CTYPES COBJ vào một loại mới được đưa ra trong ctype. Điều này chỉ hoạt động cho các con trỏ, vì vậy Cobj phải là một con trỏ hoặc mảng và ctype phải là một loại con trỏ. create_string_buffer [init [, size]]

Tạo một bộ đệm ký tự có thể thay đổi dưới dạng mảng CTYPES loại C_char. init là một kích thước số nguyên hoặc một chuỗi đại diện cho các nội dung ban đầu. Kích thước là một tham số tùy chọn chỉ định kích thước sẽ sử dụng nếu init là một chuỗi. Theo mặc định, kích thước được đặt thành một số lớn hơn số lượng ký tự trong INIT. Các chuỗi Unicode được mã hóa thành byte bằng cách sử dụng mã hóa mặc định. created_unicode_buffer [init [, size]]

Giống như create_string_buffer [], ngoại trừ một mảng ctypes loại c_wchar được tạo. get_errno []

Trả về giá trị hiện tại của bản sao riêng của CTYPES của Errno. get_last_error []

Trả về giá trị hiện tại của bản sao riêng của CTYPES của Lasterror trên Windows. Memmove [DST, SRC, đếm]

Bản sao đếm byte từ SRC đến DST. SRC và DST là các số nguyên đại diện cho các địa chỉ bộ nhớ hoặc các phiên bản của các loại CTYPE có thể được chuyển đổi thành các con trỏ. Giống như hàm thư viện c memmove []. memset [DST, C, đếm]

Đặt số byte của bộ nhớ bắt đầu từ DST thành giá trị byte c. DST là một số nguyên hoặc một thể hiện CTYPES. C là một số nguyên đại diện cho một byte trong phạm vi 0-255. Thay đổi kích thước [cobj, kích thước]

Thay đổi kích thước bộ nhớ trong được sử dụng để biểu thị đối tượng CtyPes COBJ. Kích thước là kích thước mới trong byte. set_conversion_mode [mã hóa, lỗi]

Đặt mã hóa Unicode được sử dụng khi chuyển đổi từ chuỗi Unicode thành chuỗi 8 bit. Mã hóa là tên mã hóa như 'UTF-8' và lỗi là chính sách xử lý lỗi như 'nghiêm ngặt' hoặc 'bỏ qua'. Trả về một tuple [mã hóa, lỗi] với cài đặt trước đó.

F

H lib

fl

B

d

ff

618

Nhúng thông dịch viên Python

Các chức năng tiện ích Các chức năng tiện ích sau đây được xác định bởi CTYPE: Địa chỉ [COBJ]

Trả về địa chỉ bộ nhớ của Cobj như một số nguyên. COBJ phải là một ví dụ của loại CTYPES. Căn chỉnh [ctype_or_obj]

Trả về các yêu cầu căn chỉnh số nguyên của loại hoặc đối tượng CTYPES. CTYPE_OR_OBJ phải là loại ctypes hoặc một thể hiện của một loại. Diễn viên [Cobj, Ctype]

Đưa một đối tượng CTYPES COBJ vào một loại mới được đưa ra trong ctype. Điều này chỉ hoạt động cho các con trỏ, vì vậy Cobj phải là một con trỏ hoặc mảng và ctype phải là một loại con trỏ. create_string_buffer [init [, size]]

Tạo một bộ đệm ký tự có thể thay đổi dưới dạng mảng CTYPES loại C_char. init là một kích thước số nguyên hoặc một chuỗi đại diện cho các nội dung ban đầu. Kích thước là một tham số tùy chọn chỉ định kích thước sẽ sử dụng nếu init là một chuỗi. Theo mặc định, kích thước được đặt thành một số lớn hơn số lượng ký tự trong INIT. Các chuỗi Unicode được mã hóa thành byte bằng cách sử dụng mã hóa mặc định. created_unicode_buffer [init [, size]]

Giống như create_string_buffer [], ngoại trừ một mảng ctypes loại c_wchar được tạo. get_errno []

Trả về giá trị hiện tại của bản sao riêng của CTYPES của Errno. get_last_error []

# int replace[char *s, char olcdh, char newch] _example.replace.argtypes = [ctypes.c_char_p, ctypes.c_char, ctypes.c_char] _example.replace.restype = ctypes.c_int def replace[s, oldch, newch]: sbuffer = ctypes.create_string_buffer[s] nrep = _example.replace[sbuffer,oldch,newch] return [nrep,sbuffer.value] # double distance[Point *p1, Point *p2] class Point[ctypes.Structure]: _fields_ = [ ["x", ctypes.c_double], ["y", ctypes.c_double] ] _example.distance.argtypes = [ctypes.POINTER[Point], ctypes.POINTER[Point]] _example.distance.restype = ctypes.c_double def distance[a,b]: p1 = Point[*a] p2 = Point[*b] return _example.distance[byref[p1],byref[p2]]

F

h Lib

fL

B

d

ff

Advanced Extending and Embedding

619

As a general note, usage of ctypes is always going to involve a Python wrapper layer of varying complexity. For example, it may be the case that you can call a C function directly. However, you may also have to implement a small wrapping layer to account for certain aspects of the underlying C code. In this example, the replace[] function is taking extra steps to account for the fact that the C library mutates the input buffer.The distance[] function is performing extra steps to create Point instances from tuples and to pass pointers. Note The ctypes module has a large number of advanced features not covered here. For example, the library can access many different kinds of libraries on Windows, and there is support for callback functions, incomplete types, and other details. The online documentation is filled with many examples so that should be a starting point for further use.

Advanced Extending and Embedding Creating handwritten extension modules or using ctypes is usually straightforward if you are extending Python with simple C code. However, for anything more complex, it can quickly become tedious. For this, you will want to look for a suitable extension building tool.These tools either automate much of the extension building process or provide a programming interface that operates at a much higher level. Links to a variety of such tools can be found at //wiki.python.org/moin/IntegratingPythonWithOtherLanguages. However, a short example with SWIG [//www.swig.org] will be shown just to illustrate. In the interest of full disclosure, it should be noted that SWIG was originally created by the author. With automated tools, you usually just describe the contents of an extension module at a high level. For example, with SWIG, you write a short interface specification that looks like this: /* example.i : Sample Swig specification */ %module example %{ /* Preamble. Include all required header files here */ #include "example.h" %} /* Module contents. List all C declarations here */ typedef struct Point { double x; double y; } Point; extern int gcd[int, int]; extern int replace[char *s, char oldch, char newch]; extern double distance[Point *a, Point *b];

Using this specification, SWIG automatically generates everything needed to make a Python extension module.To run SWIG, you just invoke it like a compiler: % swig –python example.i %

F

h Lib

fL

B

d

ff

620

Chapter 26 Extending and Embedding Python

As output, it generates a set of .c and .py files. However, you often don’t have to worry much about this. If you are using distutils and include a .i file in the setup specification, it will run SWIG automatically for you when building an extension. For example, this setup.py file automatically runs SWIG on the listed example.i file. # setup.py from distutils.core import setup, Extension setup[name="example", version="1.0", py_modules = ['example.py'], ext_modules = [ Extension["_example", ["example.i","example.c"]] ] ]

It turns out that this example.i file and the setup.py file are all that are needed to have a working extension module in this example. If you type python setup.py build_ext --inplace, you will find that you have a fully working extension in your directory.

Jython and IronPython Extending and embedding is not restricted to C programs. If you are working with Java, consider the use of Jython [//www.jython.org], a complete reimplementation of the Python interpreter in Java.With jython, you can simply import Java libraries using the import statement. For example: bash-3.2$ jython Jython 2.2.1 on java1.5.0_16 Type "copyright", "credits" or "license" for more information. >>> from java.lang import System >>> System.out.println["Hello World"] Hello World >>>

If you are working with the .NET framework on Windows, consider the use of IronPython [//www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython], a complete reimplementation of the Python interpreter in C#.With IronPython, you can easily access all of the .NET libraries from Python in a similar manner. For example: % ipy IronPython 1.1.2 [1.1.2] on .NET 2.0.50727.42 Copyright [c] Microsoft Corporation. All rights reserved. >>> import System.Math >>> dir[System.Math] ['Abs', 'Acos', 'Asin', 'Atan', 'Atan2', 'BigMul', 'Ceiling', 'Cos', 'Cosh', ...] >>> System.Math.Cos[3] -0.9899924966 >>>

Bao gồm Jython và Ironpython chi tiết hơn là vượt quá phạm vi của cuốn sách này. Tuy nhiên, chỉ cần nhớ rằng họ là cả Python, những khác biệt lớn nhất là trong thư viện của họ.

F

H lib

fl

B

d

ff

Phụ lục Python 3 I

N tháng 12 năm 2008, Python 3.0 đã được phát hành, một bản cập nhật lớn cho ngôn ngữ Python phá vỡ khả năng tương thích ngược với Python 2 trong một số lĩnh vực quan trọng. Một cuộc khảo sát khá đầy đủ về những thay đổi được thực hiện đối với Python 3 có thể được tìm thấy trong tài liệu mới trong tài liệu của Python 3.0, có sẵn tại //docs.python.org/3.0/whatsnew/3.0.html. Theo một nghĩa nào đó, 26 chương đầu tiên của cuốn sách này có thể được xem là cực đối diện với tài liệu của những gì mới. . Điều này bao gồm tất cả các mô -đun thư viện tiêu chuẩn, các tính năng ngôn ngữ chính và các ví dụ. Ngoài một vài sự khác biệt đặt tên nhỏ và thực tế là in [] là một hàm, không có tính năng Python 3 nào được mô tả. Trọng tâm chính của phụ lục này là mô tả các tính năng mới cho ngôn ngữ Python chỉ có sẵn trong phiên bản 3 cũng như một số khác biệt quan trọng cần lưu ý nếu bạn sẽ di chuyển mã hiện có. Vào cuối Phụ lục này, một số chiến lược chuyển và sử dụng công cụ chuyển đổi mã 2TO3 được mô tả.

Ai nên sử dụng Python 3? Trước khi đi xa hơn, điều quan trọng là phải giải quyết câu hỏi ai sẽ sử dụng bản phát hành Python 3.0. Với cộng đồng Python, người ta luôn biết rằng việc chuyển đổi sang Python 3 sẽ không xảy ra qua đêm và chi nhánh Python 2 sẽ tiếp tục được duy trì trong một thời gian [năm] trong tương lai. Vì vậy, khi viết bài này, không cần phải bỏ mã Python 2. Tôi nghi ngờ rằng số lượng lớn mã Python 2 sẽ tiếp tục được phát triển khi phiên bản thứ 5 của cuốn sách này được viết nhiều năm kể từ bây giờ. Một vấn đề lớn đối với Python 3.0 liên quan đến khả năng tương thích của các thư viện bên thứ ba. Phần lớn sức mạnh của Python, đến từ nhiều khung và thư viện. Tuy nhiên, trừ khi các thư viện này được chuyển đến Python 3 một cách rõ ràng, chúng gần như chắc chắn không hoạt động. Vấn đề này được khuếch đại bởi thực tế là nhiều thư viện phụ thuộc vào các thư viện khác phụ thuộc vào các thư viện hơn. Theo văn bản này [2009], có những thư viện và khuôn khổ chính cho Python mà thiên đường thậm chí đã được chuyển đến Python 2.4, chứ đừng nói đến 2.6 hoặc 3.0. Vì vậy, nếu bạn đang sử dụng Python với mục đích chạy mã của bên thứ ba, bạn nên gắn bó với Python 2 ngay bây giờ. Nếu bạn đã chọn cuốn sách này và nó là năm 2012, thì hy vọng tình hình sẽ được cải thiện. Mặc dù Python 3 làm sạch rất nhiều mụn cóc nhỏ trong ngôn ngữ, nhưng không rõ liệu Python 3 có phải là một lựa chọn khôn ngoan cho người dùng mới chỉ cố gắng tìm hiểu những điều cơ bản hay không. Hầu như tất cả các tài liệu, hướng dẫn, sách dạy nấu ăn và ví dụ hiện có đều giả sử Python 2 và sử dụng

F

H lib

fl

B

d

ff

622

Phụ lục Python 3 I

N tháng 12 năm 2008, Python 3.0 đã được phát hành, một bản cập nhật lớn cho ngôn ngữ Python phá vỡ khả năng tương thích ngược với Python 2 trong một số lĩnh vực quan trọng. Một cuộc khảo sát khá đầy đủ về những thay đổi được thực hiện đối với Python 3 có thể được tìm thấy trong tài liệu mới trong tài liệu của Python 3.0, có sẵn tại //docs.python.org/3.0/whatsnew/3.0.html. Theo một nghĩa nào đó, 26 chương đầu tiên của cuốn sách này có thể được xem là cực đối diện với tài liệu của những gì mới. . Điều này bao gồm tất cả các mô -đun thư viện tiêu chuẩn, các tính năng ngôn ngữ chính và các ví dụ. Ngoài một vài sự khác biệt đặt tên nhỏ và thực tế là in [] là một hàm, không có tính năng Python 3 nào được mô tả. Trọng tâm chính của phụ lục này là mô tả các tính năng mới cho ngôn ngữ Python chỉ có sẵn trong phiên bản 3 cũng như một số khác biệt quan trọng cần lưu ý nếu bạn sẽ di chuyển mã hiện có. Vào cuối Phụ lục này, một số chiến lược chuyển và sử dụng công cụ chuyển đổi mã 2TO3 được mô tả.

Ai nên sử dụng Python 3? Trước khi đi xa hơn, điều quan trọng là phải giải quyết câu hỏi ai sẽ sử dụng bản phát hành Python 3.0. Với cộng đồng Python, người ta luôn biết rằng việc chuyển đổi sang Python 3 sẽ không xảy ra qua đêm và chi nhánh Python 2 sẽ tiếp tục được duy trì trong một thời gian [năm] trong tương lai. Vì vậy, khi viết bài này, không cần phải bỏ mã Python 2. Tôi nghi ngờ rằng số lượng lớn mã Python 2 sẽ tiếp tục được phát triển khi phiên bản thứ 5 của cuốn sách này được viết nhiều năm kể từ bây giờ. Một vấn đề lớn đối với Python 3.0 liên quan đến khả năng tương thích của các thư viện bên thứ ba. Phần lớn sức mạnh của Python, đến từ nhiều khung và thư viện. Tuy nhiên, trừ khi các thư viện này được chuyển đến Python 3 một cách rõ ràng, chúng gần như chắc chắn không hoạt động. Vấn đề này được khuếch đại bởi thực tế là nhiều thư viện phụ thuộc vào các thư viện khác phụ thuộc vào các thư viện hơn. Theo văn bản này [2009], có những thư viện và khuôn khổ chính cho Python mà thiên đường thậm chí đã được chuyển đến Python 2.4, chứ đừng nói đến 2.6 hoặc 3.0. Vì vậy, nếu bạn đang sử dụng Python với mục đích chạy mã của bên thứ ba, bạn nên gắn bó với Python 2 ngay bây giờ. Nếu bạn đã chọn cuốn sách này và nó là năm 2012, thì hy vọng tình hình sẽ được cải thiện. Mặc dù Python 3 làm sạch rất nhiều mụn cóc nhỏ trong ngôn ngữ, nhưng không rõ liệu Python 3 có phải là một lựa chọn khôn ngoan cho người dùng mới chỉ cố gắng tìm hiểu những điều cơ bản hay không. Hầu như tất cả các tài liệu, hướng dẫn, sách dạy nấu ăn và ví dụ hiện có đều giả sử Python 2 và sử dụng

Phụ lục Python 3

Chỉ vì bạn có thể sử dụng các ký tự như vậy trong mã nguồn của mình không có nghĩa là đó là một ý tưởng tốt. Không phải tất cả các biên tập viên, thiết bị đầu cuối hoặc công cụ phát triển đều rất giỏi trong việc xử lý Unicode. Thêm vào đó, thật khó chịu khi buộc các lập trình viên gõ các chuỗi phím khó xử cho các nhân vật không có mặt rõ ràng trên bàn phím tiêu chuẩn [không đề cập đến thực tế là nó có thể tạo ra một số tin tặc có lông màu xám trong văn phòng kể cho mọi người một câu chuyện thú vị khác] . Vì vậy, nó có lẽ tốt hơn để bảo lưu việc sử dụng các ký tự Unicode cho các bình luận và chuỗi chữ.

Đặt chữ một tập hợp các mục hiện có thể được xác định bằng cách đặt một tập hợp các giá trị trong niềng răng {các mục}. Ví dụ: Days = {'mon', 'Tue', 'wed', 'thu', 'fri', 'sat', 'sun'}

Cú pháp này giống như sử dụng hàm set []

F

H lib

fl

B

d

ff

Các tính năng ngôn ngữ mới

623

Đặt và hiểu từ điển Cú pháp {expr cho x trong s nếu có điều kiện} là một sự hiểu biết được thiết lập. Nó áp dụng một hoạt động cho tất cả các yếu tố của Set S và có thể được sử dụng theo cách tương tự như sự hiểu biết danh sách. Ví dụ: >>> Giá trị = {1, 2, 3, 4} >>> bình phương = {x*x cho x trong các giá trị} >>> bình phương {16, 1, 4, 9} >>>>

Cú pháp {kexpr: vexpr cho k, v trong s i if điều kiện} là một sự hiểu biết từ điển. Nó áp dụng một hoạt động cho tất cả các khóa và giá trị theo chuỗi của các bộ dữ liệu [khóa, giá trị] và trả về từ điển. Các khóa của từ điển mới được mô tả bởi một biểu thức kexpr và các giá trị được mô tả bởi biểu thức vexpr.this có thể được xem như là một phiên bản mạnh mẽ hơn của hàm Dict []. Để minh họa, giả sử bạn có một tập tin giá cổ phiếu 'giá.

Dưới đây là một chương trình đọc tệp này thành một bản đồ từ điển tên chứng khoán theo giá bằng cách hiểu từ điển: FIELDS = [line.split [] cho dòng mở ["price.dat"]] giá = {sym: float [val] cho sym, val trong các trường}

Dưới đây là một ví dụ chuyển đổi tất cả các khóa của từ điển giá thành chữ thường: d = {sym.lower []: Giá cho sym, giá cả về giá.items []}

Dưới đây là một ví dụ tạo ra một từ điển giá cho cổ phiếu trên $ 100,00: d = {sym: giá cho sym, giá với giá.items [] nếu giá> = 100.0}

Mở rộng có thể giải nén trong Python 2, các mục trong một điều khác có thể được giải nén thành các biến bằng cách sử dụng cú pháp như sau: Các mục = [1,2,3,4] A, B, C, D = Các mục

# Giải nén các mục thành các biến

Để giải nén này hoạt động, số lượng biến và mục được giải nén phải khớp chính xác. Trong Python 3, bạn có thể sử dụng biến ký tự đại diện để chỉ giải nén một số mục trong một chuỗi, đặt bất kỳ giá trị nào còn lại trong danh sách. Ví dụ: a,*rest = mục a,*rest, d = items*rest, d = items

# a = 1, rest = [2,3,4] # a = 1, rest = [2,3], d = 4 # rest = [1,2,3], d = 4

F

H lib

fl

B

d

ff

624

Các tính năng ngôn ngữ mới

Đặt và hiểu từ điển Cú pháp {expr cho x trong s nếu có điều kiện} là một sự hiểu biết được thiết lập. Nó áp dụng một hoạt động cho tất cả các yếu tố của Set S và có thể được sử dụng theo cách tương tự như sự hiểu biết danh sách. Ví dụ: >>> Giá trị = {1, 2, 3, 4} >>> bình phương = {x*x cho x trong các giá trị} >>> bình phương {16, 1, 4, 9} >>>>

Cú pháp {kexpr: vexpr cho k, v trong s i if điều kiện} là một sự hiểu biết từ điển. Nó áp dụng một hoạt động cho tất cả các khóa và giá trị theo chuỗi của các bộ dữ liệu [khóa, giá trị] và trả về từ điển. Các khóa của từ điển mới được mô tả bởi một biểu thức kexpr và các giá trị được mô tả bởi biểu thức vexpr.this có thể được xem như là một phiên bản mạnh mẽ hơn của hàm Dict []. Để minh họa, giả sử bạn có một tập tin giá cổ phiếu 'giá.

Dưới đây là một chương trình đọc tệp này thành một bản đồ từ điển tên chứng khoán theo giá bằng cách hiểu từ điển: FIELDS = [line.split [] cho dòng mở ["price.dat"]] giá = {sym: float [val] cho sym, val trong các trường}

Dưới đây là một ví dụ chuyển đổi tất cả các khóa của từ điển giá thành chữ thường: d = {sym.lower []: Giá cho sym, giá cả về giá.items []}

Dưới đây là một ví dụ tạo ra một từ điển giá cho cổ phiếu trên $ 100,00: d = {sym: giá cho sym, giá với giá.items [] nếu giá> = 100.0}

Mở rộng có thể giải nén trong Python 2, các mục trong một điều khác có thể được giải nén thành các biến bằng cách sử dụng cú pháp như sau: Các mục = [1,2,3,4] A, B, C, D = Các mục

# Giải nén các mục thành các biến

Để giải nén này hoạt động, số lượng biến và mục được giải nén phải khớp chính xác. Trong Python 3, bạn có thể sử dụng biến ký tự đại diện để chỉ giải nén một số mục trong một chuỗi, đặt bất kỳ giá trị nào còn lại trong danh sách. Ví dụ: a,*rest = mục a,*rest, d = items*rest, d = items

F

H lib

fl

B

d

ff

Các tính năng ngôn ngữ mới

625

Một lần nữa, điều quan trọng là phải nhấn mạnh rằng Python không đính kèm bất kỳ ý nghĩa nào đối với các chú thích. Việc sử dụng dự định là trong các thư viện và khung của bên thứ ba có thể muốn sử dụng chúng cho các ứng dụng khác nhau liên quan đến siêu hình. Các ví dụ bao gồm, nhưng không giới hạn ở các công cụ phân tích tĩnh, tài liệu, thử nghiệm, quá tải chức năng, sắp xếp, gọi thủ tục từ xa, IDE, hợp đồng, v.v. Dưới đây là một ví dụ về chức năng trang trí thực thi các xác nhận về các đối số chức năng và giá trị trả về: Def đảm bảo [func]: # trích xuất dữ liệu chú thích return_check = func._ _annotations_ _.get ['return', none] arg_checks = [[name, func._ _annotation _. Nếu kiểm tra: khẳng định kiểm tra [giá trị], " %s %s" %[tên, kiểm tra._ _doc_ _] để biết tên, kiểm tra arg_checks [len [args]:]: nếu kiểm tra: khẳng định kiểm tra [kwargs [tên]] , " %s %s" %[tên, kiểm tra._ _doc_ _] result = func [*args, ** kwargs] khẳng định return_check [result]

Dưới đây là một ví dụ về mã sử dụng trình trang trí trước: def dương [x]: "Phải dương tính" trả về x> 0 def modem , b: tiêu cực] -> dương: trả lại a -b

Sau đây là một số đầu ra mẫu của việc sử dụng hàm: >>> foo [3, -2] 5 >>> foo [-5,2] traceback [cuộc gọi gần đây nhất cuối cùng]: tệp "", dòng 1, trong tệp "meta .py ", dòng 19, trong cuộc gọi DEF ASSERT_CALL [*args, ** kwargs]: AssitSerror: A phải tích cực >>>

Các hàm đối số chỉ dành cho từ khóa có thể chỉ định các đối số chỉ từ khóa. Điều này được biểu thị bằng cách xác định các tham số bổ sung sau tham số được sao chép đầu tiên. Ví dụ: def foo [x, *args, nghiêm ngặt = false]: các câu lệnh

F

H lib

fl

B

d

ff

626

Các tính năng ngôn ngữ mới

Một lần nữa, điều quan trọng là phải nhấn mạnh rằng Python không đính kèm bất kỳ ý nghĩa nào đối với các chú thích. Việc sử dụng dự định là trong các thư viện và khung của bên thứ ba có thể muốn sử dụng chúng cho các ứng dụng khác nhau liên quan đến siêu hình. Các ví dụ bao gồm, nhưng không giới hạn ở các công cụ phân tích tĩnh, tài liệu, thử nghiệm, quá tải chức năng, sắp xếp, gọi thủ tục từ xa, IDE, hợp đồng, v.v. Dưới đây là một ví dụ về chức năng trang trí thực thi các xác nhận về các đối số chức năng và giá trị trả về: Def đảm bảo [func]: # trích xuất dữ liệu chú thích return_check = func._ _annotations_ _.get ['return', none] arg_checks = [[name, func._ _annotation _. Nếu kiểm tra: khẳng định kiểm tra [giá trị], " %s %s" %[tên, kiểm tra._ _doc_ _] để biết tên, kiểm tra arg_checks [len [args]:]: nếu kiểm tra: khẳng định kiểm tra [kwargs [tên]] , " %s %s" %[tên, kiểm tra._ _doc_ _] result = func [*args, ** kwargs] khẳng định return_check [result]

Dưới đây là một ví dụ về mã sử dụng trình trang trí trước: def dương [x]: "Phải dương tính" trả về x> 0 def modem , b: tiêu cực] -> dương: trả lại a -b

Sau đây là một số đầu ra mẫu của việc sử dụng hàm: >>> foo [3, -2] 5 >>> foo [-5,2] traceback [cuộc gọi gần đây nhất cuối cùng]: tệp "", dòng 1, trong tệp "meta .py ", dòng 19, trong cuộc gọi DEF ASSERT_CALL [*args, ** kwargs]: AssitSerror: A phải tích cực >>>

Các hàm đối số chỉ dành cho từ khóa có thể chỉ định các đối số chỉ từ khóa. Điều này được biểu thị bằng cách xác định các tham số bổ sung sau tham số được sao chép đầu tiên. Ví dụ: def foo [x, *args, nghiêm ngặt = false]: các câu lệnh

Phụ lục Python 3

Khi gọi hàm này, tham số nghiêm ngặt chỉ có thể được chỉ định làm từ khóa. Ví dụ: a = foo [1, nghiêm ngặt = true]

Bất kỳ đối số vị trí bổ sung nào cũng sẽ được đặt trong ARG và không được sử dụng để đặt giá trị nghiêm ngặt. Nếu bạn không muốn chấp nhận một số lượng đối số khác nhau nhưng muốn các đối số chỉ dành cho từ khóa, hãy sử dụng trần * trong danh sách tham số. Ví dụ: def foo [x, *, nghiêm ngặt = false]: Câu lệnh

Đây là một ví dụ về cách sử dụng: foo [1, true] foo [1, nghiêm ngặt = true]

# Thất bại. TypeError: foo [] lấy 1 đối số vị trí # OK.

Ellipsis dưới dạng biểu thức đối tượng Ellipsis [...] hiện có thể xuất hiện dưới dạng biểu thức. Điều này cho phép nó được đặt trong các thùng chứa và được gán cho các biến. Ví dụ: >>> x = ... >>> x ellipsis >>> a = [1,2, ...] >>> a [1, 2, ellipsis] >>> ... trong một sự thật >>> x là ... Đúng >>>

F

H lib

fl

B

d

ff

Các tính năng ngôn ngữ mới

627

Một lần nữa, điều quan trọng là phải nhấn mạnh rằng Python không đính kèm bất kỳ ý nghĩa nào đối với các chú thích. Việc sử dụng dự định là trong các thư viện và khung của bên thứ ba có thể muốn sử dụng chúng cho các ứng dụng khác nhau liên quan đến siêu hình. Các ví dụ bao gồm, nhưng không giới hạn ở các công cụ phân tích tĩnh, tài liệu, thử nghiệm, quá tải chức năng, sắp xếp, gọi thủ tục từ xa, IDE, hợp đồng, v.v. Dưới đây là một ví dụ về chức năng trang trí thực thi các xác nhận về các đối số chức năng và giá trị trả về: Def đảm bảo [func]: # trích xuất dữ liệu chú thích return_check = func._ _annotations_ _.get ['return', none] arg_checks = [[name, func._ _annotation _. Nếu kiểm tra: khẳng định kiểm tra [giá trị], " %s %s" %[tên, kiểm tra._ _doc_ _] để biết tên, kiểm tra arg_checks [len [args]:]: nếu kiểm tra: khẳng định kiểm tra [kwargs [tên]] , " %s %s" %[tên, kiểm tra._ _doc_ _] result = func [*args, ** kwargs] khẳng định return_check [result]

Dưới đây là một ví dụ về mã sử dụng trình trang trí trước: def dương [x]: "Phải dương tính" trả về x> 0 def modem , b: tiêu cực] -> dương: trả lại a -b

Sau đây là một số đầu ra mẫu của việc sử dụng hàm: >>> foo [3, -2] 5 >>> foo [-5,2] traceback [cuộc gọi gần đây nhất cuối cùng]: tệp "", dòng 1, trong tệp "meta .py ", dòng 19, trong cuộc gọi DEF ASSERT_CALL [*args, ** kwargs]: AssitSerror: A phải tích cực >>>

Các hàm đối số chỉ dành cho từ khóa có thể chỉ định các đối số chỉ từ khóa. Điều này được biểu thị bằng cách xác định các tham số bổ sung sau tham số được sao chép đầu tiên. Ví dụ: def foo [x, *args, nghiêm ngặt = false]: các câu lệnh

Phụ lục Python 3

Khi gọi hàm này, tham số nghiêm ngặt chỉ có thể được chỉ định làm từ khóa. Ví dụ: a = foo [1, nghiêm ngặt = true]

call last]: 4, in 2, in error 'm' is not defined

For implicit chaining, the _ _context_ _ attribute of an exception instance e contains a reference to previous exception.

Improved super[] The super[] function, used to look up methods in base classes, can be used without any arguments in Python 3. For example: class C[A,B]: def bar[self]: return super[].bar[]

# Call bar[] in bases

In Python 2, you had to use super[C,self].bar[].The old syntax is still supported but is significantly more clunky.

Advanced Metaclasses In Python 2, you can define metaclasses that alter the behavior of classes. A subtle facet of the implementation is that the processing carried out by a metaclass only occurs after the body of a class has executed.That is, the interpreter executes the entire body of a class and populates a dictionary. Once the dictionary has been populated, the dictionary is passed to the metaclass constructor [after the body of the class has executed]. In Python 3, metaclasses can additionally carry out extra work before the class body executes.This is done by defining a special class method called _ _prepare_ _[cls, name, bases, **kwargs] in the metaclass.This method must return a dictionary as a

F

h Lib

fL

B

d

ff

628

Appendix Python 3

result.This dictionary is what gets populated as the body of the class definition executes. Here is an example that outlines the basic procedure: class MyMeta[type]: @classmethod def _ _prepare_ _[cls,name,bases,**kwargs]: print["preparing",name,bases,kwargs] return {} def _ _new_ _[cls,name,bases,classdict]: print["creating",name,bases,classdict] return type._ _new_ _[cls,name,bases,classdict]

Python 3 uses an alternative syntax for specifying a metaclass. For example, to define a class that uses MyMeta, you use this: class Foo[metaclass=MyMeta]: print["About to define methods"] def _ _init_ _[self]: pass def bar[self]: pass print["Done defining methods"]

If you run the following code, you will see the following output that illustrates the control flow: preparing Foo [] {} About to define methods Done defining methods creating Foo [] {'_ _module_ _': '_ _main_ _', 'bar': , '_ _init_ _': }

The additional keyword arguments on the _ _prepare_ _[] method of the metaclass are passed from keyword arguments used in the bases list of a class statement. For example, the statement class Foo[metaclass=MyMeta,spam=42,blah="Hello"] passes the keyword arguments spam and blah to MyMeta._ _prepare_ _[].This convention can be used to pass arbitrary configuration information to a metaclass. To perform any kind of useful processing with the new _ _prepare_ _[] method of metaclasses, you generally have the method return a customized dictionary object. For example, if you wanted to perform special processing as a class is defined, you define a class that inherits from dict and reimplements the _ _setitem_ _[] method to capture assignments to the class dictionary.The following example illustrates this by defining a metaclass that reports errors if any method or class variable is multiply defined. class MultipleDef[dict]: def _ _init_ _[self]: self.multiple= set[] def _ _setitem_ _[self,name,value]: if name in self: self.multiple.add[name] dict._ _setitem_ _[self,name,value] class MultiMeta[type]: @classmethod def _ _prepare_ _[cls,name,bases,**kwargs]: return MultipleDef[] def _ _new_ _[cls,name,bases,classdict]: for name in classdict.multiple: print[name,"multiply defined"]

F

h Lib

fL

B

d

ff

Common Pitfalls

629

if classdict.multiple: raise TypeError["Multiple definitions exist"] return type._ _new_ _[cls,name,bases,classdict]

If you apply this metaclass to another class definition, it will report an error if any method is redefined. For example: class Foo[metaclass=MultiMeta]: def _ _init_ _[self]: pass def _ _init_ _[self,x]: pass

# Error. _ _init_ _ multiply defined.

Common Pitfalls If you are migrating from Python 2 to 3, be aware that Python 3 is more than just new syntax and language features. Major parts of the core language and library have been reworked in ways that are sometimes subtle.There are aspects of Python 3 that may seem like bugs to a Python 2 programmer. In other cases, things that used to be “easy” in Python 2 are now forbidden. This section outlines some of the most major pitfalls that are likely to be encountered by Python 2 programmers making the switch.

Text Versus Bytes Python 3 makes a very strict distinction between text strings [characters] and binary data [bytes]. A literal such as "hello" represents a text string stored as Unicode, whereas b"hello" represents a string of bytes [containing ASCII letters in this case]. Under no circumstances can the str and bytes type be mixed in Python 3. For example, if you try to concatenate strings and bytes together, you will get a TypeError exception.This differs from Python 2 where byte strings would be automatically coerced into Unicode as needed. To convert a text string s into bytes, you must use s.encode[encoding]. For example, s.encode['utf-8'] converts s into a UTF-8 encoded byte string.To convert a byte string t back into text, you must use t.decode[encoding].You can view the encode[] and decode[] methods as a kind of “type cast” between strings and bytes. Keeping a clean separation between text and bytes is ultimately a good thing—the rules for mixing string types in Python 2 were obscure and difficult to understand at best. However, one consequence of the Python 3 approach is that byte strings are much more restricted in their ability to actually behave like “text.” Although there are the standard string methods like split[] and replace[], other aspects of byte strings are not the same as in Python 2. For instance, if you print a byte string, you simply get its repr[] output with quotes such as b'contents'. Similarly, none of the string formatting operations [%, .format[]] work. For example: x = b'Hello World' print[x] print[b"You said '%s'" % x]

# Sản xuất B'Hello World ' # typeerror: % Toán tử không được hỗ trợ

Mất hành vi giống như văn bản với byte là một cạm bẫy tiềm năng cho các lập trình viên hệ thống. Bất chấp cuộc xâm lược của Unicode, có nhiều trường hợp người ta thực sự muốn

F

H lib

fl

B

d

ff

630

Phụ lục Python 3

Làm việc với và thao tác dữ liệu theo định hướng byte như ascii. Bạn có thể có xu hướng sử dụng loại byte để tránh tất cả các chi phí và độ phức tạp của unicode. Tuy nhiên, điều này thực sự sẽ làm cho mọi thứ liên quan đến việc xử lý văn bản theo định hướng byte trở nên khó khăn hơn. Dưới đây là một ví dụ minh họa các vấn đề tiềm ẩn: >>> # Tạo thông báo phản hồi bằng chuỗi [Unicode] >>> Trạng thái = 200 >>> MSG = "OK" >>> proto = "http/1.0" >>>> Phản hồi = " %s %d %s" %[proto, trạng thái, tin nhắn] >>> in [phản hồi] http/1.0 200 ok >>> # tạo thông báo phản hồi chỉ sử dụng byte [ascii] >>> trạng thái = 200 >>> msg = b "ok" >>> proto = b "http/1.0" >>> phản hồi = b " %s %d %s" %[proto, status, msg] traceback [cuộc gọi gần đây nhất cuối cùng]: Tệp "", dòng 1, trong typeerror: loại toán hạng không được hỗ trợ cho %: 'byte' và 'tuple' >>> phản hồi = proto + b "" + str [trạng thái] Cuộc gọi gần đây cuối cùng] X00 .... '>>> Byte [str [status]] Traceback [cuộc gọi gần đây nhất cuối cùng]: Tệp "" ascii '] b'200' >>> phản hồi = proto + b "" + byte [str [trạng thái], 'ascii'] ponse]

Trong ví dụ, bạn có thể thấy Python 3 thực thi đúng cách phân tách văn bản/byte. Ngay cả các hoạt động có vẻ như chúng nên đơn giản, chẳng hạn như chuyển đổi một số nguyên thành các ký tự ASCII, phức tạp hơn nhiều với các byte. Điểm mấu chốt là nếu bạn thực hiện bất kỳ loại xử lý hoặc định dạng dựa trên văn bản nào, có lẽ bạn luôn luôn tốt hơn khi sử dụng các chuỗi văn bản tiêu chuẩn. Nếu bạn cần có được chuỗi byte sau khi hoàn thành việc xử lý đó, bạn có thể sử dụng s.encode ['Latin-1'] để chuyển đổi từ Unicode. Sự phân biệt văn bản/byte có phần tinh tế hơn khi làm việc với các mô -đun thư viện khác nhau. Một số thư viện hoạt động tốt như nhau với văn bản hoặc byte, trong khi một số byte cấm hoàn toàn. Trong các trường hợp khác, hành vi khác nhau tùy thuộc vào loại đầu vào nào được nhận. Ví dụ: hàm os.listdir [dirname] chỉ trả về tệp-

F

H lib

fl

B

d

ff

Phụ lục Python 3

631

Làm việc với và thao tác dữ liệu theo định hướng byte như ascii. Bạn có thể có xu hướng sử dụng loại byte để tránh tất cả các chi phí và độ phức tạp của unicode. Tuy nhiên, điều này thực sự sẽ làm cho mọi thứ liên quan đến việc xử lý văn bản theo định hướng byte trở nên khó khăn hơn. Dưới đây là một ví dụ minh họa các vấn đề tiềm ẩn: >>> # Tạo thông báo phản hồi bằng chuỗi [Unicode] >>> Trạng thái = 200 >>> MSG = "OK" >>> proto = "http/1.0" >>>> Phản hồi = " %s %d %s" %[proto, trạng thái, tin nhắn] >>> in [phản hồi] http/1.0 200 ok >>> # tạo thông báo phản hồi chỉ sử dụng byte [ascii] >>> trạng thái = 200 >>> msg = b "ok" >>> proto = b "http/1.0" >>> phản hồi = b " %s %d %s" %[proto, status, msg] traceback [cuộc gọi gần đây nhất cuối cùng]: Tệp "", dòng 1, trong typeerror: loại toán hạng không được hỗ trợ cho %: 'byte' và 'tuple' >>> phản hồi = proto + b "" + str [trạng thái] Cuộc gọi gần đây cuối cùng] X00 .... '>>> Byte [str [status]] Traceback [cuộc gọi gần đây nhất cuối cùng]: Tệp "" ascii '] b'200' >>> phản hồi = proto + b "" + byte [str [trạng thái], 'ascii'] ponse]

Trong ví dụ, bạn có thể thấy Python 3 thực thi đúng cách phân tách văn bản/byte. Ngay cả các hoạt động có vẻ như chúng nên đơn giản, chẳng hạn như chuyển đổi một số nguyên thành các ký tự ASCII, phức tạp hơn nhiều với các byte. Điểm mấu chốt là nếu bạn thực hiện bất kỳ loại xử lý hoặc định dạng dựa trên văn bản nào, có lẽ bạn luôn luôn tốt hơn khi sử dụng các chuỗi văn bản tiêu chuẩn. Nếu bạn cần có được chuỗi byte sau khi hoàn thành việc xử lý đó, bạn có thể sử dụng s.encode ['Latin-1'] để chuyển đổi từ Unicode. Sự phân biệt văn bản/byte có phần tinh tế hơn khi làm việc với các mô -đun thư viện khác nhau. Một số thư viện hoạt động tốt như nhau với văn bản hoặc byte, trong khi một số byte cấm hoàn toàn. Trong các trường hợp khác, hành vi khác nhau tùy thuộc vào loại đầu vào nào được nhận. Ví dụ: hàm os.listdir [dirname] chỉ trả về tệp-

F

Những cạm bẫy phổ biến

Tên có thể được giải mã thành công dưới dạng unicode nếu dirname là một chuỗi. Nếu dirname là một chuỗi byte, thì tất cả các tên tệp được trả về dưới dạng chuỗi byte.

Hệ thống I/O mới Python 3 thực hiện một hệ thống I/O hoàn toàn mới, các chi tiết được mô tả trong phần mô -đun IO của Chương 19, Dịch vụ hệ điều hành của Hồi giáo. và dữ liệu nhị phân hiện diện với các chuỗi. Nếu bạn đang thực hiện bất kỳ loại I/O nào với văn bản, Python 3 buộc bạn phải mở các tệp trong chế độ văn bản và cung cấp mã hóa tùy chọn nếu bạn muốn bất cứ thứ gì khác ngoài mặc định [thường là UTF-8]. Nếu bạn đang thực hiện I/O bằng dữ liệu nhị phân, bạn phải mở các tệp trong chế độ nhị phân của Cameron và sử dụng chuỗi byte. Một nguồn lỗi phổ biến là chuyển dữ liệu đầu ra vào tệp hoặc luồng I/O được mở ở chế độ sai. Ví dụ: >>> f = open ["foo.txt", "wb"] >>> f.write ["hello world \ n"] traceback [cuộc gọi gần đây nhất]: file "", dòng 1, in Tệp "/tmp/lib/python3.0/io.py", dòng 1035, trong Write Raise typeerror ["Không thể ghi string vào luồng nhị phân"] Kiểu: Không thể ghi string vào luồng nhị phân >>>>

Trong Python 2, gọi foo [] sẽ in số '42'. Trong Python 3, bạn có một ngoại lệ tên tuổi với biến A không được xác định. Điều gì đã xảy ra ở đây là exec [], như một hàm, chỉ hoạt động trên các từ điển được trả về bởi các hàm Globals [] và locals []. Tuy nhiên, từ điển được trả về bởi người dân địa phương [] thực sự là một bản sao của các biến cục bộ. Bài tập được thực hiện trong hàm exec [] là

F

H lib

fl

B

d

ff

632

Phụ lục Python 3

Chỉ sửa đổi bản sao này của người dân địa phương, không phải là các biến cục bộ. Đây là một cách giải quyết: def foo []: _Locals = locals [] exec ["a = 42", globals [], _ locals]

Theo nguyên tắc chung, đừng mong đợi Python 3 sẽ hỗ trợ cùng một mức độ của phép thuật có thể sử dụng Exec [], Eval [] và Execfile [] trong Python 2. Trên thực tế, Execfile [] đã biến mất hoàn toàn [ Bạn có thể mô phỏng chức năng của nó bằng cách chuyển một đối tượng giống như tệp mở cho Exec []].

Việc sử dụng các trình lặp và chế độ xem Python 3 sử dụng nhiều lần lặp và trình tạo hơn nhiều so với Python 2. Các hàm tích hợp như zip [], map [] và phạm vi [] được sử dụng để trả về danh sách bây giờ trả về iterables. Nếu bạn cần lập danh sách từ kết quả, hãy sử dụng hàm Danh sách []. Python 3 có một cách tiếp cận hơi khác để trích xuất thông tin khóa và giá trị từ một từ điển. Trong Python 2, bạn có thể sử dụng các phương thức như D.Keys [], D.Values ​​[] hoặc D.Items [] để có được danh sách các khóa, giá trị hoặc cặp khóa/giá trị tương ứng. Trong Python 3, các phương thức này trả về cái gọi là đối tượng xem. Ví dụ: >>> s = {'goog': 490.10, 'AAPL': 123,45, 'IBM': 91.10} >>> k = s.keys [] >>> k

>>> v = s.values ​​[] >>> v

>>>

Các đối tượng này hỗ trợ lặp lại vì vậy nếu bạn muốn xem nội dung, bạn có thể sử dụng một vòng lặp. Ví dụ: >>> cho x trong k: ... print [x] ... goog AAPL IBM >>>

Các đối tượng xem luôn được gắn lại với từ điển mà chúng được tạo. Một khía cạnh tinh tế của điều này là nếu từ điển cơ bản thay đổi, các mục được tạo ra bởi chế độ xem cũng thay đổi. Ví dụ: >>> s ['acme'] = 5612.25 >>> cho x in k: ... print [x] ... goog aapl ibm acme >>>

Nếu cần phải xây dựng một danh sách các khóa hoặc giá trị từ điển, chỉ cần sử dụng hàm danh sách [], ví dụ, danh sách [s.keys []].

F

H lib

fl

B

d

ff

Phụ lục Python 3

633

Chỉ sửa đổi bản sao này của người dân địa phương, không phải là các biến cục bộ. Đây là một cách giải quyết: def foo []: _Locals = locals [] exec ["a = 42", globals [], _ locals]

Theo nguyên tắc chung, đừng mong đợi Python 3 sẽ hỗ trợ cùng một mức độ của phép thuật có thể sử dụng Exec [], Eval [] và Execfile [] trong Python 2. Trên thực tế, Execfile [] đã biến mất hoàn toàn [ Bạn có thể mô phỏng chức năng của nó bằng cách chuyển một đối tượng giống như tệp mở cho Exec []].

Việc sử dụng các trình lặp và chế độ xem Python 3 sử dụng nhiều lần lặp và trình tạo hơn nhiều so với Python 2. Các hàm tích hợp như zip [], map [] và phạm vi [] được sử dụng để trả về danh sách bây giờ trả về iterables. Nếu bạn cần lập danh sách từ kết quả, hãy sử dụng hàm Danh sách []. Python 3 có một cách tiếp cận hơi khác để trích xuất thông tin khóa và giá trị từ một từ điển. Trong Python 2, bạn có thể sử dụng các phương thức như D.Keys [], D.Values ​​[] hoặc D.Items [] để có được danh sách các khóa, giá trị hoặc cặp khóa/giá trị tương ứng. Trong Python 3, các phương thức này trả về cái gọi là đối tượng xem. Ví dụ: >>> s = {'goog': 490.10, 'AAPL': 123,45, 'IBM': 91.10} >>> k = s.keys [] >>> k

>>> v = s.values ​​[] >>> v

>>>

Các đối tượng này hỗ trợ lặp lại vì vậy nếu bạn muốn xem nội dung, bạn có thể sử dụng một vòng lặp. Ví dụ: >>> cho x trong k: ... print [x] ... goog AAPL IBM >>>

F

H lib

fl

B

d

ff

Phụ lục Python 3

634

Tổ chức lại thư viện Python 3 sắp xếp lại và thay đổi tên của một số phần của thư viện tiêu chuẩn, đáng chú ý nhất là các mô -đun liên quan đến các định dạng dữ liệu mạng và internet. Ngoài ra, một loạt các mô -đun kế thừa đã được loại bỏ khỏi thư viện [ví dụ: gopherlib, RFC822, v.v.]. Bây giờ là thông lệ tiêu chuẩn để sử dụng tên chữ thường cho các mô -đun. Một số mô -đun như ConfigParser, hàng đợi và socketserver đã được đổi tên thành Configparser, hàng đợi và socketserver, bạn nên cố gắng tuân theo các quy ước tương tự trong mã của riêng bạn. Các gói đã được tạo để tổ chức lại mã trước đây được chứa trong các mô-đun khác nhau, ví dụ, gói HTTP chứa tất cả các mô-đun được sử dụng để viết các máy chủ HTTP, gói HTML có các mô-đun để phân tích HTML, gói XMLRPC có các mô-đun cho XML-RPC, và kể từ đó trở đi. Đối với các mô -đun không dùng nữa, cuốn sách này đã cẩn thận chỉ các mô -đun tài liệu được sử dụng hiện tại với Python 2.6 và Python 3.0. Nếu bạn đang làm việc với mã Python 2 hiện tại và xem nó bằng một mô -đun không được ghi lại ở đây, có khả năng mô -đun đã không được chấp nhận để ủng hộ một cái gì đó hiện đại hơn. Chỉ là một ví dụ, Python 3 không có mô -đun Popen2 thường được sử dụng trong Python 2 để khởi chạy các quy trình con. Thay vào đó, bạn nên sử dụng mô -đun phụ.

Nhập khẩu tuyệt đối liên quan đến tổ chức lại thư viện, tất cả các báo cáo nhập khẩu xuất hiện trong các mô hình con của một gói /

_ _init_ _.py spam.py Bar.py

Nếu tệp spam.py sử dụng thanh nhập câu lệnh, bạn sẽ có ngoại lệ nhập khẩu mặc dù Bar.py nằm trong cùng một thư mục. Để tải mô hình con này, Spam.py cần sử dụng nhập foo.bar hoặc nhập gói tương đối chẳng hạn như từ. Thanh nhập khẩu. Điều này khác với Python 2 trong đó nhập luôn kiểm tra thư mục hiện tại cho một trận đấu trước khi chuyển sang kiểm tra các thư mục khác trong sys.path.

Di chuyển mã và mã chuyển đổi 2TO3 từ Python 2 sang Python 3 là một chủ đề tinh tế. Để hoàn toàn rõ ràng, không có nhập khẩu ma thuật, cờ, biến môi trường hoặc công cụ sẽ cho phép Python 3 chạy chương trình Python 2 tùy ý. Tuy nhiên, có một số bước rất cụ thể có thể được thực hiện để di chuyển mã, mỗi bước hiện được mô tả.

Chuyển mã sang Python 2.6 Chúng tôi nên chuyển mã đến Python 3 Port First Port sang Python 2.6. Python 2.6 không chỉ tương thích ngược với Python 2.5, mà còn hỗ trợ một tập hợp các tính năng mới được tìm thấy trong Python 3. Các ví dụ bao gồm định dạng chuỗi nâng cao, cú pháp ngoại lệ mới, chữ byte, thư viện I/O và các lớp cơ sở trừu tượng. Như vậy, a

F

H lib

fl

B

d

ff

Phụ lục Python 3

635

Tổ chức lại thư viện Python 3 sắp xếp lại và thay đổi tên của một số phần của thư viện tiêu chuẩn, đáng chú ý nhất là các mô -đun liên quan đến các định dạng dữ liệu mạng và internet. Ngoài ra, một loạt các mô -đun kế thừa đã được loại bỏ khỏi thư viện [ví dụ: gopherlib, RFC822, v.v.]. Bây giờ là thông lệ tiêu chuẩn để sử dụng tên chữ thường cho các mô -đun. Một số mô -đun như ConfigParser, hàng đợi và socketserver đã được đổi tên thành Configparser, hàng đợi và socketserver, bạn nên cố gắng tuân theo các quy ước tương tự trong mã của riêng bạn. Các gói đã được tạo để tổ chức lại mã trước đây được chứa trong các mô-đun khác nhau, ví dụ, gói HTTP chứa tất cả các mô-đun được sử dụng để viết các máy chủ HTTP, gói HTML có các mô-đun để phân tích HTML, gói XMLRPC có các mô-đun cho XML-RPC, và kể từ đó trở đi. Đối với các mô -đun không dùng nữa, cuốn sách này đã cẩn thận chỉ các mô -đun tài liệu được sử dụng hiện tại với Python 2.6 và Python 3.0. Nếu bạn đang làm việc với mã Python 2 hiện tại và xem nó bằng một mô -đun không được ghi lại ở đây, có khả năng mô -đun đã không được chấp nhận để ủng hộ một cái gì đó hiện đại hơn. Chỉ là một ví dụ, Python 3 không có mô -đun Popen2 thường được sử dụng trong Python 2 để khởi chạy các quy trình con. Thay vào đó, bạn nên sử dụng mô -đun phụ.

Nhập khẩu tuyệt đối liên quan đến tổ chức lại thư viện, tất cả các báo cáo nhập khẩu xuất hiện trong các mô hình con của một gói /

_ _init_ _.py spam.py Bar.py

Nếu tệp spam.py sử dụng thanh nhập câu lệnh, bạn sẽ có ngoại lệ nhập khẩu mặc dù Bar.py nằm trong cùng một thư mục. Để tải mô hình con này, Spam.py cần sử dụng nhập foo.bar hoặc nhập gói tương đối chẳng hạn như từ. Thanh nhập khẩu. Điều này khác với Python 2 trong đó nhập luôn kiểm tra thư mục hiện tại cho một trận đấu trước khi chuyển sang kiểm tra các thư mục khác trong sys.path.

To run 2to3 on this program, type “2to3 example.py”. For example: % 2to3 example.py RefactoringTool: Skipping implicit RefactoringTool: Skipping implicit RefactoringTool: Skipping implicit RefactoringTool: Skipping implicit --- example.py [original] +++ example.py [refactored] @@ -1,10 +1,10 @@

fixer: fixer: fixer: fixer:

buffer idioms set_literal ws_comma

F

h Lib

fL

B

d

ff

636

Appendix Python 3

# example.py -import ConfigParser +import configparser -for +for +

i in xrange[10]: print i, 2*i i in range[10]: print[i, 2*i]

def spam[d]: if not d.has_key["spam"]: if "spam" not in d: d["spam"] = load_spam[] return d["spam"] RefactoringTool: Files that need to be modified: RefactoringTool: example.py

+

As output, 2to3 will identify parts of the program that it considers to be problematic and that might need to be changed.These are shown as context-diffs in the output. Although we have used 2to3 on a single file, if you give it the name of a directory, it recursively looks for all Python files contained in the directory structure and generates a report for everything. By default, 2to3 does not actually fix any of the source code it scans—it merely reports parts of the code that might need to be changed. A challenge faced by 2to3 is that it often only has incomplete information. For example, consider the spam[] function in the example code.This function calls a method d.has_key[]. For dictionaries, has_key[] has been removed in favor of the in operator. 2to3 reports this change, but without more information, it is not clear if spam[] is actually manipulating a dictionary or not. It might be the case that d is some other kind of object [a database perhaps] that happens to provide a has_key[] method, but where using the in operator would fail. Another problematic area for 2to3 is in the handling of byte strings and Unicode. Given that Python 2 would automatically promote byte strings to Unicode, it is somewhat common to see code that carelessly mixes the two string types together. Unfortunately, 2to3 is unable to sort all of this out.This is one reason why it’s important to have good unit test coverage. Of course, all of this depends on the application. As an option, 2to3 can be instructed to fix selected incompatibilities. First, a list of “fixers” can be obtained by typing 2to3 -l. For example: % 2to3 -l Available transformations for the -f/--fix option: apply basestring buffer callable ... ... xrange xreadlines zip

Using names from this list, you can see what a selected fix would actually change by simply typing “2to3 -f fixname filename”. If you want to apply multiple fixes, just specify each one with a separate -f option. If you actually want to apply the fix to a source file, add the -w option as in 2to3 -f fixname -w filename. Here is an example:

F

h Lib

fL

B

d

ff

Code Migration and 2to3

637

% 2to3 -f xrange -w example.py --- example.py [original] +++ example.py [refactored] @@ -1,7 +1,7 @@ # example.py import ConfigParser -for i in xrange[10]: +for i in range[10]: print i, 2*i def spam[d]: RefactoringTool: Files that were modified: RefactoringTool: example.py

If you look at example.py after this operation, you will find that xrange[] has been changed to range[] and that no other changes have been made. A backup of the original example.py file is found in example.py.bak. A counterpart to the -f option is the -x option. If you use 2to3 -x fixname filename, it will run all of the fixers except for the ones you listed with the -x option. Although it is possible to instruct 2to3 to fix everything and to overwrite all of your files, this is probably something best avoided in practice. Keep in mind that code translation is an inexact science and that 2to3 is not always going to do the “right thing.” It is always better to approach code migration in a methodical calculated manner as opposed to crossing your fingers and hoping that it all just magically “works.” 2to3 has a couple of additional options that may be useful.The -v option enables a verbose mode that prints additional information that might be useful for debugging. The -p option tells 2to3 that you are already using the print statement as a function in your code and that it shouldn’t be converted [enabled by the from _ _future_ _ import print_statement statement].

A Practical Porting Strategy Here is a practical strategy for porting Python 2 code to Python 3. Again, it is better to approach migration in a methodical manner as opposed to doing everything at once. 1. Make sure your code has an adequate unit testing suite and that all tests pass under Python 2. 2. Port your code and testing suite to Python 2.6 and make sure that all tests still pass. 3. Turn on the -3 option to Python 2.6. Address all warning messages and make sure your program runs and passes all tests without any warning messages. If you’ve done this correctly, chances are that your code will still work with Python 2.5 and maybe even earlier releases.You’re really just cleaning out some of the cruft that’s accumulated in your program. 4. Make a backup of your code [this goes without saying]. 5. Port the unit testing suite to Python 3 and make sure that the testing environment itself is working.The individual unit tests themselves will fail [because you haven’t yet ported any code]. However, a properly written test suite should be able to deal with test failures without having an internal crash of the test software itself.

F

H lib

fl

B

d

ff

638

Phụ lục Python 3

6. Chuyển đổi chương trình thành Python 3 bằng 2to3. Chạy bộ kiểm tra đơn vị trên mã kết quả và khắc phục tất cả các vấn đề phát sinh. Có các chiến lược khác nhau để thực hiện việc này. Nếu bạn cảm thấy may mắn, bạn luôn có thể nói với 2to3 để sửa mọi thứ và xem điều gì sẽ xảy ra. Nếu bạn thận trọng hơn, bạn có thể bắt đầu bằng cách có 2to3 sửa những điều thực sự rõ ràng [in, ngoại trừ các câu lệnh, xrange [], tên mô -đun thư viện, v.v.] và sau đó tiến hành theo cách thức nhiều hơn với các vấn đề còn lại. Vào cuối quá trình này, mã của bạn sẽ vượt qua tất cả các bài kiểm tra đơn vị và hoạt động theo cách tương tự như trước đây. Về lý thuyết, có thể cấu trúc mã theo cách để cả hai chạy trong Python 2.6 và tự động dịch thành Python 3 mà không cần bất kỳ sự can thiệp nào của người dùng. Tuy nhiên, điều này sẽ đòi hỏi phải tuân thủ rất cẩn thận với các quy ước mã hóa Python hiện đại, ít nhất bạn sẽ hoàn toàn cần phải đảm bảo không có cảnh báo nào trong Python 2.6. Nếu quy trình dịch tự động yêu cầu sử dụng 2to3 rất cụ thể [chẳng hạn như chỉ chạy một bộ sửa lỗi được chọn], có lẽ bạn nên viết một tập lệnh shell tự động thực hiện các hoạt động cần thiết thay vì yêu cầu người dùng tự mình chạy 2to3.

Đồng thời Python 2 và Python 3 hỗ trợ một câu hỏi cuối cùng liên quan đến di chuyển Python 3 là liệu có thể có một cơ sở mã duy nhất hoạt động không được sửa đổi trên Python 2 và Python 3. Mặc dù điều này có thể xảy ra trong một số trường hợp, nhưng mã kết quả có gặp rủi ro trở thành một mớ hỗn độn. Chẳng hạn, bạn sẽ phải tránh tất cả các câu lệnh in và đảm bảo tất cả ngoại trừ các điều khoản không bao giờ lấy bất kỳ giá trị ngoại lệ nào [trích xuất chúng từ sys.exc_info [] thay vào đó]. Các tính năng Python khác có thể được thực hiện để làm việc. Ví dụ, do sự khác biệt của cú pháp, không có cách nào khả thi để sử dụng các metaclass theo cách có thể di động giữa Python 2 và Python 3. Do đó, nếu bạn duy trì mã phải hoạt động trên Python 2 và 3, đặt cược tốt nhất của bạn là để đảm bảo mã của bạn sạch nhất có thể và chạy theo Python 2.6, đảm bảo bạn có bộ thử nghiệm đơn vị và cố gắng phát triển một bộ sửa chữa 2to3 để có thể dịch tự động. Một trường hợp có thể có ý nghĩa khi có một cơ sở mã duy nhất là với thử nghiệm đơn vị. Một bộ thử nghiệm hoạt động mà không cần sửa đổi trên Python 2.6 và Python 3 có thể hữu ích trong việc xác minh hành vi chính xác của ứng dụng sau khi được dịch bởi 2to3.

Tham gia như một dự án nguồn mở, Python tiếp tục được phát triển với những đóng góp của người dùng. Đối với Python 3, đặc biệt, rất quan trọng để báo cáo các lỗi, vấn đề hiệu suất và các vấn đề khác. Để báo cáo một lỗi, hãy truy cập //bugs.python.org. Don Tiết là người nhút nhát, phản hồi của bạn làm cho Python tốt hơn cho mọi người.

F

H lib

fl

B

d

ff

Phụ lục Python 3

6. Chuyển đổi chương trình thành Python 3 bằng 2to3. Chạy bộ kiểm tra đơn vị trên mã kết quả và khắc phục tất cả các vấn đề phát sinh. Có các chiến lược khác nhau để thực hiện việc này. Nếu bạn cảm thấy may mắn, bạn luôn có thể nói với 2to3 để sửa mọi thứ và xem điều gì sẽ xảy ra. Nếu bạn thận trọng hơn, bạn có thể bắt đầu bằng cách có 2to3 sửa những điều thực sự rõ ràng [in, ngoại trừ các câu lệnh, xrange [], tên mô -đun thư viện, v.v.] và sau đó tiến hành theo cách thức nhiều hơn với các vấn đề còn lại. Vào cuối quá trình này, mã của bạn sẽ vượt qua tất cả các bài kiểm tra đơn vị và hoạt động theo cách tương tự như trước đây. Về lý thuyết, có thể cấu trúc mã theo cách để cả hai chạy trong Python 2.6 và tự động dịch thành Python 3 mà không cần bất kỳ sự can thiệp nào của người dùng. Tuy nhiên, điều này sẽ đòi hỏi phải tuân thủ rất cẩn thận với các quy ước mã hóa Python hiện đại, ít nhất bạn sẽ hoàn toàn cần phải đảm bảo không có cảnh báo nào trong Python 2.6. Nếu quy trình dịch tự động yêu cầu sử dụng 2to3 rất cụ thể [chẳng hạn như chỉ chạy một bộ sửa lỗi được chọn], có lẽ bạn nên viết một tập lệnh shell tự động thực hiện các hoạt động cần thiết thay vì yêu cầu người dùng tự mình chạy 2to3.

Đồng thời Python 2 và Python 3 hỗ trợ một câu hỏi cuối cùng liên quan đến di chuyển Python 3 là liệu có thể có một cơ sở mã duy nhất hoạt động không được sửa đổi trên Python 2 và Python 3. Mặc dù điều này có thể xảy ra trong một số trường hợp, nhưng mã kết quả có gặp rủi ro trở thành một mớ hỗn độn. Chẳng hạn, bạn sẽ phải tránh tất cả các câu lệnh in và đảm bảo tất cả ngoại trừ các điều khoản không bao giờ lấy bất kỳ giá trị ngoại lệ nào [trích xuất chúng từ sys.exc_info [] thay vào đó]. Các tính năng Python khác có thể được thực hiện để làm việc. Ví dụ, do sự khác biệt của cú pháp, không có cách nào khả thi để sử dụng các metaclass theo cách có thể di động giữa Python 2 và Python 3. Do đó, nếu bạn duy trì mã phải hoạt động trên Python 2 và 3, đặt cược tốt nhất của bạn là để đảm bảo mã của bạn sạch nhất có thể và chạy theo Python 2.6, đảm bảo bạn có bộ thử nghiệm đơn vị và cố gắng phát triển một bộ sửa chữa 2to3 để có thể dịch tự động. Một trường hợp có thể có ý nghĩa khi có một cơ sở mã duy nhất là với thử nghiệm đơn vị. Một bộ thử nghiệm hoạt động mà không cần sửa đổi trên Python 2.6 và Python 3 có thể hữu ích trong việc xác minh hành vi chính xác của ứng dụng sau khi được dịch bởi 2to3.

Tham gia như một dự án nguồn mở, Python tiếp tục được phát triển với những đóng góp của người dùng. Đối với Python 3, đặc biệt, rất quan trọng để báo cáo các lỗi, vấn đề hiệu suất và các vấn đề khác. Để báo cáo một lỗi, hãy truy cập //bugs.python.org. Don Tiết là người nhút nhát, phản hồi của bạn làm cho Python tốt hơn cho mọi người.

Biểu tượng và số chỉ mục! Lệnh gỡ lỗi, mô -đun PDB, 187! = Không bằng toán tử, 66 'trích dẫn đơn, 11, 27' '' trích dẫn ba, 11, 27 trích dẫn đôi, 11, 27. 6, 26 #! Trong các tập lệnh Unix Shell, 6, 176

Viết lại trên cài đặt gói, toán tử modulo 153 %, toán tử định dạng chuỗi 65 %, 8, 70, 162 % = Toán tử, 75 & toán tử bitwise-and và toán tử, 65 & đặt toán tử giao nhau, 15, 75

+ Toán tử bổ sung, toán tử kết hợp 65 + Danh sách, toán tử nối 12 + trình tự, toán tử 67 + chuỗi, toán tử 11 + unary Plus, 65 + = toán tử, 75 - ký tự Hyphen, được sử dụng làm tệp, 174 - Toán tử khác biệt, 15, 15, 15, 15, 15, 15, 15 75 - toán tử trừ, 65 - toán tử trừ, 65 -* - mã hóa: nhận xét, trong mã nguồn, 31 - = toán tử, 75. Toán tử liên kết thuộc tính, 33, 48, 76, 118

và các mô -đun, 51 phương pháp đặc biệt cho, 57

& = toán tử, 75

. Tài liệu tham khảo thư mục trong các báo cáo nhập khẩu tương đối, 150

[] Toán tử gọi chức năng, 76

... Ellipsis, 30, 54, 59

[] tuple, 14, 29

... Lời nhắc phiên dịch, 175

* Từ khóa chỉ đối số, Python 3, 625

/ nhà điều hành bộ phận, 65

* Toán tử nhân, 65

// Nhà điều hành bộ phận cắt ngắn, 65

* Truyền trình tự dưới dạng đối số chức năng, 94

// = toán tử, 75

* Toán tử sao chép trình tự, 67

/= Toán tử, 75: Đại tràng trong các nhà xác định định dạng chuỗi, 72

* Đối số biến trong định nghĩa chức năng, 94

; Bán kết, 7, 26

* Wildcard

>> toán tử thay đổi đúng, 65

Lệnh gỡ lỗi [ARGS], Mô -đun PDB, 187

>> = Nhà điều hành, 75 >>> Lời nhắc phiên dịch, 5, 175

hàm a2b_base64 [], mô -đun Binascii, 547

@ Trang trí, 30, 101

hàm a2b_hex [], mô -đun Binascii, 548

[::] Toán tử cắt kéo dài, 39-40, 67-68

hàm a2b_hqx [], mô -đun Binascii, 548

[:] Người vận hành cắt lát, 39-40, 67-68

hàm a2b_uu [], mô -đun Binascii, 547

[] toán tử lập chỉ mục, 39-40, 67

Mô -đun ABC, 136, 257

và các phương thức đặc biệt, 58 trên ánh xạ, 45 trên chuỗi, 68 [] Danh sách, 12, 29 \ ký tự tiếp tục dòng, 9, 25, 29 \ mã thoát chuỗi, toán tử 27 ^ bitwise , 73 ^ Đặt toán tử khác biệt đối xứng, 15, 75 ^ = toán tử, 75 _ biến, chế độ tương tác, 6, 176 {} dict, 16, 29 {} trình giữ chỗ trong các chuỗi định dạng, 72 {} Đặt chữ, Python 3, 622 | Nhà điều hành BitWise-OR, 65 | Thiết lập toán tử công đoàn, 15, 75 | = toán tử, 75 ~ toán tử bitwise-negation, 65 ~ Mở rộng thư mục nhà của người dùng trong tên tệp, 397 $ biến trong chuỗi, 72 0b Số nguyên nhị phân, 27 , 27 2 bổ sung và số nguyên, công cụ 66 2to3, 635-637

Hạn chế của, tùy chọn dòng lệnh 636 -3, 173, 635

ABCMETA Metaclass, 136, 257 Hàm ABORT [], Mô -đun HĐH, Phương pháp ABORT [] 390, của các đối tượng FTP, hàm 497 abs [], 66, 201

Mô -đun toán tử, phương thức 273 _ _abs_ _ [], 61 nhập khẩu tuyệt đối, 151

Python 3, 634 so với nhập khẩu tương đối, 151 giá trị tuyệt đối, hàm 66 abspath [], mô -đun OS.PATH, 396 Lớp cơ sở trừu tượng, 34, 136, 257

Các phương thức gọi trong các lớp con, 137 kiểm tra được thực hiện, 137 đối tượng container, 265 lỗi nếu được khởi tạo, 137 ví dụ, 258 tệp và I/O, 354 loại số, 253 lớp đăng ký trước, 137 phương pháp đặc biệt cho, -137, 257-258 _ _BSTRACTMETHODS_ _ thuộc tính, của các loại, 50 @abstractproperty, 136-137, 257-258 Phương thức

của các đối tượng người nghe, 433 đối tượng điều phối, 456 đối tượng ổ cắm, 478 ACCKET2DYEAR Biến, mô -đun thời gian, 405 Bộ điều khiển kiểm soát truy cập, thiếu, 127

F

H lib

fl

B

d

ff

% Appdata% biến môi trường, windows

641

hàm acos [], mô -đun toán học, 251

hàm addlevelName [], mô -đun ghi nhật ký, 366

hàm acosh [], mô -đun toán học, 251

thuộc tính địa chỉ

Hàm Access [], Mô -đun HĐH, 386

Phương thức có được []

của của của

Đối tượng điều kiện, 441 đối tượng khóa, 438 đối tượng rlock, 438 đối tượng semaphore, 439

của các đối tượng Basemanager, 431 đối tượng người nghe, 433 họ địa chỉ, của ổ cắm, thuộc tính 470 địa chỉ_F

Phương thức kích hoạt [], của lớp socketserver, 493

Địa chỉ, mạng, 471

Hàm Active_children [], Mô -đun đa xử lý, 434

Chuỗi liền kề theo nghĩa đen, sự kết hợp của, 27

hàm active_count [], mô -đun luồng, 443

Định dạng chuỗi nâng cao, 8, 42, 72

ActivePython, 5 add [] hàm, mô -đun toán tử, phương thức 273 add []

của các đối tượng Tarfile, 320 của các bộ, 15, 46 _ _add_ _ [] Phương thức, 60 add_data [] phương thức, của các đối tượng yêu cầu

của các đối tượng tin nhắn, 555 đối tượng yêu cầu, phương thức 516 add_option [], của các đối tượng OptionParser, phương thức 158, 375 add_password [], của các đối tượng AuthHandler, 519

Địa chỉ [] hàm, mô -đun CTYPES, hàm 617 adler32 [], mô -đun zlib, hằng số 328 AF_*, mô -đun ổ cắm, mô -đun AIFC 470, 588 AIO_* họ của các cuộc gọi hệ thống, thiếu, 469 chức năng, mô -đun tín hiệu, 399 báo động, lệnh 399 Bí danh, mô -đun PDB, hàm 187 liên kết [], mô -đun CTYPES, 617 _ _all_ _ biến

và các câu lệnh nhập, 145 trong các gói, hàm 150 tất cả [], 40, 67, 201 allow_reuse_address thuộc tính của lớp socketserver, biến 492 altsep, mô -đun hệ điều hành, 386

Phương thức add_section [], của các đối tượng ConfigParser, 332

Biến Altzone, Mô -đun thời gian, 405

hàm add_type [], mô -đun mô phỏng, 567

and_ [] chức năng, mô -đun toán tử, 274

add_unredirected_header [] Phương thức, của các đối tượng yêu cầu, phương thức 517 addFile [], của các đối tượng tarfile, phương thức addFilter [] 320

của các đối tượng xử lý, 364 đối tượng logger, phương thức 359 addHandler [], của các đối tượng logger, toán tử bổ sung 361 +, 65

và toán tử, các biểu thức boolean, 9, 77 _ _and_ _ [], phương thức 60 _ _annotation 229 % appdata % biến môi trường, windows, 177

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

% Appdata% biến môi trường, windows

642

% Appdata% biến môi trường, windows

của của của

Đối tượng điều kiện, 441 đối tượng khóa, 438 đối tượng rlock, 438 đối tượng semaphore, 439

Biến ASCII_Letters, Mô -đun chuỗi, biến ASCII_LowerCase, mô -đun chuỗi, biến ASCII_uppercase, mô -đun chuỗi, 287

Phương thức phụ lục [], của các đối tượng nút dom, 571

hàm asctime [], mô -đun thời gian, 405

Phương thức phụ lục [], của các đối tượng deque, 262

hàm asinh [], mô -đun toán học, 251

Ghi nhật ký ứng dụng, 355

Tuyên bố khẳng định, 91

Ứng dụng, WSGI, 540

Phương pháp ASSERT_ [], của các đối tượng TestCase, 185

Đánh giá đơn đặt hàng, 76

Phương thức AssertalAqual [], của các đối tượng TestCase, 185

Ứng dụng [] Phương thức, của các đối tượng Pool, Phương thức 424 ỨNG DỤNG_ASYNC [], của các đối tượng Pool, 424 ARGS thuộc tính

của các đối tượng ngoại lệ, 213 trường hợp ngoại lệ, 88 đối tượng một phần, 268

hàm asin [], mô -đun toán học, 251

Phương thức AsserTequal [], của các đối tượng TestCase, ngoại lệ 185 Ass AsserRor, 87, 91, 213 xác nhận, 91

Tỷ lệ với tùy chọn -o, 148

Thuộc tính Argtypes, của các đối tượng chức năng CTYPES, 613

Phương thức AssertNotalAqual [], của các đối tượng TestCase, 185

Biến Argv, Mô -đun SYS, 13, 157, 174, 229

Phương thức AssertNoteQual [], của các đối tượng TestCase, 185

Exception arithmeticerror, 87, 212

Phương thức AssertRaises [], của các đối tượng TestCase, 185

Mô -đun mảng, hàm 259 mảng [], mô -đun đa xử lý, phương thức 426 mảng [], của các đối tượng trình quản lý, hàm 428 mảng [], mô -đun mảng, 259 mảng, tạo từ loại đồng nhất

của của của

Ngoại trừ Tuyên bố, 22, 85 Tuyên bố từ nhập, 145 Tuyên bố nhập, 24, 144 với Tuyên bố, 62, 90

phân công

và đếm tham chiếu, 34 toán tử, 61 toán tử tại chỗ, 61 thuộc tính thể hiện, 131 biến, 7 đến các biến trong các hàm lồng nhau, 97 mảng liên kết, 16, 44 kết hợp của các toán tử, 78 phương thức Astimezone [], của các đối tượng dữ liệu, của các đối tượng dữ liệu, Lớp 340 Asynchat, mô -đun không đồng bộ, 452

Phương thức AS_Integer_Ratio [], của điểm nổi, 39

Mô -đun không đồng bộ, 452

Phương thức AS_String [], của các đối tượng tin nhắn, 555

I/O không đồng bộ, 415

Mã hóa ASCII, mô tả, 169

Mạng không đồng bộ

hàm ascii [], 201

và Python 3, 201 Future_builtins Module, 217 ASCII và khả năng tương thích với UTF-8, 170

Sử dụng, 467

và chặn các hoạt động, 469 khi nào nên xem xét, mô -đun không đồng bộ 467, 415, 455

Sử dụng, 467 đối tượng không đồng bộ, mô -đun đa xử lý, 425

F

H lib

fl

B

d

ff

Lớp baseproxy, mô -đun đa bộ xử lý

B

d

643

ff

Lớp baseproxy, mô -đun đa bộ xử lý

hàm atan [], mô -đun toán học, hàm 251 atan2 [], mô -đun toán học, hàm 251 atanh [], mô -đun toán học, mô -đun 251 atexit, 179, 219

-B Tùy chọn dòng lệnh, ký tự 173 b, trước một chuỗi theo nghĩa đen, 29

Hoạt động nguyên tử, tháo gỡ, 193

B [REAK] Lệnh gỡ lỗi, Mô -đun PDB, 187

đính kèm [] phương thức, của các đối tượng tin nhắn, 556

hàm b16decode [], mô -đun base64, 547

hàm agrgetter [], mô -đun vận hành, 275

hàm b16encode [], mô -đun base64, 547

Thuộc tính Attrid, của các đối tượng phần tử, gán thuộc tính 576, trên các trường hợp, 131

hàm b2a_base64 [], mô -đun Binascii, 547

Toán tử liên kết thuộc tính., 33, 76

hàm b2a_hex [], mô -đun Binascii, 548

Tối ưu hóa, 196 ràng buộc thuộc tính

và kế thừa, 119 và phương pháp, 48 trường hợp và lớp, 118 đối tượng do người dùng xác định

Hàm B2A_HQX [], Mô -đun Binascii, hàm 548 B2A_UU [], Mô -đun Binascii, Chức năng 547 B32Decode [] Mô -đun Base64, 546 Quy tắc ngược và chuỗi RAW, Xử lý lỗi 29 'Backslashreplace', Mã hóa Unicode, 166

Tra cứu thuộc tính ở định dạng chuỗi, 72

Ngoại lệ Badstatusline, mô -đun http.client, 504

ExculuteError Exception, 87, 213

lớp cơ sở, 21

và liên kết thuộc tính, 132 thuộc tính thuộc tính, của các đối tượng nút DOM, 570 thuộc tính

Lệnh AWK Unix, sự tương đồng với danh sách toàn diện, 111

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

644

Lớp cơ bản

Lớp cơ bản

Toán tử bitwise-digation ~, 65

_ _base_ _ thuộc tính

Toán tử bitwise-xor ^, 65

của các lớp, 131 loại, 50 biến Basestring, 202

toán tử bitwise-or |, 65 dòng trống, thuộc tính 26 block_size, của các đối tượng tiêu hóa, 559

hàm basicconfig [], mô -đun ghi nhật ký, 355

chặn các hoạt động và mạng không đồng bộ, 469

Biến BasicContext, Mô -đun thập phân, 248

Giao thức Bluetooth, 470

.bat Tệp, Windows, 176

Bom [đánh dấu đơn hàng byte], 280

Mô -đun BDB, 585

Định dạng địa chỉ, 472 và Unicode, 168

Gói súp đẹp, 563

Bom_* hằng số, mô -đun codec, 280

hàm betavariate [], mô -đun ngẫu nhiên, 255

loại bool, 38

hàm hai chiều [], mô -đun unicodedata, 293

hàm bool [], 202

Định dạng endian lớn, 167 endian lớn, đóng gói và giải nén, chức năng 292 bin [], 77, 202 cấu trúc dữ liệu nhị phân, đóng gói và giải nén, phân phối nhị phân 290, tạo với distutils, 153 chế độ tệp nhị phân, 159 tệp nhị phân, 350

I/O được đệm, 351 thận trọng về việc sử dụng các chức năng định hướng dòng, 351-352

Phương pháp _ _bool_ _ [], 56, 58 Biểu thức Boolean, 9, 77

Quy tắc đánh giá, 78 toán tử boolean, 66 giá trị boolean, 27, 38 chức năng boolean [], mô -đun XMLRPC.Client, phương pháp ràng buộc 525, 49, 125 đối tượng bị ràng buộc

Mô -đun đa xử lý, mô -đun luồng 427, 439

Binary Integer Ltersals, 27

Phương thức bị ràng buộc

Hàm nhị phân []

Tuyên bố phá vỡ, 83-84

API cơ sở dữ liệu, mô -đun 301 xmlrpc.client, mô -đun 526 Binascii, 547 BIND [] Phương thức

của lớp socketserver, 493 đối tượng điều phối, 456 đối tượng ổ cắm, mô -đun 478 BINHEX, mô -đun 587 Bisect, 261 Bisect [] hàm, Mô -đun Bisect, Chức năng 261 Bisect_left [] Các hoạt động bitwise và số nguyên bản địa, 66 bitwise-và nhà điều hành &, 65

và máy phát điện, 103 báo cáo dài trên nhiều dòng, 9 điểm dừng

cài đặt trong trình gỡ lỗi, 187 cài đặt thủ công, 186 trình duyệt, khởi chạy từ Python, 544 BSD, giao diện Kqueue, 460 BTProto_* hằng số, mô -đun ổ cắm, 477 Buffer, vòng tròn, 262 Buffer_info [] , 351 lớp cơ sở trừu tượng Bufferediobase, lớp đệm 354

F

H lib

fl

B

d

ff

Lớp cơ bản

Lớp cơ bản

Toán tử bitwise-digation ~, 65

_ _base_ _ thuộc tính

Toán tử bitwise-xor ^, 65

của các lớp, 131 loại, 50 biến Basestring, 202

toán tử bitwise-or |, 65 dòng trống, thuộc tính 26 block_size, của các đối tượng tiêu hóa, 559

645

hàm basicconfig [], mô -đun ghi nhật ký, 355

chặn các hoạt động và mạng không đồng bộ, 469

Biến BasicContext, Mô -đun thập phân, 248

Giao thức Bluetooth, 470

.bat Tệp, Windows, 176

Bom [đánh dấu đơn hàng byte], 280

Mô -đun BDB, 585

Định dạng địa chỉ, 472 và Unicode, 168

Gói súp đẹp, 563

Phương thức _CallMethod [], của các đối tượng BaseProxy, 433

Hàm bz2decompressor [], mô -đun BZ2, 314

Phương thức CallProc [], của các đối tượng con trỏ, 298

Hàm bz2file [], mô -đun BZ2, 313

Hủy [] phương thức, của các đối tượng hẹn giờ, 438

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

646

Phương thức hủy_join_thread [], của các đối tượng hàng đợi

Phương thức hủy_join_thread [], của các đối tượng hàng đợi, 418

so sánh chuỗi, 66

Exception không thể, mô -đun http.client, 504

Thay đổi hiển thị kết quả, chế độ tương tác, 176

Không thể điều chỉnh ngoại lệ, mô -đun http.client, 504

Thay đổi tên mô -đun khi nhập, 144

Phương pháp viết hoa [], của chuỗi, 41-42

Các trường hợp ngoại lệ, Python 3, 627

Thay đổi thư mục làm việc, 379

Thuộc tính thủ đô, của các đối tượng bối cảnh, 247

Thay đổi tiêu đề tác nhân người dùng trong các yêu cầu HTTP, 517

hàm capwords [], mô -đun chuỗi, 290

Thay thế nhân vật, 42

Chuyển đổi trường hợp, của chuỗi, độ nhạy của trường hợp 43-44, của số nhận dạng, 26

Phương thức ký tự [], của các đối tượng ContentHandler, 581

Tuyên bố trường hợp, thiếu, 9

nhân vật

Hàm Cast [], Mô -đun CTYPES, 617 bắt tất cả các ngoại lệ, 85

Mã thoát hiểm, 28 chỉ định Unicode, 28

Bắt nhiều trường hợp ngoại lệ, 85

hàm chdir [], mô -đun hệ điều hành, 379

Danh mục [] hàm, mô -đun unicodedata, 170, 293

Check_call [] hàm, mô -đun phụ, 403

_ _cause_ _ thuộc tính, của các đối tượng ngoại lệ, 213, 627

Phương thức Check_unuse_args [], của các đối tượng định dạng, 289

THẬN TRỌNG VỚI RANGE [] hàm, 17

Kiểm tra xem có chạy như chương trình chính không, 146

Hàm cdll [], mô -đun ctypes, 612

Kiểm tra nhiều trường hợp với một điều kiện, 9

Hàm CLE [], Mô-đun toán học, Phương thức 251 Trung tâm [], của Chuỗi, hàm 41-42 cert_time_to_seconds [], mô-đun SSL, tập lệnh 488 CGI, 533

Lời khuyên viết, 537 Biến môi trường, 533 Thực hiện máy chủ XML-RPC trong, 529 ứng dụng WSGI đang chạy, 542 Sử dụng cơ sở dữ liệu, 538 Frameworks, 538 CGI Module, 533 CGIHandler [] Mô -đun .Server, mô -đun 507 cgihttpserver, xem http.server, mô -đun 506 cGITB, 539 cgixmlr

Chức năng của Chflags [], Mô -đun HĐH, 386 Gà, đa luồng, 414 thuộc tính trẻ con, của các đối tượng nút dom, hàm 570 chmod [], mô -đun OS, chức năng 387 [] hàm chr [], hàm 77, 203 chroot [], mô -đun hệ điều hành, mô -đun chunk 379, phương pháp 588 mật mã [], của các đối tượng SSL, 487 bộ đệm tròn hoặc hàng đợi với các đối tượng deque, lệnh gỡ lỗi 262 cl [tai] 188 người trang trí lớp, 102, 141 Phương pháp lớp, 48, 123

Liên kết thuộc tính của, 124 Sử dụng thực tế, 124 Tuyên bố lớp, 21, 117

và thừa kế, 21, 119 thực hiện cơ thể lớp, 138

F

H lib

fl

B

d

ff

Phương thức hủy_join_thread [], của các đối tượng hàng đợi

Phương thức hủy_join_thread [], của các đối tượng hàng đợi, 418

so sánh chuỗi, 66

Exception không thể, mô -đun http.client, 504

Thay đổi hiển thị kết quả, chế độ tương tác, 176

647

Không thể điều chỉnh ngoại lệ, mô -đun http.client, 504

Thay đổi tên mô -đun khi nhập, 144

Phương pháp viết hoa [], của chuỗi, 41-42

Các trường hợp ngoại lệ, Python 3, 627

Thay đổi thư mục làm việc, 379

của các đối tượng BaseHttprequestHandler, 509 đối tượng cơ bản

của của của của của của của của

Đối tượng kết nối, 297, 421 đối tượng con trỏ, đối tượng 298 FTP, đối tượng 498 HTMLPARSER, đối tượng 561 HTTPConnection, 503 đối tượng xử lý, 364

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

648

đóng [] phương thức

của các đối tượng IOBase, 349 đối tượng người nghe, 434 đối tượng hồ bơi, 424 đối tượng hàng đợi, 418 đối tượng Tarfile, 320 đối tượng TreeBuilder, 577 đối tượng Zipfile, 325 đối tượng cơ sở dữ liệu theo kiểu DBM, 310 đối tượng máy quay , 159 của các máy phát, 20, 53, 103, 105 máy phát điện và đồng bộ hóa, 104 đối tượng MMAP, 371 đối tượng kệ, 311 đối tượng ổ cắm, 478 đối tượng urlopen, 515 Đóng_when_done []

của các đối tượng iobase, 349 tệp, 161

Đối tượng mã, 51

Các thuộc tính của, 51 Tạo với hàm compile [], 115 điểm mã, unicode, 28 _ _code_ _ thuộc tính, của các hàm, 48 mã, thực thi các chuỗi, lớp 115 CodecInfo, mô -đun codecs, mô -đun Codecs 277, 167, 277

Loại bỏ các codec nén, 280 sử dụng chuỗi byte, 280 thuộc tính Coded_value, của các đối tượng morsel, mô-đun 512 CodeOp, loại 585 CodeType, 51, 237 _ _Coerce_ _ [] Phương pháp hàm, mô -đun GC, hàm 179 thu thập [], mô -đun GC, phương thức 220 colle_incoming_data [], của các đối tượng asynchat, 452

thuộc tính CloseFD, của các đối tượng FileIO, 350

bộ sưu tập, định nghĩa của, 33

tham số CloseFD, chức năng Open [], 159

Mô -đun bộ sưu tập, 138, 262

Chức năng Chiều gần [], Mô -đun WinReg, 408

Mô -đun Màu sắc, 588

hàm gần [], mô -đun hệ điều hành, 382

hàm kết hợp [], mô -đun itertools, 271

Chức năng đóng [], Mô-đun bối cảnh, thuộc tính 268 _ _ _ _ _, của các hàm, 48, 100 đóng cửa, 98-99

và các trình trang trí, 101 và các chức năng lồng nhau, 99 và bao bọc, 100 tốc độ so với các lớp, mô -đun 100 cmath, mô -đun 251 cmd, chức năng 588 cmp [], 203

Mô -đun Filecmp, 314

Phương thức kết hợp [], của lớp DateTime, hàm 339 kết hợp [], mô -đun unicodedata, thuộc tính lệnh 294, của các đối tượng BaseHttprequestHandler, 509 Tùy chọn dòng lệnh, 13, 157

Python 3, 633 Phát hiện cài đặt trong một chương trình, 230 cho phiên dịch viên, 173 phân tích cú pháp với OptParse, 374

hàm cmpfiles [], mô -đun filecmp, 314

Lệnh lệnh gỡ lỗi, mô -đun PDB, 188

các thuộc tính Co_*, của các đối tượng mã, 51-52

Mô -đun lệnh, 331

thực thi mã, trong các mô-đun, 143-144

Thuộc tính bình luận, của các đối tượng Zipinfo, 327

Di chuyển mã

Nhận xét [] Hàm, mô -đun xml.etree.elementtree, 575

Python 2 đến 3, 634 Chiến lược thực tế cho, mô -đun mã 637, 585

Nhận xét, 6, 26 cam kết [] phương thức, của các đối tượng kết nối, 298

F

H lib

fl

B

d

ff

đóng [] phương thức

của các đối tượng IOBase, 349 đối tượng người nghe, 434 đối tượng hồ bơi, 424 đối tượng hàng đợi, 418 đối tượng Tarfile, 320 đối tượng TreeBuilder, 577 đối tượng Zipfile, 325 đối tượng cơ sở dữ liệu theo kiểu DBM, 310 đối tượng máy quay , 159 của các máy phát, 20, 53, 103, 105 máy phát điện và đồng bộ hóa, 104 đối tượng MMAP, 371 đối tượng kệ, 311 đối tượng ổ cắm, 478 đối tượng urlopen, 515 Đóng_when_done []

649

của các đối tượng iobase, 349 tệp, 161

Đối tượng mã, 51

Các thuộc tính của, 51 Tạo với hàm compile [], 115 điểm mã, unicode, 28 _ _code_ _ thuộc tính, của các hàm, 48 mã, thực thi các chuỗi, lớp 115 CodecInfo, mô -đun codecs, mô -đun Codecs 277, 167, 277

Loại bỏ các codec nén, 280 sử dụng chuỗi byte, 280 thuộc tính Coded_value, của các đối tượng morsel, mô-đun 512 CodeOp, loại 585 CodeType, 51, 237 _ _Coerce_ _ [] Phương pháp hàm, mô -đun GC, hàm 179 thu thập [], mô -đun GC, phương thức 220 colle_incoming_data [], của các đối tượng asynchat, 452

thuộc tính CloseFD, của các đối tượng FileIO, 350

bộ sưu tập, định nghĩa của, 33

tham số CloseFD, chức năng Open [], 159

Mô -đun bộ sưu tập, 138, 262

Chức năng Chiều gần [], Mô -đun WinReg, 408

Mô -đun Màu sắc, 588

hàm gần [], mô -đun hệ điều hành, 382

hàm kết hợp [], mô -đun itertools, 271

Chức năng đóng [], Mô-đun bối cảnh, thuộc tính 268 _ _ _ _ _, của các hàm, 48, 100 đóng cửa, 98-99

và các trình trang trí, 101 và các chức năng lồng nhau, 99 và bao bọc, 100 tốc độ so với các lớp, mô -đun 100 cmath, mô -đun 251 cmd, chức năng 588 cmp [], 203

Mô -đun Filecmp, 314

Phương thức kết hợp [], của lớp DateTime, hàm 339 kết hợp [], mô -đun unicodedata, thuộc tính lệnh 294, của các đối tượng BaseHttprequestHandler, 509 Tùy chọn dòng lệnh, 13, 157

Python 3, 633 Phát hiện cài đặt trong một chương trình, 230 cho phiên dịch viên, 173 phân tích cú pháp với OptParse, 374

hàm cmpfiles [], mô -đun filecmp, 314

Lệnh lệnh gỡ lỗi, mô -đun PDB, 188

các thuộc tính Co_*, của các đối tượng mã, 51-52

Mô -đun lệnh, 331

thực thi mã, trong các mô-đun, 143-144

Thuộc tính bình luận, của các đối tượng Zipinfo, 327

Di chuyển mã

Nhận xét [] Hàm, mô -đun xml.etree.elementtree, 575

Python 2 đến 3, 634 Chiến lược thực tế cho, mô -đun mã 637, 585

và _ _format_ _ [], 56 và tra cứu, 42 hàm nén []

Mô -đun BZ2, mô -đun 314 ZLIB, 328

Mô -đun đa xử lý, mô -đun luồng 427, lệnh trình gỡ lỗi điều kiện 441, Mô -đun PDB, biến điều kiện 188, Phương thức 441 điều kiện [], của đối tượng trình quản lý, 429 Biểu thức điều kiện, 79 điều kiện, 9, 81 Lớp cấu hình, mô -đun Cấu hình, 332

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Mô -đun ConfigParser

650

Mô -đun ConfigParser, Tệp cấu hình 332, 332

Sự khác biệt so với tập lệnh Python, 334-335 cho mô-đun ghi nhật ký, thay thế biến số 368, 335

Khóa, 442 lồng nhau, 267 _ _context_ _ thuộc tính, của các đối tượng ngoại lệ, mô -đun bối cảnh 213, 627, 90, 267

hàm confstr [], mô -đun hệ điều hành, 395

@contextmanager trang trí, 90

Phương thức liên hợp []

Tiếp tục tuyên bố, 83-84

của các số phức, 39 điểm nổi, 39 hàm kết nối []

API cơ sở dữ liệu, mô -đun 297 SQLite3, phương thức 304 Connect []

của của của của của của của của

Các đối tượng Basemanager, đối tượng 431 FTP, đối tượng 498 HTTPConnection, 503 đối tượng SMTP, 514 đối tượng điều phối, 456 đối tượng ổ cắm, 478

Phương thức kết nối_ex [], của các đối tượng ổ cắm, 478 quá trình kết nối, mô -đun đa xử lý, lớp kết nối 433

API cơ sở dữ liệu, mô -đun 297 SQLITE3, hàm 305 Connectologistry [], Mô -đun WinReg, Cửa sổ điều khiển 408, Windows, Lớp cơ sở trừu tượng 176 Container, 265 đối tượng container, 29

và Đếm tham chiếu, 34 Định nghĩa về, 33 Kiểm tra ngăn chặn, trong toán tử, 9 chứa [] hàm, Mô -đun toán tử, 274 _ _Contains_ _ [] Phương thức, 58 Lớp contenthandler, mô -đun XML.SAX, 581 OffictoShort, urllib.Error Module, 523 Lớp ngữ cảnh, mô -đun thập phân, 244

Các ký tự điều khiển, tước từ một chuỗi, 42 chuyển đổi chuỗi thành số, 11 thao tác chuyển đổi, phương thức 76 convert_field [], của các đối tượng định dạng, 289 chuyển đổi các loại Python thành C, 611 Chuyển đổi từ điển thành danh sách, 16 chuỗi chuyển đổi thành danh sách, 77 Chuyển đổi chuỗi thành một tập hợp, 15 chuỗi chuyển đổi thành một tuple, 77 loại chuyển đổi từ C thành Python, 602 Các loại chuyển đổi từ Python sang C, 597 Mô -đun cookie, xem HTTP.Cookies, 511 Cookieerror Exception, HTTP.Cookies Module, 513 Cookiejar Lớp, mô -đun http.cookiejar, mô -đun 513 cookielib, xem http.cookiejar, 513 cookie

HTTP, 511 URL tìm nạp với hỗ trợ cookie, mô -đun 519 bản sao, 36, 67, 219

Hạn chế của, hàm 220 Sao chép []

Mô -đun sao chép, mô -đun 219 SHOTIL, phương thức 318 Sao chép []

của của của của của của

Đối tượng bối cảnh, 247 dicts, 45 đối tượng tiêu hóa, 559 đối tượng HMAC, 560 bộ, 46

Giao thức quản lý bối cảnh, 62

Chức năng Copy2 [], Mô -đun SHOTIL, 318

Người quản lý bối cảnh, 62, 89

_ _copy_ _ [] phương thức, 220

Mô -đun thập phân, 248 Xác định với Trình tạo, 267

Mô -đun Copy_Reg, 585

F

H lib

fl

B

d

ff

Mô -đun ConfigParser

651

Mô -đun ConfigParser, Tệp cấu hình 332, 332

Sự khác biệt so với tập lệnh Python, 334-335 cho mô-đun ghi nhật ký, thay thế biến số 368, 335

Khóa, 442 lồng nhau, 267 _ _context_ _ thuộc tính, của các đối tượng ngoại lệ, mô -đun bối cảnh 213, 627, 90, 267

hàm confstr [], mô -đun hệ điều hành, 395

@contextmanager trang trí, 90

Phương thức liên hợp []

Tiếp tục tuyên bố, 83-84

của các số phức, 39 điểm nổi, 39 hàm kết nối []

API cơ sở dữ liệu, mô -đun 297 SQLite3, phương thức 304 Connect []

của của của của của của của của

Các đối tượng Basemanager, đối tượng 431 FTP, đối tượng 498 HTTPConnection, 503 đối tượng SMTP, 514 đối tượng điều phối, 456 đối tượng ổ cắm, 478

Phương thức kết nối_ex [], của các đối tượng ổ cắm, 478 quá trình kết nối, mô -đun đa xử lý, lớp kết nối 433

API cơ sở dữ liệu, mô -đun 297 SQLITE3, hàm 305 Connectologistry [], Mô -đun WinReg, Cửa sổ điều khiển 408, Windows, Lớp cơ sở trừu tượng 176 Container, 265 đối tượng container, 29

và Đếm tham chiếu, 34 Định nghĩa về, 33 Kiểm tra ngăn chặn, trong toán tử, 9 chứa [] hàm, Mô -đun toán tử, 274 _ _Contains_ _ [] Phương thức, 58 Lớp contenthandler, mô -đun XML.SAX, 581 OffictoShort, urllib.Error Module, 523 Lớp ngữ cảnh, mô -đun thập phân, 244

Các ký tự điều khiển, tước từ một chuỗi, 42 chuyển đổi chuỗi thành số, 11 thao tác chuyển đổi, phương thức 76 convert_field [], của các đối tượng định dạng, 289 chuyển đổi các loại Python thành C, 611 Chuyển đổi từ điển thành danh sách, 16 chuỗi chuyển đổi thành danh sách, 77 Chuyển đổi chuỗi thành một tập hợp, 15 chuỗi chuyển đổi thành một tuple, 77 loại chuyển đổi từ C thành Python, 602 Các loại chuyển đổi từ Python sang C, 597 Mô -đun cookie, xem HTTP.Cookies, 511 Cookieerror Exception, HTTP.Cookies Module, 513 Cookiejar Lớp, mô -đun http.cookiejar, mô -đun 513 cookielib, xem http.cookiejar, 513 cookie

HTTP, 511 URL tìm nạp với hỗ trợ cookie, mô -đun 519 bản sao, 36, 67, 219

Hạn chế của, hàm 220 Sao chép []

Mô -đun sao chép, mô -đun 219 SHOTIL, phương thức 318 Sao chép []

của của của của của của

Đối tượng bối cảnh, 247 dicts, 45 đối tượng tiêu hóa, 559 đối tượng HMAC, 560 bộ, 46

Giao thức quản lý bối cảnh, 62

Chức năng Copy2 [], Mô -đun SHOTIL, 318

Người quản lý bối cảnh, 62, 89

_ _copy_ _ [] phương thức, 220

Mô -đun thập phân, 248 Xác định với Trình tạo, 267

Mô -đun Copy_Reg, 585

Hàm cos [], mô -đun toán học, 251

thuộc tính create_version, của các đối tượng zipinfo, 327

Hàm Cosh [], Mô -đun toán học, 251

thuộc tính đã tạo, của các đối tượng bản ghi, 359

Đếm [] hàm, mô -đun itertools, 271

Chức năng CreateKey [], Mô -đun WinReg, 408

Phương thức đếm []

Tạo trình cài đặt Windows, 153

của các đối tượng mảng, 260 danh sách, 40 chuỗi, 42

Tạo phân phối nhị phân, 153 Tạo phân phối nguồn, 153 Tạo các định dạng chuỗi tùy chỉnh, 288

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Tạo chương trình

652

Tạo chương trình, 6 Tạo số ngẫu nhiên, 254 Tạo các trường hợp do người dùng xác định, 22 trường hợp tạo, 118

Các bước liên quan, 129 tệp .PYC và .pyo, 148 phần quan trọng, khóa, phương thức 414 quan trọng [], của các đối tượng logger, 357

hàm current_thread [], mô -đun luồng, hàm 443 currentFrame [], mô -đun kiểm tra, 222 Currying và đánh giá chức năng một phần, 76 mô -đun Curses, lớp con trỏ 586, API cơ sở dữ liệu, 298

Mô -đun Crypt, 586

Phương thức con trỏ [], của các đối tượng kết nối, 298

Chức năng băm Crytographic, 559

Phương thức cwd [], của các đối tượng FTP, 498

Dữ liệu CSV, ví dụ về đọc, 14

Chuce [] hàm, mô -đun itertools, 271

Tệp CSV

Chu kỳ, và bộ sưu tập rác, 35

Phân tích cú pháp, chuyển đổi loại 548 của các cột, 37

Cấu trúc dữ liệu theo chu kỳ và phương thức _ _del_ _ [], 129

Mô -đun CSV, 548

D

hàm ctermid [], mô -đun hệ điều hành, hàm 379 ctime [], mô -đun thời gian, phương thức 405 ctime [], của các đối tượng ngày, 337

D [riêng] lệnh gỡ lỗi, mô -đun PDB, 188

Ctrl-C, ngắt bàn phím, 162

thuộc tính daemon

Mô -đun Ctypes, 612

Các loại mảng, 614 kiểu dữ liệu có sẵn, 614 kiểu dữ liệu đúc, 617 tạo chuỗi byte, 617 tạo đối tượng từ bộ đệm, 616 ví dụ về, 618 Tìm mô -đun thư viện, 612 Thư viện chia sẻ, 612 Sao chép bộ nhớ, 617 614 Cài đặt nguyên mẫu chức năng, 613 Dữ liệu được chia sẻ với đa xử lý, 426 loại cấu trúc, 615

của các đối tượng quy trình, 416 đối tượng chủ đề, 436 quy trình daemon

và câu lệnh in, 10 và bộ dữ liệu, 14 câu lệnh in, 162 thuộc tính dữ liệu, của các đối tượng văn bản DO

và từ điển, 16 danh sách và bộ dữ

hàm cunifvariate [], mô -đun ngẫu nhiên, 255

Phương thức [] Phương thức, của các đối tượng TreeBuilder, 577

Biến Curdir, Mô -đun HĐH, 386

API cơ sở dữ liệu, 297

niềng răng xoăn, và từ điển, 16

Giao diện cơ sở dữ liệu, 297

Thời gian hiện tại, có được, hàm 405 _current_frames [], mô -đun SYS, 233

Xử lý luồng dữ liệu và Coroutines, 107

và chủ đề, kết quả cơ sở dữ liệu 302, chuyển đổi thành từ điển, 303

hàm current_process [], mô -đun đa xử lý, 434

F

H lib

fl

B

d

ff

Tạo chương trình

Tạo chương trình, 6 Tạo số ngẫu nhiên, 254 Tạo các trường hợp do người dùng xác định, 22 trường hợp tạo, 118

Các bước liên quan, 129 tệp .PYC và .pyo, 148 phần quan trọng, khóa, phương thức 414 quan trọng [], của các đối tượng logger, 357

hàm current_thread [], mô -đun luồng, hàm 443 currentFrame [], mô -đun kiểm tra, 222 Currying và đánh giá chức năng một phần, 76 mô -đun Curses, lớp con trỏ 586, API cơ sở dữ liệu, 298

Mô -đun Crypt, 586

653

Phương thức con trỏ [], của các đối tượng kết nối, 298

Chức năng băm Crytographic, 559

Phương thức cwd [], của các đối tượng FTP, 498

Dữ liệu CSV, ví dụ về đọc, 14

Chuce [] hàm, mô -đun itertools, 271

Mô -đun BZ2, mô -đun 314 ZLIB, phương thức giải nén 328 []

của các đối tượng BZ2Decompressor, 314 đối tượng giải mã

áp dụng cho các định nghĩa lớp, 102, 141 thuộc tính chức năng sao chép, 269

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

654

trang trí

Chuỗi tài liệu, 102, 113 Ví dụ về, 101 nhiều, 31 lợi ích hiệu suất, 197 vị trí, 30, 101 hàm đệ quy, 102, 113 thuộc tính hàm do người dùng xác định , Sao chép mô -đun, 219

Bộ sưu tập rác, 129, 221-222 Sử dụng, 55 del_param [] Phương thức, của các đối tượng tin nhắn, hàm 556 delattr [], 203

và các thuộc tính riêng tư, 128 _ _delattr_ _ [] Phương thức, 57-58, 131 Đánh giá chậm trễ, 99 Thực thi chậm, sử dụng các luồng, Phương thức Delete [] 437, của các đối tượng FTP, 498

_ _deepCopy_ _ [] Phương pháp, 220

Phương thức _ _delete_ _ [], của các mô tả, 58, 126

Tuyên bố của Def, 18, 48, 93

Chức năng DeleteKey [], Mô -đun WinReg, 409

Mã hóa Unicode mặc định, 166, 177

@Deleter Trang trí tài sản, 126

Chính sách xử lý lỗi Unicode mặc định, 167

Hàm xóaValue [], Mô -đun WinReg, 409

Đối số mặc định, 18, 93

Xóa các mục khỏi từ điển, 16

và các giá trị có thể thay đổi, 94 liên kết của các giá trị, 93 Phương thức mặc định [], của các đối tượng jsonencoder, 566 thuộc tính Default_factory, của các đối tượng DefaultDict, 263

Xóa các mục trình tự, 40 lát xóa, 40, 69 Xóa thuộc tính thể hiện, 131 Delimiters, 30 Delitem [] Hàm, Mô -đun toán tử, 274

Biến DefaultContext, Mô -đun thập phân, 248

_ _delitem_ _ [] Phương pháp, 58-59

Hàm DefaultDict [], Mô -đun bộ sưu tập, 263

hàm delslice [], mô -đun toán tử, 274

thuộc tính _

và các lát, chức năng 59 demo_app [], mô -đun wsgiref.simple_server, thuộc tính mẫu số 542

của các đối tượng phân số, 250 số nguyên, 39

Xác định chức năng, 18

Cảnh báo không thể dùng

Xác định nhiều phương thức tạo thể hiện, 123

đối tượng deque

Xác định ngoại lệ mới, 88

Mô -đun bộ sưu tập, 194 so với danh sách, 194

hàm [] hàm, mô -đun toán học, 251

hàm deque [], mô -đun bộ sưu tập, 262

Nhà điều hành Del, trên từ điển, 16, 74

Hàm der_cert_to_pem_cert [], mô -đun SSL, 488

DEL tuyên bố, 35, 69

và _ _del_ _ [] Phương thức, 129 và lát cắt, 40 mục Xóa ánh xạ, 45 _ _del_ _ [] phương thức, 55, 129

và chấm dứt chương trình, 179 nguy cơ xác định, 129

Thuộc tính dereference, của các đối tượng Tarfile, 320 lớp dẫn xuất, 119 thuộc tính mô tả, của các đối tượng con trỏ, 299 mô tả, 58, 126

và metaclasses, 140 phát hiện kết thúc tệp [EOF], 160

F

H lib

fl

B

d

ff

trang trí

Chuỗi tài liệu, 102, 113 Ví dụ về, 101 nhiều, 31 lợi ích hiệu suất, 197 vị trí, 30, 101 hàm đệ quy, 102, 113 thuộc tính hàm do người dùng xác định , Sao chép mô -đun, 219

Bộ sưu tập rác, 129, 221-222 Sử dụng, 55 del_param [] Phương thức, của các đối tượng tin nhắn, hàm 556 delattr [], 203

và các thuộc tính riêng tư, 128 _ _delattr_ _ [] Phương thức, 57-58, 131 Đánh giá chậm trễ, 99 Thực thi chậm, sử dụng các luồng, Phương thức Delete [] 437, của các đối tượng FTP, 498

_ _deepCopy_ _ [] Phương pháp, 220

Phương thức _ _delete_ _ [], của các mô tả, 58, 126

Tuyên bố của Def, 18, 48, 93

655

Chức năng DeleteKey [], Mô -đun WinReg, 409

Mã hóa Unicode mặc định, 166, 177

ẩn tên thuộc tính trong các lớp, phương thức 128, 204 Dir [], của các đối tượng FTP, Phương thức 498 _ _DIR_ _ [], 63, 128, 204 DIRCMP [] Hàm, Mô -đun FileCmp, 314 thư mục

So sánh, bản sao 314, 318 đọc các tệp với các ký tự đại diện Shell, 317 Traversal đệ quy, 390

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

656

Thư mục

Các hàm hệ thống để truy cập, 386 tạm thời, 323 tên tệp thử nghiệm cho, chức năng 397 dirname [], mô -đun OS.Path, 396 DIS mô -đun, 585 dis [], mô -đun DIS, 193 Lệnh gỡ lỗi, mô -đun PDB, 188 vô hiệu hóa []

Mô -đun GC, mô -đun ghi nhật ký 220, 366 DISABLE_INTERSPERSED_ARGS [] Phương thức, của các đối tượng tùy chọn, 376 Vô hiệu lớp điều phối, mô -đun không đồng bộ, 455 _ _displayhook_ _ biến, mô -đun SYS, hàm 230 displayHook [], mô -đun SYS, 176, 233 thuộc tính xử lý 435 Chương trình phân phối, 152 Mô-đun Distutils, 152-153, 585, 596

và các mô -đun mở rộng, 596 Tạo phân phối nhị phân, 153 tạo tiện ích mở rộng với Swig, hàm 620 Div [], Mô -đun toán tử, 273 _ _DIV_ _ [] Phương pháp 2 so với Python 3, 61 Phân khu, cắt ngắn số nguyên, 61-62, 65 thuộc tính Division_New, của Sys.flags, 230 Division_Warning thuộc tính, của Sys.flags, 230

hàm divmod [], 66, 204 _ _divMod_ _ [] Phương thức, biến DllHandle, mô -đun SYS, 230 DLLS

Tạo với DisTUtils, 596 Mô -đun mở rộng, 148 tải với CTYPE, phương thức 612 do_handshake [], của các đối tượng SSL, 487 _ _DOC_ _ thuộc tính

của của của của của của của của

Các chức năng tích hợp, 49 chức năng, 24, 48, 113 phương pháp, 49 mô-đun, 51 đối tượng, 30 loại, 50

DOCCGIXMLRPCrequestHandler Class, mô-đun XMLRPC.Server, Mô-đun 528 DocTest, 181-182

Tùy chọn Verbose, lớp tài liệu 182, mô -đun XML.DOM.Minidom, Chuỗi tài liệu 571, Sao chép vào Trình trang trí, Chuỗi tài liệu 269, 24, 30, 48, 113

và XML -RPC, 527 và các nhà trang trí, 102, 113 và thụt lề, 30 mô -đun tài liệu, 181 trong các mô -đun mở rộng, 595 tước với tùy chọn -OO, 148 Thử nghiệm, thuộc tính tài liệu 181 Mô-đun, 527 DOCXMLRPCSERVER Mô-đun, thay thế 527 đô la, giao diện 163 DOM

Phân tích cú pháp XML, 568 Ví dụ về, 573 dont_write_bytecode thuộc tính của sys.flags, 230 dont_write_bytecode biến, mô -đun SYS, 230

F

H lib

fl

B

d

ff

Thư mục

Các hàm hệ thống để truy cập, 386 tạm thời, 323 tên tệp thử nghiệm cho, chức năng 397 dirname [], mô -đun OS.Path, 396 DIS mô -đun, 585 dis [], mô -đun DIS, 193 Lệnh gỡ lỗi, mô -đun PDB, 188 vô hiệu hóa []

Mô -đun GC, mô -đun ghi nhật ký 220, 366 DISABLE_INTERSPERSED_ARGS [] Phương thức, của các đối tượng tùy chọn, 376 Vô hiệu lớp điều phối, mô -đun không đồng bộ, 455 _ _displayhook_ _ biến, mô -đun SYS, hàm 230 displayHook [], mô -đun SYS, 176, 233 thuộc tính xử lý 435 Chương trình phân phối, 152 Mô-đun Distutils, 152-153, 585, 596

657

và các mô -đun mở rộng, 596 Tạo phân phối nhị phân, 153 tạo tiện ích mở rộng với Swig, hàm 620 Div [], Mô -đun toán tử, 273 _ _DIV_ _ [] Phương pháp 2 so với Python 3, 61 Phân khu, cắt ngắn số nguyên, 61-62, 65 thuộc tính Division_New, của Sys.flags, 230 Division_Warning thuộc tính, của Sys.flags, 230

hàm divmod [], 66, 204 _ _divMod_ _ [] Phương thức, biến DllHandle, mô -đun SYS, 230 DLLS

Tạo với DisTUtils, 596 Mô -đun mở rộng, 148 tải với CTYPE, phương thức 612 do_handshake [], của các đối tượng SSL, 487 _ _DOC_ _ thuộc tính

của của của của của của của của

Các chức năng tích hợp, 49 chức năng, 24, 48, 113 phương pháp, 49 mô-đun, 51 đối tượng, 30 loại, 50

DOCCGIXMLRPCrequestHandler Class, mô-đun XMLRPC.Server, Mô-đun 528 DocTest, 181-182

Tùy chọn Verbose, lớp tài liệu 182, mô -đun XML.DOM.Minidom, Chuỗi tài liệu 571, Sao chép vào Trình trang trí, Chuỗi tài liệu 269, 24, 30, 48, 113

và XML -RPC, 527 và các nhà trang trí, 102, 113 và thụt lề, 30 mô -đun tài liệu, 181 trong các mô -đun mở rộng, 595 tước với tùy chọn -OO, 148 Thử nghiệm, thuộc tính tài liệu 181 Mô-đun, 527 DOCXMLRPCSERVER Mô-đun, thay thế 527 đô la, giao diện 163 DOM

Phân tích cú pháp XML, 568 Ví dụ về, 573 dont_write_bytecode thuộc tính của sys.flags, 230 dont_write_bytecode biến, mô -đun SYS, 230

Chức năng Bật []

Điểm nổi chính xác gấp đôi, 38 lần nhấp đúp vào các tệp .py, 6 underscores, sử dụng trong số nhận dạng, hàm 26 dropwhile [], mô-đun itertools, phương thức 271 dst []

của các đối tượng thời gian, 338 đối tượng Tzinfo, 342

Function [] hàm, xml.etree.elementtree mô -đun, lớp 575 ElementTree, xml.etree.elementtree mô -đun, 573 giao diện ElementTree, phân tích cú pháp XML, 569 ElementTree, ví dụ, câu lệnh 578 Elif, 9, 81 ellipsis, 30, 51, 51

Gõ vịt, mô -đun Dumbdbm 122, hàm 310 Dump []

Mô -đun JSON, mô -đun Marshal 564, 226 Mô -đun Pickle, 171, 227 xml.etree.elementtree Module, 578 Dump [] Phương thức, của các đối tượng Pickler, 228 Dumps []

Mô -đun JSON, Mô -đun Thống chế 564, 226 Mô -đun Pickle, Module 227 XMLRPC.Client, Chức năng 526 DUP [], Mô -đun HĐH, 382

Biểu thức trong Python 3, 626 Loại, 51 Sử dụng trong cắt kéo dài, 59 Sử dụng trong các phương pháp lập chỉ mục, điều khoản khác

của Tuyên bố thử, 86 của WHER và cho các vòng lặp, 84 câu lệnh khác, 9, 81 tin nhắn email

sáng tác, 555 ví dụ về sáng tác và gửi, 558 ví dụ về gửi, 514 phân tích cú pháp, 552

hàm DUP2 [], mô -đun hệ điều hành, 382

Gói email, 552

liên kết động, của các thuộc tính đối tượng, 122

Thuộc tính Emax, của các đối tượng ngữ cảnh, 247

tải động, của các mô -đun, 144

Nhúng các ký tự Unicode vào các trang web, 167

Phạm vi động, thiếu, 97 gõ động của các biến, 7

Danh sách trống, 12 phương thức trống [], của các đối tượng hàng đợi, 418, 445 Kích hoạt lệnh trình gỡ lỗi, mô -đun PDB, chức năng 188 enable []

Mô -đun CGITB, Mô -đun 539 GC, 220

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

658

enable_callback_traceBacks [] hàm, mô -đun SQLite3

enable_callback_traceBacks [] hàm, mô -đun SQLite3, 305

thuộc tính endpos, của các đối tượng matchObject, 286

enable_interspersed_args [] Phương thức, của các đối tượng tùy chọnParser, 376

Phương thức endPrefixMapping [], của các đối tượng ContentHandler, 581

Kích hoạt hàm in [] trong Python 2.6, 163

Phương thức endswith [], của chuỗi, 42

Đóng gói, 127

Phương thức _ _ENTER_ _ [], của người quản lý ngữ cảnh, 62, 89

hàm mã hóa []

chức năng liệt kê [], 83, 204

Mô -đun Base64, Mô -đun 547 Quopri, Phương thức 568 mã hóa []

Trong Python 3, 629 của các đối tượng codecinfo, 277 đối tượng gia tăng, 278 đối tượng jsonencoder, 566 chuỗi, 42, 165-166 Sử dụng đúng, 166 mẫu mã hóa, mô-đun codec, 279 hàm số

Mô -đun cơ sở64, mô -đun 547 Quopri, 568

Mô -đun luồng, hàm 443 enumkey [], mô -đun WinReg, hàm 409 enumValue [], mô -đun WinReg, biến 409 Môi trường, Mô -đun HĐH, Biến 158 Môi trường, Mô -đun HĐH, 379 biến môi trường, 158, 379

Python 3, 633 WSGI, 540 Mở rộng trong tên tệp, 397 trong tập lệnh CGI, 533 Unding, 381 được sử dụng bởi trình thông dịch

đối số mã hóa để mở hàm [], 159

Chỉ báo EOF, Tệp I/O, 160

thuộc tính mã hóa

Ngoại lệ Eoferror, 87, 213

của các đối tượng textiowrapper, 353 tệp, 161 sự cố mã hóa với lập trình mạng, mã hóa 452, mã nguồn, thuộc tính 31 cuối, của các lát cắt, 54 đối số từ khóa kết thúc, chức năng in []

của các đối tượng MatchObject, 286 của các đối tượng TreeBuilder, phương thức 577 end_headers [], của các đối tượng baseHtt Phương thức Entheaders [], của các đối tượng HTTPConnection, 503

thuộc tính của phần kết, của các đối tượng tin nhắn, giao diện 554 epoll, linux, thuộc tính 460 epsilon, của sys.float_info, chức năng 231 eq [], mô -đun toán tử, phương thức 274 _ _eq_ _ [] So sánh các đối tượng, 34 thuộc tính errcheck, của các đối tượng hàm CTYPES, mô -đun 613 errno, 343 mã lỗi, danh sách lỗi hệ thống, ngoại lệ 344, 396

Mô -đun ổ cắm, 485 Thông báo lỗi, Phương thức 157 [], của các đối tượng logger, thuộc tính 357 ERROR_MESSAGE_FORMAT, của lớp BaseHttprequestHandler, biến 508 ErrorCode, mô -đun ERRNO, thuộc tính 344 ErrorLevel, của đối tượng Tarfile, 320

F

H lib

fl

B

d

ff

enable_callback_traceBacks [] hàm, mô -đun SQLite3

enable_callback_traceBacks [] hàm, mô -đun SQLite3, 305

thuộc tính endpos, của các đối tượng matchObject, 286

enable_interspersed_args [] Phương thức, của các đối tượng tùy chọnParser, 376

Phương thức endPrefixMapping [], của các đối tượng ContentHandler, 581

Kích hoạt hàm in [] trong Python 2.6, 163

Phương thức endswith [], của chuỗi, 42

Đóng gói, 127

Phương thức _ _ENTER_ _ [], của người quản lý ngữ cảnh, 62, 89

hàm mã hóa []

659

chức năng liệt kê [], 83, 204

Mô -đun Base64, Mô -đun 547 Quopri, Phương thức 568 mã hóa []

Trong Python 3, 629 của các đối tượng codecinfo, 277 đối tượng gia tăng, 278 đối tượng jsonencoder, 566 chuỗi, 42, 165-166 Sử dụng đúng, 166 mẫu mã hóa, mô-đun codec, 279 hàm số

Mô -đun cơ sở64, mô -đun 547 Quopri, 568

Mô -đun luồng, hàm 443 enumkey [], mô -đun WinReg, hàm 409 enumValue [], mô -đun WinReg, biến 409 Môi trường, Mô -đun HĐH, Biến 158 Môi trường, Mô -đun HĐH, 379 biến môi trường, 158, 379

Python 3, 633 WSGI, 540 Mở rộng trong tên tệp, 397 trong tập lệnh CGI, 533 Unding, 381 được sử dụng bởi trình thông dịch

đối số mã hóa để mở hàm [], 159

Chỉ báo EOF, Tệp I/O, 160

thuộc tính mã hóa

Ngoại lệ Eoferror, 87, 213

của các đối tượng textiowrapper, 353 tệp, 161 sự cố mã hóa với lập trình mạng, mã hóa 452, mã nguồn, thuộc tính 31 cuối, của các lát cắt, 54 đối số từ khóa kết thúc, chức năng in []

của các đối tượng MatchObject, 286 của các đối tượng TreeBuilder, phương thức 577 end_headers [], của các đối tượng baseHtt Phương thức Entheaders [], của các đối tượng HTTPConnection, 503

phương thức thực thi []

Thay đổi cú pháp, 85 _ _ExceptHook_ _ Biến, Mô -đun SYS, hàm 230 excetthook [], mô -đun SYS, 85, lớp ngoại lệ, 212

Biến thực thi, mô -đun SYS, 230

của các đối tượng kết nối, 306 đối tượng con trỏ, 298 EXECUTEMANY [] Phương thức

của các đối tượng kết nối, 306 đối tượng con trỏ, 298

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

660

Phương thức thực thi [], của các đối tượng kết nối

Phương thức Executescript [], của các đối tượng kết nối, 306

Toán tử cắt kéo dài [::], 67

thực hiện các chương trình, 6

Mở rộng việc giải nén Iterables, Python 3, 623

thực hiện chuỗi dưới dạng mã, 115

ExtendedContext, mô -đun thập phân, 248

thực thi các lệnh hệ thống, 331

kéo dài với C, 591

hàm popen [], mô -đun phụ 392, hàm 402 system [], mô hình thực thi 393, 81 thực thi các tệp _ _init_ _.py, 150 thực thi các cơ quan lớp, hàm 117, 138 exec [] hàm, mô -đun hệ điều hành, chức năng 391 Execvp [], mô -đun hệ điều hành, hàm 391 execvpe [], mô -đun OS, 391 tồn tại [] hàm, hàm OS.Path, chức năng 396 _exit [] , Mô -đun SYS, 179, 233 _ _exit_ _ [] Phương pháp, 63

của các nhà quản lý bối cảnh, thuộc tính 62, 89 exitcode, của các đối tượng quy trình, hàm 417 exp [], mô -đun toán học, phương pháp 251 exp [], của các đối tượng thập phân, phương pháp mở rộng 243 Mô-đun, Phương thức 409 expandTabs [], của chuỗi, hàm 41-42 expanduser [], mô-đun OS.Path, 397 function [] hàm OS.PATH Mô -đun, 255 biểu thức, 7 Phương thức mở rộng []

của các đối tượng mảng, 260 đối tượng deque, 262 danh sách, 40 lát mở rộng, 39, 59

Bài tập cho, 40, 69 Xóa, 40, 69 trên chuỗi, 68

Phương thức extendleft [], của các đối tượng deque, mã mở rộng 262, với các mô -đun, 144 mô -đun mở rộng, 591

Biên dịch với distutils, 596 loại chuyển đổi từ c thành python, 602 loại chuyển đổi từ python sang c, mô-đun 597 ctypes, 612 chênh lệch trong các chuỗi tài liệu python 3, 595 Biên dịch, đặt tên 597, đếm 595 tham chiếu, 607 luồng, 607 hàm trình bao bọc, hàm 594 [], mô -đun distutils, 596 extensions_map thuộc tính, của lớp httprequesthandler Phương thức 327 Trích xuất []

của các đối tượng tarfile, 320 đối tượng zipfile, 325 extract_stack [] hàm, mô -đun traceBack, 236 actact_tb [] hàm Mô -đun, phương thức 322 Trích xuất [], của các đối tượng Tarfile, biến 320 Extsep, Mô -đun HĐH, 386

F

H lib

fl

B

d

ff

Phương thức thực thi [], của các đối tượng kết nối

Phương thức Executescript [], của các đối tượng kết nối, 306

Toán tử cắt kéo dài [::], 67

661

thực hiện các chương trình, 6

Mở rộng việc giải nén Iterables, Python 3, 623

thực hiện chuỗi dưới dạng mã, 115

ExtendedContext, mô -đun thập phân, 248

thực thi các lệnh hệ thống, 331

kéo dài với C, 591

hàm popen [], mô -đun phụ 392, hàm 402 system [], mô hình thực thi 393, 81 thực thi các tệp _ _init_ _.py, 150 thực thi các cơ quan lớp, hàm 117, 138 exec [] hàm, mô -đun hệ điều hành, chức năng 391 Execvp [], mô -đun hệ điều hành, hàm 391 execvpe [], mô -đun OS, 391 tồn tại [] hàm, hàm OS.Path, chức năng 396 _exit [] , Mô -đun SYS, 179, 233 _ _exit_ _ [] Phương pháp, 63

của các nhà quản lý bối cảnh, thuộc tính 62, 89 exitcode, của các đối tượng quy trình, hàm 417 exp [], mô -đun toán học, phương pháp 251 exp [], của các đối tượng thập phân, phương pháp mở rộng 243 Mô-đun, Phương thức 409 expandTabs [], của chuỗi, hàm 41-42 expanduser [], mô-đun OS.Path, 397 function [] hàm OS.PATH Mô -đun, 255 biểu thức, 7 Phương thức mở rộng []

của các đối tượng mảng, 260 đối tượng deque, 262 danh sách, 40 lát mở rộng, 39, 59

Bài tập cho, 40, 69 Xóa, 40, 69 trên chuỗi, 68

Phương thức extendleft [], của các đối tượng deque, mã mở rộng 262, với các mô -đun, 144 mô -đun mở rộng, 591

Biên dịch với distutils, 596 loại chuyển đổi từ c thành python, 602 loại chuyển đổi từ python sang c, mô-đun 597 ctypes, 612 chênh lệch trong các chuỗi tài liệu python 3, 595 Biên dịch, đặt tên 597, đếm 595 tham chiếu, 607 luồng, 607 hàm trình bao bọc, hàm 594 [], mô -đun distutils, 596 extensions_map thuộc tính, của lớp httprequesthandler Phương thức 327 Trích xuất []

của các đối tượng tarfile, 320 đối tượng zipfile, 325 extract_stack [] hàm, mô -đun traceBack, 236 actact_tb [] hàm Mô -đun, phương thức 322 Trích xuất [], của các đối tượng Tarfile, biến 320 Extsep, Mô -đun HĐH, 386

Tên tệp

F f_* hằng số, hàm fcntl [], 347 f_* thuộc tính

của các đối tượng khung, 52 đối tượng STATVFS, hàm 389 fabs [], mô -đun toán học, hàm 251 factorial [], mô -đun toán học, phương pháp 251 fail [], của các đối tượng testcase, phương pháp 185 fail [], của các đối tượng testcase, 185

Mô -đun đăng nhập, mô -đun 362 urllib.Request, lớp 518 FileIO, mô -đun IO, thuộc tính tên tệp 350

của các đối tượng FieldStorage, 535 đối tượng bản ghi, 359 đối tượng ZipInfo, 327 tên tệp

Các chữ cái ổ Windows, 399 Đường dẫn tuyệt đối, 396 trong Python 3, 633 khớp với các ký tự đại diện Shell, 316 thao tác di động, 396 chia thành thư mục và tên cơ sở, 398 Kiểm tra cho sự tồn tại, 396 Kiểm tra nếu thư mục, 397 kiểm tra nếu liên kết, 397

Phương thức fetchmany [], của các đối tượng con trỏ, phương thức 299 fetchone [], của các đối tượng con trỏ, 298

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Phương thức fileno []

662

Phương thức fileno []

của của của của của của của của của của của của

Đối tượng kết nối, 421 đối tượng IOBase, 349 đối tượng máy chủ sockets, 491 tệp, 160-161 tệp và ổ cắm, 459 đối tượng ổ cắm, 478 đối tượng Urlopen, 515

Tệp, 10

Đường dẫn tuyệt đối của, 396 và Python 3, 160 thuộc tính, kích thước bộ đệm 161, 159 Nén nhị phân Binary Binary, 351 BZ2, 313 so sánh, 314 Sao chép, 318 Thời gian tạo, 397 Decoding dưới dạng Unicode, 167 Mô tả tệp, 159 Phát hiện kết thúc của tệp [EOF], 160 con trỏ tệp, 161, 352 Tìm trên hệ thống tập tin, 390 chức năng để thao tác siêu dữ liệu, nén 386 GZIP, 317 lặp lại trên các dòng, thời gian sửa đổi cuối cùng, 397 khóa trên Windows, 373 Kiểm soát cấp độ, 347 Các cuộc gọi hệ thống cấp thấp, 382 Bộ nhớ được ánh xạ, 370 phương thức trên, mở 159, 10, 158-159 mở với giải mã Unicode, 167 sự cố phân tích cú pháp, 548 Đọc từng dòng, 10 tìm kiếm, kích thước 161, 397 thuộc tính và câu lệnh in, 162 tạm thời, 323 thử nghiệm cho sự tồn tại, 396

Các loại, 159 Viết lên, 159 ký tự điền vào các định dạng định dạng chuỗi, lớp lọc 73, mô -đun ghi nhật ký, chức năng 359 Filter [], 205

và Python 3, 205 và tối ưu hóa, 197 mô -đun fnmatch, mô -đun tương lai

và khóa, phương thức 442 find []

của của của

Đối tượng phần tử, đối tượng 576 phần tử, đối tượng 574 mmap, 371 chuỗi, 41-42

find_l Library [] hàm, mô -đun

của các đối tượng phần tử, 576 đối tượng ElementTree, 574 đối tượng regex, 285 findCaller [] Phương thức, của các đối tượng logger, 358 Tìm tất cả các mô -đun được tải, 144 Tệp Tìm, chức năng 390 finditer [] Đối tượng Regex, Phương thức 285 FindText []

của các đối tượng phần tử, 576 đối tượng ElementTree, phương thức 574 Finish [], của các đối tượng cơ bản, 490 đối tượng hạng nhất, 36 đối tượng

Sử dụng, 37 thuộc tính FirstChild, của các đối tượng nút dom, thuộc tính 570 flag_bit

của các đối tượng bối cảnh, 247 đối tượng Regex, biến số 284 cờ, mô -đun SYS, 230

F

H lib

fl

B

d

ff

Phương thức fileno []

của của của của của của của của của của của của

Đối tượng kết nối, 421 đối tượng IOBase, 349 đối tượng máy chủ sockets, 491 tệp, 160-161 tệp và ổ cắm, 459 đối tượng ổ cắm, 478 đối tượng Urlopen, 515

Tệp, 10

Đường dẫn tuyệt đối của, 396 và Python 3, 160 thuộc tính, kích thước bộ đệm 161, 159 Nén nhị phân Binary Binary, 351 BZ2, 313 so sánh, 314 Sao chép, 318 Thời gian tạo, 397 Decoding dưới dạng Unicode, 167 Mô tả tệp, 159 Phát hiện kết thúc của tệp [EOF], 160 con trỏ tệp, 161, 352 Tìm trên hệ thống tập tin, 390 chức năng để thao tác siêu dữ liệu, nén 386 GZIP, 317 lặp lại trên các dòng, thời gian sửa đổi cuối cùng, 397 khóa trên Windows, 373 Kiểm soát cấp độ, 347 Các cuộc gọi hệ thống cấp thấp, 382 Bộ nhớ được ánh xạ, 370 phương thức trên, mở 159, 10, 158-159 mở với giải mã Unicode, 167 sự cố phân tích cú pháp, 548 Đọc từng dòng, 10 tìm kiếm, kích thước 161, 397 thuộc tính và câu lệnh in, 162 tạm thời, 323 thử nghiệm cho sự tồn tại, 396

Các loại, 159 Viết lên, 159 ký tự điền vào các định dạng định dạng chuỗi, lớp lọc 73, mô -đun ghi nhật ký, chức năng 359 Filter [], 205

và Python 3, 205 và tối ưu hóa, 197 mô -đun fnmatch, mô -đun tương lai

663

và khóa, phương thức 442 find []

của của của

Đối tượng phần tử, đối tượng 576 phần tử, đối tượng 574 mmap, 371 chuỗi, 41-42

find_l Library [] hàm, mô -đun

Mã định dạng định dạng, 72 đối tượng định dạng, 288 chuỗi, 8, 42-43, 56, 72-73, 162 chuỗi và nội suy biến, phương pháp 164 _ _format_ _ [], 55-56, 74 định dạng_exc [] Mô -đun TraceBack, chức năng 236 format_exception [], mô -đun theo dõi, chức năng 236 format_exception_only [], mô -đun traceBack, chức năng 236 format_list [], mô -đun Traceback, chức năng 236 format_stack [], mô -đun theo dõi, 236

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

664

format_tb [] hàm, mô -đun theo dõi

format_tb [] hàm, mô -đun theo dõi, 236

Phương thức từ_address [], của các đối tượng loại ctypes, 616

Phương thức định dạng_value [], của các đối tượng định dạng, 289

Phương thức From_buffer [], của các đối tượng loại ctypes, 616

Chức năng định dạng [] hàm, mô -đun kiểm tra, 222

Phương thức từ_buffer_copy [], của các đối tượng loại ctypes, 616

định dạng định dạng [] hàm, kiểm tra mô -đun, 222

Phương thức từ_decimal [], của lớp phân số, 250

In được định dạng, 8, 70-71, 162

Phương thức From_float [], của lớp phân số, 250

chuỗi được định dạng, 42, 71-72

Phương thức From_Iterable [], của các đối tượng, 270

Lớp định dạng

Phương thức From_param [], của các đối tượng loại ctypes, 616

Mô -đun đăng nhập, mô -đun chuỗi 365, 288

Hàm fromfd [], mô -đun ổ cắm, 473

Mô -đun định dạng, 587

Phương thức FromFile [], của các đối tượng mảng, 260

Định dạng, tin nhắn nhật ký, 358, 365

Phương thức từ phephex [], của điểm nổi, 39

Chức năng định dạng [], mô -đun cảnh báo, 239

Phương pháp FromKeys [], của Dicts, 45

Các khối chung của Fortran, thiếu, 146

Phương pháp từ []

Phương thức found_terminator [], của các đối tượng asynchat, hàm 453 fpathconf [], mô -đun hệ điều hành, 382

Phương thức FromList [], của các đối tượng mảng, 260

của lớp ngày, 336 của lớp DateTime, 339

Mô -đun FPECTL, 585

hàm fromString [], mô -đun xml.etree.elementtree, 575

Mô -đun FPFormat, 586

Phương thức FromString [], của các đối tượng mảng, 260

Lớp phân số, mô -đun phân số, 250

FromTimeStamp [] Phương thức

Mô -đun phân số, thuộc tính 39, 250

của các đối tượng Urlparse, 520 đối tượng URLSplit, 521 đối tượng khung, 51-52

thuộc tính của, 52

của lớp ngày, 336 của lớp DateTime, 339 fromutc [] phương thức, của các đối tượng TZinfo, 342 loại frozenset, 38, 46, 75 frozenset [] hàm, 77, 205 fstat [] hàm, mô -đun OS, 383

Loại Frametype, 51, 237

hàm fstatvfs [], mô -đun hệ điều hành, 383

Các biến miễn phí, trong các chức năng, 98

hàm fsum [], mô -đun toán học, 251

Chức năng FREEZE_SUPPORT [], Mô -đun đa xử lý, 434

hàm fsync [], mô -đun hệ điều hành, 383

hàm frexp [], mô -đun toán học, 251

Hàm ftp [], mô -đun ftplib, 497

Từ _ _future_ _ Nhập, 178

Lớp ftphandler, mô -đun Urllib.Request, 518

Từ nhập mô -đun *, 24, 145

Các biến toàn cầu, 146 định danh có dấu gạch dưới, biến 26 _ _all_ _, 145 từ câu lệnh

và Báo cáo nhập, 24 Nhập khẩu mô -đun, 145

Máy chủ FTP, tải lên các tệp lên, 500

Mô -đun ftplib, hàm 497 ftruncate [], mô -đun hệ điều hành, 383 ngoại lệ đầy đủ, mô -đun hàng đợi, 418, 445 full [] phương thức, của các đối tượng hàng đợi, thuộc tính 418, 445 func, của các đối tượng một phần, 268 _ 49

F

H lib

fl

B

d

ff

format_tb [] hàm, mô -đun theo dõi

format_tb [] hàm, mô -đun theo dõi, 236

Phương thức từ_address [], của các đối tượng loại ctypes, 616

665

Phương thức định dạng_value [], của các đối tượng định dạng, 289

Phương thức From_buffer [], của các đối tượng loại ctypes, 616

Ngoại lệ G Gaierror, mô-đun ổ cắm, hàm 485 gammavariate [], mô-đun ngẫu nhiên, thu thập rác 255, 34-35, 220

và phương thức _ _del_ _ [], 129 và chu kỳ, 35 và kết thúc chương trình, 179 Mô tả về quy trình, 221 Ví dụ về mẫu quan sát, 130 Bài toán với phương thức _ _del_ _ [] Mô-đun ngẫu nhiên, mô-đun 255 GC, hàm 35, 179, 220 GCD [], Mô-đun phân số, mô-đun 251 GDBM, hàm 310 Ge [], Mô-đun toán tử, Phương pháp 274 _ _GE_ _ [], biểu thức máy phát 56, 109-110

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

666

Biểu thức máy phát

Biểu thức có điều kiện, 79 Chuyển đổi thành danh sách, 110 sự khác biệt so với danh sách hiểu, hàm 110 và người quản lý ngữ cảnh, 90 đối tượng máy phát, 51, 53

Các thuộc tính của, 53 ngoại lệ Generatorexit, 87, 104, 213 máy phát điện, 19, 102-103

và Tuyên bố phá vỡ trong Lặp lại, 103 và hiệu quả bộ nhớ, 107 và các đường ống xử lý, 19 đóng, 53 lập trình đồng thời, mô hình thực hiện 446, 19 Xử lý ngoại lệ Generatorexit, 213 ví dụ đa nhiệm, 447 sử dụng thực tế, 106 đệ quy, 112 lần 53 Sử dụng với I/O, 164-165 Sử dụng với WSGI, 165 Generatortype, hàm 51, 237 get []

của các đối tượng Asyncresult, 425 đối tượng ConfigParParser, 333 đối tượng phần tử, 576 đối tượng tin nhắn, 552 đối tượng hàng đợi, 418, 445 của dicts, 16, 45 _ _get_ _ [] Phương thức, của các mô tả, 58, 126

phương thức get_content_subtype [], của các đối tượng tin nhắn, phương thức 553 get_content_type [], của các đối tượng tin nhắn, chức năng 553 get_count [], mô -đun GC, phương thức 221 get_data [] . , về các đối tượng yêu cầu, phương thức 517 get_host [], của các đối tượng yêu cầu, hàm 517 get_last_error [], mô -đun ctypes, hàm 617 get_logger [], mô -đun đa xử lý, phương thức 435 get_method [] Các đối tượng hàng đợi, hàm 418, 445 get_objects [], mô -đun GC, phương thức 221 get_origin_req_host [], của các đối tượng yêu cầu, chức năng 517 get_osfhandle []

phương thức get_all [], của các đối tượng tin nhắn, 552

phương thức get_params [], của các đối tượng tin nhắn, 553

phương thức get_boundary [], của các đối tượng tin nhắn, 552

phương thức get_payload [], của các đối tượng tin nhắn, 554

phương thức get_charset [], của các đối tượng tin nhắn, 553

Hàm get_referents [], mô -đun GC, 221

phương thức get_charsets [], của các đối tượng tin nhắn, 553

phương thức get_selector [], của các đối tượng yêu cầu, 517

phương thức get_content_charset [], của các đối tượng tin nhắn, 553

hàm get_server_certificate [], mô -đun SSL, 488

phương thức get_content_maintype [], của các đối tượng tin nhắn, 553

phương thức get_starttag_text [], của các đối tượng htmlparser, 561

Hàm get_referrers [], mô -đun GC, 221

F

H lib

fl

B

d

ff

Biểu thức máy phát

667

Biểu thức có điều kiện, 79 Chuyển đổi thành danh sách, 110 sự khác biệt so với danh sách hiểu, hàm 110 và người quản lý ngữ cảnh, 90 đối tượng máy phát, 51, 53

Các thuộc tính của, 53 ngoại lệ Generatorexit, 87, 104, 213 máy phát điện, 19, 102-103

và Tuyên bố phá vỡ trong Lặp lại, 103 và hiệu quả bộ nhớ, 107 và các đường ống xử lý, 19 đóng, 53 lập trình đồng thời, mô hình thực hiện 446, 19 Xử lý ngoại lệ Generatorexit, 213 ví dụ đa nhiệm, 447 sử dụng thực tế, 106 đệ quy, 112 lần 53 Sử dụng với I/O, 164-165 Sử dụng với WSGI, 165 Generatortype, hàm 51, 237 get []

của các đối tượng Asyncresult, 425 đối tượng ConfigParParser, 333 đối tượng phần tử, 576 đối tượng tin nhắn, 552 đối tượng hàng đợi, 418, 445 của dicts, 16, 45 _ _get_ _ [] Phương thức, của các mô tả, 58, 126

phương thức get_content_subtype [], của các đối tượng tin nhắn, phương thức 553 get_content_type [], của các đối tượng tin nhắn, chức năng 553 get_count [], mô -đun GC, phương thức 221 get_data [] . , về các đối tượng yêu cầu, phương thức 517 get_host [], của các đối tượng yêu cầu, hàm 517 get_last_error [], mô -đun ctypes, hàm 617 get_logger [], mô -đun đa xử lý, phương thức 435 get_method [] Các đối tượng hàng đợi, hàm 418, 445 get_objects [], mô -đun GC, phương thức 221 get_origin_req_host [], của các đối tượng yêu cầu, chức năng 517 get_osfhandle []

phương thức get_all [], của các đối tượng tin nhắn, 552

phương thức get_params [], của các đối tượng tin nhắn, 553

phương thức get_boundary [], của các đối tượng tin nhắn, 552

phương thức get_payload [], của các đối tượng tin nhắn, 554

phương thức get_charset [], của các đối tượng tin nhắn, 553

Hàm get_referents [], mô -đun GC, 221

phương thức get_charsets [], của các đối tượng tin nhắn, 553

phương thức get_selector [], của các đối tượng yêu cầu, 517

phương thức get_content_charset [], của các đối tượng tin nhắn, 553

hàm get_server_certificate [], mô -đun SSL, 488

phương thức get_content_maintype [], của các đối tượng tin nhắn, 553

phương thức get_starttag_text [], của các đối tượng htmlparser, 561

Hàm get_referrers [], mô -đun GC, 221

Hàm getinnerFrames [], kiểm tra mô -đun

phương thức get_terminator [], của các đối tượng không đồng bộ, 453

hàm getDefaultTimeout [], mô -đun ổ cắm, 474

hàm get_threshold [], mô -đun GC, 221

Chức năng GetDloPenFlags [], Mô -đun SYS, 234

phương thức get_type [], của các đối tượng yêu cầu, 517

hàm getDoc [], kiểm tra mô -đun, 223

hàm getgid [], mô -đun hệ điều hành, 380

hàm getche [], mô -đun msvcrt, 372

hàm getgroups [], mô -đun hệ điều hành, 380

hàm getCheckInterval [], mô -đun SYS, 234

phương thức getheader [], của các đối tượng httpresponse, 504

phương thức getChildren [], của các đối tượng phần tử, 577

Phương thức getheaders [], của các đối tượng httpresponse, 504

Hàm getClassTree [], kiểm tra mô -đun, 222

hàm gethostbyaddr [], mô -đun ổ cắm, 474

phương thức getCode [], của các đối tượng urlopen, 515

hàm gethostbyname [], mô -đun ổ cắm, 474

Hàm getComments [], mô -đun kiểm tra, hàm 223 getContext [], mô -đun thập phân, 247

hàm _getFrame [], mô -đun sys, 234

hàm gethostbyname_ex [], mô -đun ổ cắm, 474

hàm getcwd [], mô -đun hệ điều hành, 379

hàm gethostname [], mô -đun ổ cắm, 474

hàm getcwdu [], mô -đun hệ điều hành, 379

phương thức getinfo [], của các đối tượng zipfile, 326

Hàm getDefaultencoding [], Mô -đun SYS, 166, 234

Hàm getinnerFrames [], kiểm tra mô -đun, 223

hàm getctime [], mô -đun os.path, 397

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

668

Phương thức getint [], của các đối tượng ConfigParser

Phương thức getint [], của các đối tượng ConfigParser, 333

phương thức getpeercert [], của các đối tượng SSL, 488

hàm getItem [], mô -đun toán tử, 274

phương thức getpeername [], của các đối tượng ổ cắm, 478

_ _GetItem_ _ [] Phương thức, 58-59

hàm getpgid [], mô -đun hệ điều hành, 380

và lát cắt, 59 phương thức GetIterator []

của các đối tượng phần tử, 577 đối tượng ElementTree, 574

hàm getpgrp [], mô -đun hệ điều hành, hàm 380 getPid [], mô -đun hệ điều hành, phương thức getPos [], của các đối tượng htmlparser, 561

hàm getitimer [], mô -đun tín hiệu, 399

hàm getppid [], mô -đun hệ điều hành, 380

phương thức getLpm [], của các đối tượng thuộc tính sax, 582

hàm getProfile [], mô -đun sys, 234

hàm getLevelName [], mô -đun ghi nhật ký, phương thức 366 getList [], của các đối tượng fieldStorage, 535

hàm getProtObyname [], mô -đun ổ cắm, phương thức 475 getQnameByName [], của các đối tượng thuộc tính sax, 582

hàm getloadAvg [], mô -đun hệ điều hành, 395

phương thức getQnames [], của các đối tượng thuộc tính sax, 582

hàm getLogger [], mô -đun ghi nhật ký, 356

hàm getrandbits [], mô -đun ngẫu nhiên, 254

hàm getLogin [], mô -đun hệ điều hành, 380

hàm getRecursionLimit [], mô -đun SYS, 112, 234

Phương thức GetMember [], của các đối tượng Tarfile, 320

hàm getRefCount [], mô -đun SYS, 35, 234

Hàm getMembers [], kiểm tra mô -đun, 223

phương thức getResponse [], của các đối tượng HTTPConnection, 503

Phương thức GetMembers [], của các đối tượng Tarfile, 321

phương thức getRoot [], của các đối tượng ElementTree, 574

hàm getModule [], kiểm tra mô -đun, 223

Hàm getServByName [], mô -đun ổ cắm, 475

Hàm getModuleInfo [], Mô -đun kiểm tra, hàm 223 getModulename [], mô -đun kiểm tra, 224

Hàm getServByport [], mô -đun ổ cắm, loại getsetDescriptortype, 237

hàm getmro [], kiểm tra mô -đun, 224

hàm getsid [], mô -đun hệ điều hành, 380

hàm getmtime [], mô -đun OS.Path, 397

hàm getsign [], mô -đun tín hiệu, 399

phương thức getName [], của các đối tượng luồng, 436

hàm getsize [], mô -đun OS.Path, 397

phương thức getNameByqname [], của các đối tượng thuộc tính sax, 582

Hàm getsizeof [], mô -đun SYS, 192, 234

hàm getNameInfo [], mô -đun ổ cắm, 474

phương thức getSockName [], của các đối tượng ổ cắm, 478

phương thức getNames [], của các đối tượng thuộc tính sax, 582

Phương thức GetSockopt [], của các đối tượng ổ cắm, 478

phương thức getNames [], của các đối tượng tarfile, 321

hàm getsource [], mô -đun kiểm tra, 224

Mô -đun GetOpt, 378

hàm getsourcefile [], mô -đun kiểm tra, 224

Hàm getouterFrames [], mô -đun kiểm tra, hàm 224 getOutput [], mô -đun lệnh, 331

hàm getslice [], mô -đun toán tử, 274

Hàm getsourcelines [], mô -đun kiểm tra, hàm 224 getState [], mô -đun ngẫu nhiên, 254

F

H lib

fl

B

d

ff

Phương thức getint [], của các đối tượng ConfigParser

Phương thức getint [], của các đối tượng ConfigParser, 333

phương thức getpeercert [], của các đối tượng SSL, 488

hàm getItem [], mô -đun toán tử, 274

phương thức getpeername [], của các đối tượng ổ cắm, 478

_ _GetItem_ _ [] Phương thức, 58-59

hàm getpgid [], mô -đun hệ điều hành, 380

và lát cắt, 59 phương thức GetIterator []

của các đối tượng phần tử, 577 đối tượng ElementTree, 574

hàm getpgrp [], mô -đun hệ điều hành, hàm 380 getPid [], mô -đun hệ điều hành, phương thức getPos [], của các đối tượng htmlparser, 561

669

hàm getitimer [], mô -đun tín hiệu, 399

hàm getuid [], mô -đun hệ điều hành, 380

Lớn hơn toán tử>, 66

phương thức geturl [], của các đối tượng urlopen, 515

lớn hơn hoặc bằng người vận hành> =, 66

Phương thức _getValue [], của các đối tượng BaseProxy, 433

Chủ đề màu xanh lá cây, 446

phương thức getValue [], của các đối tượng thuộc tính sax, 582

Phương thức nhóm [], của các đối tượng MatchObject, 285

phương thức getValue []

Chức năng Groupby [], mô -đun itertools, 271

của các đối tượng byte, 352 đối tượng FieldStorage, 535 đối tượng Stringio, 354

Greenlets, 446

Phương thức GroupDict [], của các đối tượng MatchObject, thuộc tính 286 Group Index, của các đối tượng Regex, 284

phương thức getValuByqName [], của các đối tượng thuộc tính sax, 582

Phương thức nhóm [], của các đối tượng MatchObject, 285

hàm getwch [], mô -đun msvcrt, 372

Mô -đun GRP, 586

hàm getwche [], mô -đun msvcrt, 372

hàm gt [], mô -đun toán tử, 274

Chức năng GetWeakRefCount [], Mô -đun yếu, 241

phương thức _ _gt_ _ [], 56

Hàm getWeakRefs [], Mô -đun yếu, hàm 241 GetWindowsVersion [], Mô -đun SYS, thuộc tính 234 GI_*, của các đối tượng Trình tạo, 53

Hàm đoán_all_extensions [], mô -đun mimetypes, hàm 567 gured_extension [], mô -đun mô phỏng, hàm 567 guress_type [], mô -đun mô phỏng, 566

Mô -đun Quả cầu, 317

Lập trình GUI, sử dụng đánh giá chức năng một phần, 268

chức năng glob [], mô -đun địa cầu, 317

GUI và lập trình mạng, 467

thuộc tính GID, của các đối tượng Tarinfo, 321

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

670

Mô -đun GZIP

Mô -đun GZIP, hàm 317 gzipfile [], mô -đun GZIP, 317

Phương thức has_data [], của các đối tượng yêu cầu, phương thức 517 has_header []

H

của các đối tượng yêu cầu, 517 đối tượng sniffer, 550

-H Tùy chọn dòng lệnh, 173

Biến HAS_IPV6, Mô -đun ổ cắm, 475

Lệnh gỡ lỗi H [ELP], Mô -đun PDB, 188

Phương pháp has_key [], của dicts, 45

Hàm [] hàm, mô -đun CGITB, 539

Phương thức has_option [], của các đối tượng ConfigParser, 333

phương thức [] phương thức, của các đối tượng cơ bản, 490

Phương thức has_section [], của các đối tượng ConfigParser, 333

phương thức xử lý_accept [], của các đối tượng điều phối, 455

hàm hasattr [], 205

phương thức xử lý_charref [], của các đối tượng htmlparser, phương thức 561 tay cầm_close [], của các đối tượng điều phối, phương thức 455 tay cầm phương thức xử lý_decl [], của các đối tượng htmlparser, 561

và các thuộc tính riêng, phương thức 128 HasAttribution [], của các đối tượng phần tử DOM, 572 HasAttributens [] phương thức, của các đối tượng phần tử DOM, phương thức 572 HasAttribut [], của các đối tượng nút dom, 571 HasChildNodes [] Bảng, 16, 44 cơ sở dữ liệu dựa trên bảng băm, hàm băm [] [], 205

phương thức xử lý_endtag [], của các đối tượng htmlparser, 562

_ _hash_ _ [] phương thức, 56

Phương thức của tay cầm_entityref [], của các đối tượng htmlparser, 562

Mô -đun Hashlib, 559

phương thức tay cầm_error []

thuộc tính Header_offset, của các đối tượng Zipinfo, 327

của lớp socketserver, 493 đối tượng điều phối, phương thức 455 tay cầm_expt [], của các đối tượng điều phối, phương thức 456 tay cầm_pi [], của các đối tượng htmlparser, 562

Lớp cơ sở trừu tượng có thể băm, 265

Ví dụ về, 425

thuộc tính tiêu đề

của các đối tượng BaseHttprequestHandler, 509 đối tượng FieldStorage, 535 Heap, 269

phương thức xử lý_read [], của các đối tượng điều phối, 456

Hàm Heapify [], Mô -đun Heapq, 269

phương thức xử lý_startendtag [], của các đối tượng htmlparser, 562

Hàm Heppop [], Mô -đun HEAPQ, 269

phương thức xử lý_starttag [], của các đối tượng htmlparser, phương thức 562 tay cầm_timeout [], của lớp socketserver, phương thức 493 tay cầm_write [], của các đối tượng Dispatcher, 456

hàm heapmin [], mô -đun msvcrt, chức năng 372 heppush [], mô -đun heapq, hàm 269 heppushpop [], mô -đun heapq, mô -đun 270 heapq, chức năng 269 heapreplace []

F

H lib

fl

B

d

ff

Mô -đun GZIP

Mô -đun GZIP, hàm 317 gzipfile [], mô -đun GZIP, 317

Phương thức has_data [], của các đối tượng yêu cầu, phương thức 517 has_header []

H

của các đối tượng yêu cầu, 517 đối tượng sniffer, 550

-H Tùy chọn dòng lệnh, 173

671

Biến HAS_IPV6, Mô -đun ổ cắm, 475

Lệnh gỡ lỗi H [ELP], Mô -đun PDB, 188

Phương pháp has_key [], của dicts, 45

Hàm [] hàm, mô -đun CGITB, 539

Gói HTTP, 500

khóa phân cấp, 442

Mô -đun http.cookiejar, 513

Ghi nhật ký phân cấp, mô -đun ghi nhật ký, 360

Mô -đun http.cookies, 511

Phân cấp ngoại lệ, 87-88

Mô -đun HTTP.Server, 506

Phân cấp của các đối tượng, 137

Lớp httpbasicauthhandler, mô-đun urllib.request, 518-519

Hằng số Highest_protocol, Mô -đun Pickle, Hằng số 172 HKEY_*

của các đối tượng UrlParse, 520 đối tượng URLSplit, 521 tên máy chủ, lấy cho máy chủ, thuộc tính 474 giờ, của các đối tượng thời gian, 338 HTML Forms

Ví dụ về, 531 tải lên với gói Urllib, phân tích cú pháp 515 HTML, mô -đun 561 HTML.Parser, Lớp 561 HTMLPARSER, Mô -đun HTML.Parser, 561

mô -đun http.client, 502

Hàm httpconnection [], http.client mô-đun, 502 httpcookieprocessor, urllib.request module, 518-519 httpdefaulterRorHandler class, urllib.request module, 518 httpdig 523 HTTPException Exception, HTTP.Client Module, 504 Httphandler Class

Mô -đun đăng nhập, mô -đun 362 urllib.Request, mô -đun 518 httplib, xem http.client, 502

Mô -đun HTMLPARSER, xem html.parser, 561

Lớp httpredirecthandler, mô -đun urllib.request, 518

Ngoại lệ HTMLPARSERERROR, Mô -đun HTML.Parser, 562

Các đối tượng HTTPRESPONSE, mô -đun http.client, 504

hàm htonl [], mô -đun ổ cắm, 475

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Hàm httpsconnection [], mô -đun http.client

672

Hàm httpsconnection [], mô -đun http.client, 502

Thuộc tính phớt lờ_Env môi trường, của sys.flags, 230

Lớp Httpserver, Mô -đun HTTP.Server, 506

Chức năng bỏ qua_potytern [], Mô -đun SHOTIL, 318

Lớp httpshandler, mô -đun urllib.request, chức năng 518 hypot [], mô -đun toán học, 251

Tôi

Thuộc tính bỏ qua_zeros, của các đối tượng Tarfile, 321 ngoại lệ được bỏ qua tên trong _ _del_ _, 179 bỏ qua các ngoại lệ, 85

Tùy chọn dòng lệnh, 173-174

_ _ _ilshift_ _ [] phương thức, 61

Bộ đệm I/O và máy phát điện, 165

thuộc tính hình ảnh

I/o ghép kênh, 459 _ _IADD_ _ [] Phương pháp, 61

có số lượng phức tạp, 39 điểm nổi, 39

_ _IAND_ _ [] Phương pháp, 61

hàm imap [], mô -đun itertools, 272

Tiêu chuẩn số học thập phân chung của IBM, 243

Phương pháp imap [], của các đối tượng nhóm, 424

hàm id [], 33, 206

phương thức imap_unordered [], của các đối tượng nhóm, 424

xác định thuộc tính, của các đối tượng luồng, 436

Mô -đun Imaplib, 587

Định danh, 26

Mô -đun IMGHDR, 588

và dữ liệu hạng nhất, 36 độ nhạy của trường hợp, 26 từ dành riêng, 26 cách sử dụng dấu gạch dưới, 26 sử dụng unicode trong Python 3, 622 so sánh nhận dạng của các đối tượng, 34 nhận dạng của các đối tượng, 33 toán tử nhận dạng là, 78 _ _idiv_ _ [] Phương pháp , 61 _ _idivMod_ _ [] Phương thức, 61 nhàn rỗi, 5-6

và các luồng I/O tiêu chuẩn, 162 IEEE 754, 243 IF Statement, 9, 81

và _ _debug_ _ biến, hàm 91 ifilter [] hàm, mô -đun itertools, 271 ifilterFalse [] funct , 581 Lệnh gỡ lỗi, mô -đun PDB, Xử lý lỗi 188 'Bỏ qua', Mã hóa Unicode, 166

tính bất biến, của các bộ dữ liệu, 14 loại bất biến, kế thừa từ, 55 bất biến, định nghĩa, 33 _ _imod_ _ [] phương pháp, 61 Imp mô-đun, 224, 585 Chuyển đổi loại ẩn, thiếu, 62 Báo cáo nhập khẩu, 13, 23-24, 50, 143-144

Python 3, 151 Nhập khẩu tuyệt đối trong các gói, 151 và chương trình chính, 146 và sys.modules, 144 và sys.path biến, 147 là vòng loại, 144 độ nhạy của trường hợp, tổng hợp 148 Đường dẫn, 147 nhiều mô-đun, 144 thực hiện một lần các mô-đun, 144 gói, 150 vị trí trong một chương trình, 144 nhập khẩu tương đối, 150-151 Quy tắc phạm vi của mã tải, 145 loại mô-đun, 148 ngoại lệ của Irtunterror, 87, 148, 214

F

H lib

fl

B

d

ff

Hàm httpsconnection [], mô -đun http.client

Hàm httpsconnection [], mô -đun http.client, 502

Thuộc tính phớt lờ_Env môi trường, của sys.flags, 230

673

Lớp Httpserver, Mô -đun HTTP.Server, 506

Chức năng bỏ qua_potytern [], Mô -đun SHOTIL, 318

Lớp httpshandler, mô -đun urllib.request, chức năng 518 hypot [], mô -đun toán học, 251

Tôi

Thuộc tính bỏ qua_zeros, của các đối tượng Tarfile, 321 ngoại lệ được bỏ qua tên trong _ _del_ _, 179 bỏ qua các ngoại lệ, 85

Tùy chọn dòng lệnh, 173-174

Inf

Sửa đổi tại chỗ

danh sách, 40 bộ, 47 in_dll [] phương thức, của các đối tượng loại ctypes, 616 inaddr_* hằng số, mô -đun ổ cắm, 478 ngoại lệ không hoàn chỉnh, mô -đun Các đối tượng, 279 lớp gia tăng, mô -đun codecs, 278 exprementalencoder [] phương thức, của các đối tượng codecInfo, 278 thụt lề, 8, 25

và chuỗi tài liệu, ký tự tiếp tục 30 và dòng \, 9 và tab, 26 kiểu ưa thích, 8 câu lệnh trên cùng một dòng, 25 ngoại lệ interationerror, 87, 214 index [] Phương thức

của các đối tượng mảng, 260 danh sách, 40-41 chuỗi, 41, 43 IndexError Except

Mô -đun thập phân, phương thức 244 Infinity, 213 Info []

của các đối tượng logger, 357 đối tượng urlopen, phương thức 515 infolist [], của các đối tượng zipfile, kế thừa 326, 21, 119

_ _MRO_ _ Thuộc tính của các lớp, 121 lớp cơ sở trừu tượng, 137 liên kết thuộc tính, 119 phương thức gọi trong các lớp học, 120 từ các loại tích hợp, 22 từ các loại bất biến, 55 khởi tạo các lớp 233 hàm isinstance [], 34 hàm issubclass [], 135 metaclass, 139 thứ tự phân giải phương thức, 121 nhiều kế thừa, 121 ngăn chặn xác định lại các phương thức, 128 phương thức riêng, 128 sử dụng với các trường hợp ngoại lệ, 88 .IIN

Định cấu hình ghi nhật ký với, 368 Đọc từ chức năng Python, 332 init [], mô -đun Mimetypes, 567

Trên danh sách, 12 trên chuỗi, 68 Làm thế nào chúng ta có thể làm cho chỉ mục này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

674

_ _init_ _ [] phương thức

Phương pháp _ _init_ _ [], 50, 54-55

và các trường hợp ngoại lệ, 88 và kế thừa, tạo ra 120 và phiên bản, 129 và metaclass, 139 và dưa chua, 228 Xác định nhiều phương thức tạo thể hiện, 123 của các lớp, 22, 118 _ _init_ _.py các tệp trong các gói, 149 , 206

Phương thức Python 3, 11 Chèn []

của các đối tượng phần tử, 577 của các đối tượng mảng, 260 danh sách, 12, 41 inf trước [] Phương thức, của các đối tượng nút dom, 571 mục chèn vào từ điển, 16 mục chèn vào danh sách, hàm 41 chữ nhật, mô -đun chia đôi, 261 Chức năng Intort_left [], Mô -đun Bisect, hàm 261 Intort_Right [], Mô -đun Bisect, 261

hàm int [], phương thức 11, 62, 76, 206 _ _int_ _ [], 61-62

và ép buộc loại, phân chia số nguyên 134, Python 3, 633 số nguyên, 27

Biểu diễn bổ sung của 2, 66 là khóa từ điển, 16 Khuyến khích tự động sang dài, 27 chuyển đổi sang Longs, 38 Tạo chuỗi thập lục phân, 77 Tạo hành vi tràn ngẫu nhiên, 254, 66 phạm vi, 38 chỉ định là Hex, Octal hoặc nhị phân, Lớp cơ sở, 253 IntegrityError Except, API cơ sở dữ liệu, thuộc tính tương tác 302, của sys.flags, chế độ tương tác 230, 6, 175

và các dòng trống, 26 màn hình kết quả, 55, 176 thiết bị đầu cuối tương tác, 174 giao diệnError Exception, API cơ sở dữ liệu, 302

Kiểm tra thuộc tính, của sys.flags, 230

thuộc tính internal_attr, của các đối tượng zipinfo, 327

Kiểm tra mô -đun, 222

Ngoại lệ nội bộ, API cơ sở dữ liệu, 302

Kiểm tra các đối tượng, với Dir [], 63

nhân vật quốc tế

Lệnh cài đặt, của các tệp setup.py, 154

và so sánh chuỗi, 70 trong mã nguồn, 31

Chức năng install_opener [], mô -đun urllib.request, 518

nội suy, của các giá trị trong chuỗi, 72

Cài đặt các gói của bên thứ ba, 154

thông dịch viên, 5

Trong thư mục người dùng, 154 Cài đặt gói, phương thức 153 phiên bản, 48, 118 _ _InstanceCheck_ _ [] Phương thức, 57, 136 trường hợp, 117

Như có thể gọi, 50 gán thuộc tính, xóa thuộc tính 131, 131 Tạo, 55, 118, 129 Định nghĩa của, 33 Pickling, 228 loại, 50

Các tùy chọn dòng lệnh phiên dịch, 173 Biến môi trường phiên dịch, 174 Lời nhắc phiên dịch, 175 Trình thông dịch, Tùy chọn -T và -TT, 26 Truyền thông [IPC], Phương thức ngắt 413 [], của các đối tượng kết nối, toán tử giao nhau 306 & của bộ, 15 Phương thức giao nhau [], của các bộ, 46 giao lộ_update [], của các bộ, hẹn giờ 47 khoảng thời gian, 399

khởi tạo lớp cơ sở trừu tượng, 137

hướng nội của các đối tượng, 222

loại int, 38

hàm inv [], mô -đun toán tử, 273

F

H lib

fl

B

d

ff

_ _init_ _ [] phương thức

Phương pháp _ _init_ _ [], 50, 54-55

và các trường hợp ngoại lệ, 88 và kế thừa, tạo ra 120 và phiên bản, 129 và metaclass, 139 và dưa chua, 228 Xác định nhiều phương thức tạo thể hiện, 123 của các lớp, 22, 118 _ _init_ _.py các tệp trong các gói, 149 , 206

Phương thức Python 3, 11 Chèn []

của các đối tượng phần tử, 577 của các đối tượng mảng, 260 danh sách, 12, 41 inf trước [] Phương thức, của các đối tượng nút dom, 571 mục chèn vào từ điển, 16 mục chèn vào danh sách, hàm 41 chữ nhật, mô -đun chia đôi, 261 Chức năng Intort_left [], Mô -đun Bisect, hàm 261 Intort_Right [], Mô -đun Bisect, 261

hàm int [], phương thức 11, 62, 76, 206 _ _int_ _ [], 61-62

và ép buộc loại, phân chia số nguyên 134, Python 3, 633 số nguyên, 27

Biểu diễn bổ sung của 2, 66 là khóa từ điển, 16 Khuyến khích tự động sang dài, 27 chuyển đổi sang Longs, 38 Tạo chuỗi thập lục phân, 77 Tạo hành vi tràn ngẫu nhiên, 254, 66 phạm vi, 38 chỉ định là Hex, Octal hoặc nhị phân, Lớp cơ sở, 253 IntegrityError Except, API cơ sở dữ liệu, thuộc tính tương tác 302, của sys.flags, chế độ tương tác 230, 6, 175

và các dòng trống, 26 màn hình kết quả, 55, 176 thiết bị đầu cuối tương tác, 174 giao diệnError Exception, API cơ sở dữ liệu, 302

675

Kiểm tra thuộc tính, của sys.flags, 230

thuộc tính internal_attr, của các đối tượng zipinfo, 327

Kiểm tra mô -đun, 222

Ngoại lệ nội bộ, API cơ sở dữ liệu, 302

Lớp IOBASE, Mô -đun IO, 349

Phương pháp ischr [], của các đối tượng Tarinfo, 321

hàm ioctl [], mô -đun fcntl, 348

hàm is class [], kiểm tra mô -đun, 224

Phương thức Ioctl [], của các đối tượng ổ cắm, 482

hàm iscode [], kiểm tra mô -đun, 225

Ngoại lệ ioerror, 87, 214

phương thức isdaemon [], của các đối tượng chủ đề, 437

_ _ior_ _ [] Phương thức, 61 IP_* Tùy chọn ổ cắm, mô -đun ổ cắm, 480

isDatadescriptor [] hàm, kiểm tra mô -đun, 225

phương thức _ _ipow_ _ [], 61

Phương thức ISDEV [], của các đối tượng Tarinfo, 321

Hằng số ipproto_*, mô -đun ổ cắm, 476

phương thức isDigit [], của chuỗi, 43

Giao thức IPv4, 470

hàm isdir [], mô -đun OS.Path, 397

Định dạng địa chỉ, giao thức IPv6 471, 470

Định dạng địa chỉ, 471 IPv6_* Tùy chọn ổ cắm, mô-đun ổ cắm, 480-481 IronPython, 5

Ví dụ về, 620

Phương thức ISDIR [], của các đối tượng tarinfo, phương thức 321 isDisjoint [], của các tập hợp, hàm 46 iselement [], xml.etree.elementtree mô -đun, 578 isenables [] 359

_ _irshift_ _ [] phương thức, 61

Phương thức isfifo [], của các đối tượng Tarinfo, 321

là toán tử, nhận dạng đối tượng, 34, 78

hàm isfile [], mô -đun OS.Path, 397

hàm is_ [], mô -đun toán tử, 274

Phương thức isfile [], của các đối tượng tarinfo, 321

phương thức is_alive []

hàm isframe [], kiểm tra mô -đun, 225

của các đối tượng quy trình, 416 đối tượng luồng, 436

hàm isfunction [], mô -đun kiểm tra, hàm 225 isgener [], kiểm tra mô -đun, 225

phương thức is_multipart [], của các đối tượng tin nhắn, 554

hàm isgeneratorfunction [], mô -đun kiểm tra, 225

hàm is_not [], mô -đun toán tử, 274

hàm isinf [], mô -đun toán học, 252

Phương thức is_set [], của các đối tượng sự kiện, 440

hàm isinstance [], 34, 37, 135, 206-207

hàm is_tarfile [], mô -đun tarfile, phương thức 319 is_unverifable [], của các đối tượng yêu cầu, 517

và kế thừa, các đối tượng 134 và proxy, 135 hành vi xác định lại, 136

hàm is_zipfile [], mô -đun zipfile, 325

hàm islice [], mô -đun itertools, 272

hàm isabs [], mô -đun OS.Path, 397

hàm isLink [], mô -đun OS.Path, 397

hàm isabstract [], mô -đun kiểm tra, 224

Phương thức islnk [], của các đối tượng Tarinfo, 321

Phương thức isalive [], của các đối tượng luồng, 436

Phương pháp islower [], của chuỗi, 43

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

hàm ismethod [], kiểm tra mô -đun

676

hàm ismethod [], mô-đun kiểm tra, 225 isMethodDescriptor [] function, kiểm tra mô-đun, 225 hàm ismodule [], kiểm tra mô-đun, chức năng 225 ismount [], mô-đun OS.Path, 397 ISNAN [] -1 mã hóa, mô tả, 169 phương thức isocalendar [], của các đối tượng ngày, 337 isoformat [] phương thức

của các đối tượng ngày, 337 đối tượng thời gian, 338 phương thức isoweekday [], của các đối tượng ngày, 337 iSreg [] phương thức, của các đối tượng tarinfo, 321 isreservedkey [] Phương thức, của các đối tượng morsel, 512 isRoutine [] .

xác định lại hành vi của, 136

Trong một chuỗi, 39, 69 trên các khóa từ điển, 17 giá trị từ điển, 45 qua nhiều chuỗi, 83 hàm di động cho hoạt động tiếp theo [], 207 thay đổi giao thức trong giao thức Python 3, 633 của, 60, 82 Phạm vi của biến lặp, 82 Các đối tượng được hỗ trợ, 17 việc giải nén các bộ dữ 279 IterenCode [] Phương thức, của các đối tượng jsonencoder, 566 iterKeyRefs [] phương thức, của các đối tượng yếu, 241

Phương thức phát hành [], của các bộ, 46

hàm iterparse [], mô -đun xml.etree.elementtree, 578

Phương thức phát hành [], của các bộ, 46

Mô -đun itertools, 83, 270

Phương pháp ISSYM [], của các đối tượng Tarinfo, phương thức 322 istitle [], của chuỗi, 43

Phương pháp itervaluerefs [], của các đối tượng yếu, 241

hàm istRaceBack [], mô -đun kiểm tra, 225

_ _ _itruediv_ _ [] Phương thức, 61

phương thức _ _isub_ _ [], 61

phương thức _ _ixor_ _ [], 61

Phương pháp isupper [], của chuỗi, 41, 43

hàm izip [], mô -đun itertools, 83, 212, 272

hàm itemgetter [], mô -đun toán tử, phương thức 275 mục []

của của của của của của

Đối tượng ConfigParser, 333 đối tượng phần tử, 577 đối tượng tin nhắn, 552 dicts, 45 dicts trong Python 3, 632

hàm izip_longest [], mô -đun itertools, 272

Nhân vật J J, trên các chữ số phức tạp, 27

Thuộc tính mục, của các đối tượng mảng, 259

J [UMP] Lệnh gỡ lỗi, mô -đun PDB, 188

MụcView Lớp cơ sở trừu tượng, 266

Java, 620

hàm iter [], 206

Sự khác biệt trong hệ thống lớp học, 119

_ _iter_ _ [] Phương thức, 59, 82

JavaScript, ví dụ cửa sổ bật lên, 531

Lớp cơ sở trừu tượng, 265

tham gia [] hàm, mô -đun OS.Path, 397

Lặp lại, 10, 17, 59, 82

tham gia [] phương thức

Tia ra khỏi một vòng lặp, 83 biến lặp, 82

của các đối tượng có thể tham gia, 419 đối tượng hồ bơi, 424

F

H lib

fl

B

d

ff

hàm lchown [], mô -đun hệ điều hành

của các đối tượng quy trình, 416 đối tượng hàng đợi, 445 đối tượng luồng, 436 chuỗi, 43

chìa khóa

Các loại có thể chấp nhận được cho từ điển, 16 của dicts, 44 lớp cơ sở trừu tượng, 266

Phương thức tham gia_thread [], của các đối tượng hàng đợi, 418

Đối số từ khóa, 18, 94

Hàm có thể tham gia [] hàm, mô -đun đa xử lý, 419

Mô -đun từ khóa, 585

phương thức js_output []

của các đối tượng morsel, 512 đối tượng SimpleCookie, 512 JSON [ký hiệu đối tượng JavaScript], 563

677

Trộn với các đối số vị trí, 94 đối số chỉ từ khóa, Python 3, 625 Thuộc tính từ khóa, của các đối tượng một phần, hàm 268 KILL [], Mô-đun HĐH, Phương pháp 392 KILL [], của các đối tượng popen, hàm 403 killpg [] 392

Mô -đun JSON, 563

Sự khác biệt so với dưa chua và nguyên soái, 565

Kqueue, BSD, 460

Lớp Jsondecoder, Mô -đun JSON, 565

L

Lớp jsonencoder, mô -đun JSON, chức năng 566 jumpaHead [], mô -đun ngẫu nhiên, 254

L ký tự, trên các số nguyên dài, 27

Jython, 5

Nhà điều hành Lambda, 48, 112

Ví dụ về, 620

Lệnh gỡ lỗi L [IST], Mô -đun PDB, 188

Các lựa chọn thay thế cho, loại Lambdatype 274-275, 237

Hàm kbhit [], mô -đun MSVCRT, thuộc tính chính của 373, của các đối tượng morsel, toán tử chỉ mục chính 512 [], 44

của dicts, 16 đối số từ khóa, để sắp xếp [], hằng số 40 key_*, mô -đun WinReg, ngắt bàn phím 410, lớp 162 Bàn phím, 214

thuộc tính last_accepted, của các đối tượng người nghe, biến 434 last_traceBack, mô -đun sys, biến số last_type, mô -đun SYS, 231 biến last_value, mô -đun sys, 231 thuộc tính LastChild, của các đối tượng nút dom, thuộc tính nhóm 570

Ngoại lệ tình trạng khó khăn, 87-88, 162

thuộc tính LastIndex, của các đối tượng MatchObject, 286

Ngoại lệ KeyError, 44, 87, 214

Mã hóa Latin-1, mô tả, 169

Phương thức keyrefs [], của các đối tượng yếu, 241

Khởi chạy trình duyệt web, 544

Phương thức khóa []

Ra mắt các quy trình con, 402

của của của

Đối tượng phần tử, 577 đối tượng tin nhắn, 552 dicts, 45 dicts trong Python 3, 632

Ra mắt các ứng dụng Python, 176

Ví dụ, 404 đánh giá lười biếng, hàm 99 lchflags [], mô -đun HĐH, hàm 387 lchmod [], mô -đun HĐH, hàm 387 lchown [], mô -đun HĐH, 387

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

hàm lchown [], mô -đun hệ điều hành

678

của các đối tượng quy trình, 416 đối tượng hàng đợi, 445 đối tượng luồng, 436 chuỗi, 43

chìa khóa

Các loại có thể chấp nhận được cho từ điển, 16 của dicts, 44 lớp cơ sở trừu tượng, 266

Phương thức tham gia_thread [], của các đối tượng hàng đợi, 418

Đối số từ khóa, 18, 94

Hàm có thể tham gia [] hàm, mô -đun đa xử lý, 419

Mô -đun từ khóa, 585

phương thức js_output []

của các đối tượng morsel, 512 đối tượng SimpleCookie, 512 JSON [ký hiệu đối tượng JavaScript], 563

Trộn với các đối số vị trí, 94 đối số chỉ từ khóa, Python 3, 625 Thuộc tính từ khóa, của các đối tượng một phần, hàm 268 KILL [], Mô-đun HĐH, Phương pháp 392 KILL [], của các đối tượng popen, hàm 403 killpg [] 392

Mô -đun JSON, 563

Sự khác biệt so với dưa chua và nguyên soái, 565

Kqueue, BSD, 460

Lớp Jsondecoder, Mô -đun JSON, 565

L

Lớp jsonencoder, mô -đun JSON, chức năng 566 jumpaHead [], mô -đun ngẫu nhiên, 254

L ký tự, trên các số nguyên dài, 27

Jython, 5

Nhà điều hành Lambda, 48, 112

Ví dụ về, 620

Lệnh gỡ lỗi L [IST], Mô -đun PDB, 188

Các lựa chọn thay thế cho, loại Lambdatype 274-275, 237

Hàm kbhit [], mô -đun MSVCRT, thuộc tính chính của 373, của các đối tượng morsel, toán tử chỉ mục chính 512 [], 44

của của của

Đối tượng phần tử, 577 đối tượng tin nhắn, 552 dicts, 45 dicts trong Python 3, 632

Ra mắt các ứng dụng Python, 176

Ví dụ, 404 đánh giá lười biếng, hàm 99 lchflags [], mô -đun HĐH, hàm 387 lchmod [], mô -đun HĐH, hàm 387 lchown [], mô -đun HĐH, 387

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

hàm ldexp [], mô -đun toán học

hàm ldexp [], mô -đun toán học, 252

Cấu trúc dòng của các chương trình, 25

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

698

hàm lchown [], mô -đun hệ điều hành

hàm lchown [], mô -đun hệ điều hành

của các đối tượng quy trình, 416 đối tượng hàng đợi, 445 đối tượng luồng, 436 chuỗi, 43

chìa khóa

Các loại có thể chấp nhận được cho từ điển, 16 của dicts, 44 lớp cơ sở trừu tượng, 266

Phương thức tham gia_thread [], của các đối tượng hàng đợi, 418

Đối số từ khóa, 18, 94

Hàm có thể tham gia [] hàm, mô -đun đa xử lý, 419

Mô -đun từ khóa, 585

phương thức js_output []

của các đối tượng morsel, 512 đối tượng SimpleCookie, 512 JSON [ký hiệu đối tượng JavaScript], 563

Các chương trình đang chạy, 6

Mô -đun Robotparser, 523

Ngoại lệ RuntimEError, 87, 214

Tệp robot.txt, 523

Cảnh báo Runtimewarning, 216, 238

Phương thức rollback [], của các đối tượng kết nối, 298

_ _rxor_ _ [] phương thức, 61

Phương pháp Rollover []

S

logger gốc, mô -đun ghi nhật ký, phương thức 355 _ _ror_ _ [], 61 ROTATE [] Phương thức, của các đối tượng deque, 263 tệp nhật ký xoay, 363 lớp RotatingFileHandler, mô -đun ghi nhật ký, hàm 363 vòng [], 66, 209

và Python 3, 209

! S Định giá trong định dạng chuỗi, tùy chọn dòng lệnh 74 -S, tùy chọn dòng lệnh 173-174 -S, lệnh gỡ lỗi 173 S [TEP], mô -đun PDB, 189 Safe_Subst acad [] Phương thức , 336

thuộc tính làm tròn, của các đối tượng bối cảnh, 247

Thuộc tính giống nhau_files, của các đối tượng DIRCMP, 315

Hành vi làm tròn, 66

hàm sikufile [], mô -đun OS.Path, 398

Thay đổi trong Python 3, 66 làm tròn, mô -đun thập phân, 245

hàm sikieopenfile [], mô -đun OS.Path, 398

thuộc tính tròn, của sys.float_info, 231

hàm samestat [], mô -đun os.path, 398

Thuộc tính Row_Factory, của các đối tượng kết nối, 308

Chức năng [], mô -đun ngẫu nhiên, 255

Thuộc tính RowCount, của các đối tượng con trỏ, 299

Giao diện sax

Phương thức rpartition [], của chuỗi, 41 _ _rpow_ _ [] Phương thức, 61

Hàm SaveKey [], Mô -đun WinReg, 410

Phân tích cú pháp XML, 568 ví dụ về, 583

_ _rrshift_ _ [] phương thức, 61

Mở rộng quy mô, với sự đồng thời, 415

hàm rshift [], mô -đun toán tử, 274

Mô-đun lịch trình, 587-588

Phương thức _ _rshift_ _ [], phương thức 60 rsplit [], của chuỗi, 41, 43

người lập lịch, cho máy phát điện và coroutines, 447

Phương thức rstrip [], của chuỗi, 43

Thuộc tính sơ đồ

_ _rsub_ _ [] Phương thức, 60 _ _ _rtruedIV_ _ [] Phương thức, 60 ruby, sự khác biệt trong hệ thống đối tượng, 124

của các đối tượng Urlparse, 520 đối tượng URLSplit, 521 ký hiệu khoa học, điểm nổi, 27

Chạy lệnh gỡ lỗi, mô -đun PDB, 189

F

H lib

fl

B

d

ff

trình tự

Quy tắc phạm vi

và nhập mô mô, 145 và tham số tự trong các phương thức, 118 phạm vi từ vựng của các hàm, 97 lớp, 118 biến chức năng, 18, 96 biến số trong danh sách hiểu, 109 của các biến lặp các mô -đun, hàm tìm kiếm [] 147, mô -đun RE, phương thức search [], của các đối tượng regex, 285 tìm kiếm, chuỗi có phần bù, 41

699

Đối tượng Semaphore

Mô -đun đa xử lý, mô -đun luồng 427, 439 đối tượng semaphore, sử dụng để báo hiệu, phương thức 439 semaphore [], của các đối tượng trình quản lý, 429 semicolon;

của của của của của của

Đối tượng kết nối, 422 đối tượng HTTPConnection, 503 đối tượng điều phối, 456 máy phát, 20, 53, 104 đối tượng ổ cắm, 484

thuộc tính thứ hai, của các đối tượng thời gian, 338

Phương thức send_bytes [], của các đối tượng kết nối, 422

Phương thức phần [], của các đối tượng ConfigParser, 334

Phương thức send_error [], của các đối tượng BaseHttprequestHandler, 509

Lớp ổ cắm an toàn [SSL], 486

Phương thức send_header [], của các đối tượng basehttprequesthandler, 509

Bảo vệ

Máy chủ XML-RPC, truy vấn cơ sở dữ liệu 530, mô-đun 300 nguyên soái, mô-đun Pickle 226, hàm 172, 229 hạt giống []

của các đối tượng iobase, 350 tệp, 160-161, 352 đối tượng MMAP, 371

Phương thức send_response [], của các đối tượng BaseHttprequestHandler, phương thức 509 send_signal [], của các đối tượng popen, phương thức 403 sendall [], của các đối tượng ổ cắm, 484 sendcmd [] phương thức, của các đối tượng ftp, 499 .

Phương thức Seekable [], của các đối tượng iObase, 350

Phương thức sendto [], của các đối tượng ổ cắm, 484

Chọn Mô -đun, 415, 459

Sentinel, sử dụng với xếp hàng, 420, 446

Xử lý tín hiệu, chức năng 399 select []

và mô -đun Asyncore, 455 vấn đề về hiệu suất, 467 chọn Mô -đun, 459 tham số của các phương thức, 22, 118

Tại sao được yêu cầu, thuộc tính 119 _ _ self_ _

của các chức năng tích hợp, 49 phương pháp, 49

Đối số từ khóa SEP, hàm in [], biến 163 SEP, mô -đun hệ điều hành, ký tự phân tách 386, hàm in [], 163 chuỗi cơ sở trừu tượng, 266 chuỗi, 39

So sánh, 70 Concatenation, 67 cắt kéo dài, 68 trong toán tử, 67 lập chỉ mục trong định dạng chuỗi, 72 mục gán, 40

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

700

trình tự

Quy tắc phạm vi

và nhập mô mô, 145 và tham số tự trong các phương thức, 118 phạm vi từ vựng của các hàm, 97 lớp, 118 biến chức năng, 18, 96 biến số trong danh sách hiểu, 109 của các biến lặp các mô -đun, hàm tìm kiếm [] 147, mô -đun RE, phương thức search [], của các đối tượng regex, 285 tìm kiếm, chuỗi có phần bù, 41

Ví dụ TCP, ví dụ 451 UDP, 485 Ví dụ về hạn chế quyền truy cập với HTTP, 507 Ví dụ với mô -đun socketserver, 490 Ví dụ với coroutines, 464 Server_address thuộc tính

của lớp BaseHttprequestHandler, 508 của lớp httprequestHandler, hàm 507 serverProxy [], mô -đun XMLRPC.Client, 524 Đặt lớp cơ sở trừu tượng, 266 SET Hiểu, Python 3, 623 SET ADY CHÍNH XÁC 3, 622

đặt [] phương thức

của của của

Đối tượng Cấu hình, 334 đối tượng phần tử, 577 đối tượng sự kiện, 440 đối tượng morsel, 512

_ _set_ _ [] Phương thức, của các mô tả, 58, 126 set_Authorizer [] Phương thức, của các đối tượng kết nối, phương thức 306 set_boundary [], của các đối tượng tin nhắn, 556 set_charset [] Phương thức . 435 set_last_error [] hàm, mô -đun ctypes, phương thức 618 set_param [], của các đối tượng tin nhắn, phương thức 556 set_pasv [], của các đối tượng ftp, 499 set_payload [] phương thức set_proxy [] phương thức, của các đối tượng yêu cầu, 517 set_server_documentation [] Phương thức, của phương thức xmlrpcserver, 528 set_server_name [] Phương thức

Đặt toán tử khác biệt đối xứng ^, 75

set_terminator [] phương thức, của các đối tượng asynchat, 453

Đặt lý thuyết, sự tương đồng với danh sách toàn diện, 110

set_threshold [] hàm, mô -đun GC, 221

Đặt loại, 38, 46, 75 Set Union Toán tử |, 75

Set_trace [] hàm, Mô -đun PDB, phương thức 186 set_type [], của các đối tượng tin nhắn, 557

đặt [] hàm, 15, 77, 210

F

H lib

fl

B

d

ff

Phương thức setTimeout [], của các đối tượng ổ cắm

set_unixfrom [] Phương thức, của các đối tượng tin nhắn, phương thức 557 set_usage [], của các đối tượng tùy chọnParpser, chức năng 377 set_wakeup_fd [], mô -đun tín hiệu, chức năng 399 setAttr [], 210

và các thuộc tính riêng tư, phương thức 128 _ _setAttr_ _ [], 57-58, 131

và _ _SLOTS_ _, 133 setBlocking [] phương thức, của các đối tượng ổ cắm, hàm 484 setCheckInterval [], mô -đun sys, 235 setContext [] hàm, mô -đun thập phân

của dicts, 45 đối tượng Dicts và DefaultDict, 263 function setDefaultEncoding [], mô -đun SYS, 235 setDefaultEncoding [], mô -đun SYS, hàm 177 setDefaultTimeout [] Phương thức, của các đối tượng ContentHandler, hàm 581 setegid [], mô -đun HĐH, hàm 380 seteuid [], mô -đun OS, 380 setFormatter [] phương thức, của các đối tượng xử lý, 365

701

Phương thức setLevel []

của các đối tượng xử lý, 364 đối tượng logger, hàm 359 setMode [], mô -đun msvcrt, phương thức setName [] 373 [] hàm, mô -đun hệ điều hành, hàm 381 setpgrp [], mô -đun OS

Mô -đun SYS, mô -đun luồng 235, hàm 444 SetRecursionLimit [], Mô -đun SYS, hàm 235 setRegid [], mô -đun OS, hàm 381 setReuid []

Thêm các mục, 15 Tạo từ các đối tượng Itable, 46 toán tử khác biệt, 15 bình đẳng, 78 sửa đổi tại chỗ, 47 toán tử giao nhau, 15 chiều dài, 75 mục xóa, 15 toán tử khác biệt đối xứng, 15 toán tử công đoàn, 15 cập nhật, 15

hàm setgid [], mô -đun hệ điều hành, 380

hàm setsid [], mô -đun hệ điều hành, 381

hàm setgroups [], mô -đun hệ điều hành, 380

hàm setSlice [], mô -đun toán tử, 274

Phương thức setInputSize [], của các đối tượng con trỏ, 299

Phương thức setsockopt [], của các đối tượng ổ cắm, 484

hàm setItem [], mô -đun toán tử, 274

_ _setState_ _ [] Phương thức, 228

Phương pháp _ _setItem_ _ [], 58-59

và các lát, chức năng 59 setitimer [], mô -đun tín hiệu, 399

hàm setstate [], mô -đun ngẫu nhiên, 254

và sao chép, mô -đun 220 và Pickle, 172 @setter Trang trí thuộc tính, phương thức 126 SetTimeout [], của các đối tượng ổ cắm, 484

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

702

Phương thức setTimeout [], của các đối tượng ổ cắm

set_unixfrom [] Phương thức, của các đối tượng tin nhắn, phương thức 557 set_usage [], của các đối tượng tùy chọnParpser, chức năng 377 set_wakeup_fd [], mô -đun tín hiệu, chức năng 399 setAttr [], 210

và các thuộc tính riêng tư, phương thức 128 _ _setAttr_ _ [], 57-58, 131

và _ _SLOTS_ _, 133 setBlocking [] phương thức, của các đối tượng ổ cắm, hàm 484 setCheckInterval [], mô -đun sys, 235 setContext [] hàm, mô -đun thập phân

của dicts, 45 đối tượng Dicts và DefaultDict, 263 function setDefaultEncoding [], mô -đun SYS, 235 setDefaultEncoding [], mô -đun SYS, hàm 177 setDefaultTimeout [] Phương thức, của các đối tượng ContentHandler, hàm 581 setegid [], mô -đun HĐH, hàm 380 seteuid [], mô -đun OS, 380 setFormatter [] phương thức, của các đối tượng xử lý, 365

Mô-đun DBHASH, 311 Chọn giao thức Pickle, mô-đun 172 Shlex, 588 Đánh giá ngắn mạch, biểu thức Boolean, 78 Hàm ShowWarning [], Mô-đun cảnh báo, 239

Hàm Setup [], Mô -đun Distutils, 152, 596

hàm shuffle [], mô -đun ngẫu nhiên, 255

Phương thức setup [], của các đối tượng cơ bản, 490

Hàm Shutdown [], Mô -đun ghi nhật ký, 366

tập tin setup.py

Các phần mở rộng C, 596 phần mở rộng Swig, 620 và Setuptools, 154 Tạo, Lệnh cài đặt 152-153, Cài đặt 153-154 trong thư mục trang web trên mỗi người dùng, 178

Phương thức tắt []

của các đối tượng Basemanager, 431 đối tượng socketserver, 492 đối tượng ổ cắm, mô -đun 484, 318 tác dụng phụ

Trong các chức năng, 95 lý do để tránh, 96

Thư viện Setuptools, 147, 154

Tên tín hiệu Sig*, 400

Hàm setValue [], mô -đun WinReg, 411

Tín hiệu thở dài, 179

Chức năng setValueex [], mô -đun WinReg, 411

hàm siginterrupt [], mô -đun tín hiệu, 400

hàm sha1 [], mô -đun Hashlib, 559

Xử lý tín hiệu, 399

hàm sha224 [], mô -đun Hashlib, 559

Mô -đun tín hiệu, 399

hàm sha256 [], mô -đun Hashlib, 559

Hàm tín hiệu [], mô -đun tín hiệu, 400

hàm sha384 [], mô -đun Hashlib, 559

báo hiệu, với semaphores, 439

hàm sha512 [], mô -đun Hashlib, 559

tín hiệu

bản sao nông, 36

của Dicts, 45 danh sách, 40 bản sao trình tự, 67 mảng chia sẻ, mô -đun đa xử lý, 426 thư viện chia sẻ

Các mô -đun mở rộng, tải 148 với CTYPE, bộ nhớ chia sẻ 612

Ví dụ về việc truyền một danh sách, mô -đun đa xử lý 427, chia sẻ 426 đối tượng, lớp 35, mô -đun kệ, 311 lệnh shell

Thu thập sản lượng từ, 331 mô phỏng ở Python, 318

Đóng [] Phương thức của các máy phát, 104 Danh sách, 400 pha trộn với các luồng, phương thức máy phát điện 402 ném [], hàm 105 sigterm, 179 simple_producer [] hàm, mô -đun asynchat, 453 simpleCookie [] .

F

H lib

fl

B

d

ff

sắp xếp

Mô -đun đơn giản, mô -đun 527 sin [], mô -đun toán học, 252

703

của các định nghĩa lớp, 132 tối ưu hóa, 196

Điểm nổi chính xác duy nhất, 39

Smalltalk, sự khác biệt trong hệ thống đối tượng, 124

singleton tuple, 14 sinh [] hàm, mô -đun toán học, 252

Giao thức SMTP, ví dụ về việc gửi tin nhắn, 514

Tệp cấu hình trang web, 177

Hàm smtp [], mô -đun smtplib, 514

Mô -đun trang web, 166, 174, 177

Mô -đun SMTPD, 587

Thư mục gói trang web, 175

Lớp Smtphandler, Mô -đun ghi nhật ký, 363

Mô -đun Sitecustomize, 177

Mô -đun Smtplib, 513

thuộc tính kích thước

Mô -đun SNDHDR, 588

của các đối tượng cấu trúc, 291 đối tượng Tarinfo, Phương thức [] [] Phương thức []

của các đối tượng FTP, 499 đối tượng MMAP, 371

Phương thức Sniff [], của các đối tượng sniffer, hàm 550 sniffer [], mô -đun CSV, các tùy chọn ổ cắm 550 SO_*, mô -đun ổ cắm, hằng số 479 sock_*

Lớp cơ sở trừu tượng có kích thước, 265

thuộc tính ổ cắm, của các đối tượng socketserver, 492

hàm sizeOf [], mô -đun Ctypes, 618

Mô -đun ổ cắm, 469

Phương thức bỏ qua [], của các đối tượng ContentHandler, 581

hàm [] hàm, mô -đun ổ cắm, 476

Chức năng ngủ [], mô -đun thời gian, 406

thuộc tính socket_type, của lớp socketserver, 493

Ngủ, 406

Cho đến khi nhận được tín hiệu, 399

Ổ cắm, định nghĩa của, 449

Lớp học sockethandler, mô -đun ghi nhật ký, 363

Phân công lát cắt, danh sách, 12

hàm socketpair [], mô -đun ổ cắm, 477

Đối tượng lát, 51, 53

ổ cắm

và các phương thức lập chỉ mục, 59 thuộc tính của, 54 loại lát, hàm 51 lát [], 53, 210 lát, 39

và các phương pháp đặc biệt, các đối tượng 59 và xrange, 44 gán cho, 40, 69 xóa, 40, 69 đa chiều, 59 toán tử cắt lát [:], 67-68

Trên danh sách, 12 trên chuỗi, thuộc tính 11 _ _slots_ _

và _ _dict_ _ thuộc tính của các trường hợp, 50 khả năng tương thích với mã khác, 133 kế thừa, 133

Địa chỉ các họ, 470 phương thức trên, 478 bỏ phiếu với select [], 459 chỉ định địa chỉ mạng, 471 loại, mô -đun 470 socketserver, 489

và Python 3, 489 Thay đổi tham số máy chủ, thuộc tính 492 softspace, của các tệp, phương thức 161 sort [], của danh sách, hàm 40-41 được sắp xếp []

Thay đổi hành vi của, 40 tại chỗ trong danh sách, 40 yêu cầu cho các đối tượng, 57 thứ tự ngược lại, 40 sử dụng mô-đun toán tử, 275

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

704

sắp xếp

Mô -đun đơn giản, mô -đun 527 sin [], mô -đun toán học, 252

của các định nghĩa lớp, 132 tối ưu hóa, 196

Điểm nổi chính xác duy nhất, 39

Smalltalk, sự khác biệt trong hệ thống đối tượng, 124

singleton tuple, 14 sinh [] hàm, mô -đun toán học, 252

Giao thức SMTP, ví dụ về việc gửi tin nhắn, 514

Tệp cấu hình trang web, 177

Hàm smtp [], mô -đun smtplib, 514

spawnlp[] function, os module, 393

Stackless Python, 467

spawnlpe[] function, os module, 393

standard I/O streams, 161

spawnv[] function, os module, 392 spawnve[] function, os module, 393 spawnvp[] function, os module, 393 spawnvpe[] function, os module, 393 special methods, 21, 54 special symbols, 30 speedup, definition of, 192 split[] function

os.path module, 398 re module, 284 split[] method

of Regex objects, 285 of strings, 14, 41, 43 splitdrive[] function, os.path module, 398 splitext[] function, os.path module, 398 splitlines[] method, of strings, 44 splitting, strings, 14, 43 splitunc[] function, os.path module, 398 SpooledTemporaryFile[] function, tempfile module, 324 sprintf[] function equivalent, 70 spwd module, 587 SQL queries

SQL injection attack, 300 examples of, 309 executing on database, 297 how to form, 300 similarity to list comprehensions, 111 SQLite database, 303 sqlite3 module, 303 sqrt[] function, math module, 252 sqrt[] method, of Decimal objects, 243 ssl module, 486 SSL, example of creating certificates, 489

stack[] function, inspect module, 225

and integrated development environments, 162 setting the default encoding, 175 standard error, 157 standard input and output, 10 standard library reorganization, Python 3, 634 standard_b64decode[] function, base64 module, 546 standard_b64encode[] function, base64 module, 546 StandardError exception, 87 starmap[] function, itertools module, 272 start attribute, of slices, 54 start[] method

of BaseManager objects, 431 of MatchObject objects, 286 of Process objects, 416 of Thread objects, 436 of Timer objects, 438 of TreeBuilder objects, 577 startDocument[] method, of ContentHandler objects, 582 startElement[] method, of ContentHandler objects, 582 startElementNS[] method, of ContentHandler objects, 582 startfile[] function, os module, 393 startPrefixMapping[] method, of ContentHandler objects, 582 startswith[] method, of strings, 44 startup script, in interactive mode, 174 stat module, 387, 587 stat[] function

os module, 388 os.path module, 398

st_* attributes, of stat objects, 389

F

h Lib

fL

B

d

ff

strings

stat_float_times[] function, os module, 389 statement termination, 7

and semicolons, 7 statements

breaking across multiple lines, 9 putting on the same line, 25-26 running in the debugger, 186 static method, 22, 48, 123, 125

practical use of, 123 @staticmethod decorator, 22, 48, 123, 125, 210

705

StreamRequestHandler class, SocketServer module, 491 streams, 470 StreamWriter class, codecs module, 278 streamwriter[] method, of CodecInfo objects, 278 strerror[] function, os module, 381 strftime[] function, time module, 406 strftime[] method

of date objects, 337 of time objects, 338

statistics, random number distributions, 255

‘strict’ error handling, Unicode encoding, 166

status attribute, of HTTPResponse objects, 504

string attribute, of MatchObject objects, 286

statvfs[] function, os module, 389

string formatting, 70

stderr attribute, of Popen objects, 404 stderr variable, sys module, 161, 232 _ _stderr_ _ variable, sys module, 162, 232 stdin attribute, of Popen objects, 404 stdin variable, sys module, 10, 161, 232 _ _stdin_ _ variable, sys module, 162, 232 stdout attribute, of Popen objects, 404 stdout variable, sys module, 10, 161, 232 _ _stdout_ _ variable, sys module, 162, 232 step attribute, of slices, 54 StopIteration exception, 59, 87, 215

and generators, 103 storbinary[] method, of FTP objects, 499 storlines[] method, of FTP objects, 499 str type, 38 str[] function, 11, 56, 76, 210

and print, 162 difference from repr[], 12 _ _str_ _[] method, 55-56

!r specifier, 74 !s specifier, 74 alignment, 73 attribute lookup, 72 codes for % operator, 70-71 customizing format[] method, 74 dictionaries, 72 dictionary lookup, 72 fill characters, 73 format specifiers, 72 formatting operator %, 70 string interpolation, 72, 163 string literals, 27

Unicode characters, 28 and Unicode encodings, 29 and documentation strings, 30 byte strings, 29 unicode characters in source code, 31 string module, 287

Template strings, 164

StreamError exception, tarfile module, 322

string_at[] function, ctypes module, 618

StreamHandler class, logging module, 363

StringIO class, io module, 353

StreamReader class, codecs module, 278

stringprep module, 586

streamreader[] method, of CodecInfo objects, 278

strings, 11

Unicode, 41, 165 and numeric calculations, 11

How can we make this index more useful? Email us at [email protected]

F

h Lib

fL

B

d

ff

706

strings

as a dictionary key, 16 as in-memory text files, 353 as sequences, 39 basestring object for type checking, 202 byte literals, 29 byte strings, 41, 202 case conversion, 43-44 character substitution, 42 comparison of, 70 concatenation, 11 concatenation of adjacent literals, 27 creating custom formatters, 288 disabling escape codes in literals, 29 encoding for URLs, 522 escape codes in literals, 27 escaping characters for use in HTML, 536 escaping characters for use in XML, 583 executing Python code contained within, 115 format[] method, 8, 72 formatting, 8, 42 formatting in log messages, 358 immutability of, 41, 69 indexing, 11 internal representation, 28 iterating over characters, 17 joining, 43 line structure, 11 mixing byte strings and Unicode, 70 mutable byte arrays, 202 partitioning, 41 regular expressions, 281 replacing substrings, 41 searching for substrings, 41 slices, 11 sorting and internationalization, 70 specifiers for format[] method, 72-73 splitting, 43 splitting into fields, 14, 41 stripping, 43 unescaping XML character references, 583 strip[] method, of strings, 44

tước

Kiểm soát các ký tự từ một chuỗi, 42 chuỗi, hàm 44 strptime [], mô -đun thời gian, 343, 407 strptime [], của lớp DateTime, lớp cấu trúc 339, mô -đun cấu trúc, mô -đun cấu trúc 291, lớp cấu trúc 290, mô -đun , và bộ dữ liệu, hàm 14 [] hàm

Mô -đun toán tử, mô -đun 273 RE, phương thức 284 sub [], của các đối tượng regex, phương thức 285 _ _sub_ _ [], 60 lớp con, 119 _ _subClassCheck_ _ [] Phương thức hàm, xml.etree.elementtree mô -đun, 575 subn [] funct

của các đối tượng mẫu, 289 chuỗi mẫu, 164 chuỗi con

Kiểm tra sự tồn tại bằng cách sử dụng trong, 69 Tìm kiếm, 41 toán tử trừ -, 65 phương thức Sucessful [], của các đối tượng Asyncresult, hàm 425 sum [], 39-40, 67, 210

Độ chính xác của, mô -đun 252 và thập phân, 69 hạn chế dữ liệu số, 39 so với hàm math.fsum [], mô -đun 252 Sunau, hàm 588 Super [], 120, 210

Python 3, 210, 627 Superclass, 119

Phương thức gọi trong hàm 120 Super [], 120

F

H lib

fl

B

d

ff

Đối tượng Tarinfo, mô -đun Tarfile

707

Hỗ trợ cả Python 2 và 3, 638

Biến Sys.Prefix, 177

Biến hỗ trợ_unicode_filenames, mô -đun OS.Path, 398

Biến sys.ps1, 176

Cặp thay thế, 28, 41

Biến sys.stderr, 157, 161

Đình chỉ, của các chủ đề, 443

Biến sys.stdin, 161

Phương thức hoán đổi [], của chuỗi, 44

Biến sys.stdout, 161

Swig, 591

Thuộc tính SYS_Version, của lớp BaseHttprequestHandler, 508

Ví dụ về, tệp giao diện 619, 619

Biến sys.ps2, 176

hàm sysconf [], mô -đun hệ điều hành, 395

Tuyên bố chuyển đổi, thiếu, 9

Mô -đun Syslog, 587

Mô -đun biểu tượng, 586

Lớp sysloghandler, mô -đun ghi nhật ký, 363

Liên kết tượng trưng, ​​kiểm tra tên tệp cho, 397

Cuộc gọi hệ thống, mô -đun HĐH, 378

hàm symlink [], mô -đun hệ điều hành, 389

Mã lỗi hệ thống, 344

Toán tử khác biệt đối xứng ^, của bộ, 15

Hàm hệ thống [], mô -đun hệ điều hành, 393

Phương thức symmetric_difference [], của các bộ, 46

Phương thức System.listmethods [], của các đối tượng ServerProxy, 525

Phương thức symmetric_difference_update [], của các bộ, 47

Ngoại lệ hệ thống, 87, 215

Phương pháp đồng bộ []

Ngoại lệ SystemExit, 7, 87-88, 157, 179, 215

của các đối tượng cơ sở dữ liệu kiểu DBM, 310 đối tượng kệ, 311

T

đồng bộ hóa nguyên thủy

Mô -đun đa xử lý, mô -đun luồng 427, 438 đồng bộ hóa

Phương thức gần [] của các máy phát điện, 104 chương trình đồng thời, 414 phương thức máy phát điện ném [], ngoại lệ 105 cú pháp, 87, 215

Tuyên bố in Python 3, 6 và đối số mặc định, 93 và ngoại trừ các câu lệnh, 85

-T Tùy chọn dòng lệnh, 26, 173-174 Mã thoát trong chuỗi, 28 thuộc tính tabcheck, của sys.flags, 230 ngoại lệ taberror, 26, 87, 215 Module Tabnanny, 586 tab và thụt lề, 26 Tag Thuộc tính, của phần tử Đối tượng, thuộc tính TagName 576, của các đối tượng phần tử DOM, thuộc tính đuôi 572, của các đối tượng phần tử, 576

Cảnh báo cú pháp, 216, 238

Lệnh đuôi, ví dụ với máy phát điện, 19

Mô -đun SYS, 13, 229

Tối ưu hóa Đuôi, Thiếu, 112

Biến sys.argv, 13, 157, 174

Hàm lấy [], mô -đun itertools, 272

sys.displayhook biến, 176

chức năng tan [], mô -đun toán học, 252

sys.exec_prefix biến, 177

hàm tanh [], mô -đun toán học, 252

Hàm sys.exit [], 179

Ngoại lệ Tarerror, Mô -đun Tarfile, 322

Sys.Modules biến, 144, 149

Đối tượng Tarfile, Mô -đun Tarfile, 320

Biến sys.path, 147

Mô -đun Tarfile, 319

và mô-đun trang web, 177 mô-đun bên thứ ba, 154

Đối tượng Tarinfo, Mô -đun Tarfile, 321

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

708

Đối tượng Tarinfo, mô -đun Tarfile

Hỗ trợ cả Python 2 và 3, 638

Biến Sys.Prefix, 177

Biến hỗ trợ_unicode_filenames, mô -đun OS.Path, 398

Biến sys.ps1, 176

Cặp thay thế, 28, 41

Biến sys.stderr, 157, 161

Đình chỉ, của các chủ đề, 443

Biến sys.stdin, 161

Phương thức hoán đổi [], của chuỗi, 44

Biến sys.stdout, 161

Swig, 591

Thuộc tính SYS_Version, của lớp BaseHttprequestHandler, 508

Ví dụ về, tệp giao diện 619, 619

Biến sys.ps2, 176

Lớp Tcpserver, Mô -đun máy chủ Sockets, 491

kiểm tra

hàm tcsetpgrp [], mô -đun hệ điều hành, phương thức 385 reverdown [] phương thức

Các đối tượng TestCase, 184 đối tượng TestCase, hàm 184 tee [], mô -đun itertools, phương thức 273 Tell []

của các đối tượng IOBASE, 350 tệp, 160-161 đối tượng MMAP, 371

Mô -đun DocTest, 181 Chuỗi tài liệu, 181 Hạn chế của DocTest, Thử nghiệm 183 đơn vị, 183 Chức năng TestMod []

Mô -đun doctest [], mô -đun 182 doctest, 182 testzip [] Phương thức, của các đối tượng zipfile, lớp 326 văn bản, xml.dom.minidom mô -đun, 572

Mô -đun Telnetlib, 587

Văn bản I/O, 353

Biến tempdir, mô -đun tempfile, 324

thuộc tính văn bản, của các đối tượng phần tử, 576

Mô -đun tempfile, 323

Chế độ tệp văn bản, 159

Lớp mẫu, mô -đun chuỗi, 289

thay thế văn bản, thay thế [] phương thức chuỗi, 41

Chuỗi mẫu

Mô -đun chuỗi, 164 Sử dụng trong tập lệnh CGI, thuộc tính mẫu 537, của các đối tượng mẫu, biến mẫu 290, mô -đun tempfile, 324 tệp tạm thời, 323 hàm tạm thời

Văn bản so với byte trong Python 3, 629 Text_Factory thuộc tính, của các đối tượng kết nối, lớp cơ sở trừu tượng 308 Textiobase, lớp 354 Textiowrapper, Mô-đun IO, mô-đun TextWrap 353, 586 thư viện của bên thứ ba và Python 3, 621

và mã C/C ++, Biến 154 và sys.path, 154

F

H lib

fl

B

d

ff

Biến thời gian, mô -đun thời gian

Cài đặt, 154 Cài đặt trong thư mục trang web trên mỗi người dùng, 154, 178 Con trỏ này, tham số của các phương thức, lớp 119, mô-đun luồng, thuộc tính 436, của các đối tượng bản ghi, mô-đun luồng 359, 436

Các nguyên thủy đồng bộ hóa, 438

709

Xử lý tín hiệu, 402 tín hiệu với các semaphores, 439 treo, 443 đồng bộ hóa, 414 chấm dứt, 443 ném [] Phương pháp máy phát điện, 105 sử dụng hàng đợi, 444 ví dụ về luồng công nhân, 446 biến an toàn, API cơ sở dữ liệu, 302

Lớp ThreadingMixin, Mô -đun máy chủ sockets, 494

Phương thức ném [], của máy phát điện, 53, 105-106

Lớp học ThreadingTcpserver, Mô -đun máy chủ Sockets, 494

lớp thời gian, mô -đun DateTime, 338

Lớp Threadingudpserver, mô -đun SocketServer, thuộc tính 494 ThreadName, của các đối tượng bản ghi, 359 Chủ đề

Các tác vụ ràng buộc CPU, 444 Thêm vào máy chủ mạng, 494 hoạt động nguyên tử và tháo gỡ, 193 khoảng thời gian kiểm tra, 234 Đóng [] Phương thức của máy phát điện, 104 so với Coroutines, 467 biến điều kiện, 441 Daemonic, 436 cơ sở dữ liệu Định nghĩa về, 413 sự kiện, 440 Mô -đun mở rộng, Khóa thông dịch viên toàn cầu 607, 414, 444 Lưu trữ cục bộ, 443 Chủ đề chính, 413 MUTEX LOCK Lập lịch, 414 semaphores, 439 cài đặt kích thước ngăn xếp, 444 cài đặt tên, 436

Thời gian và ngày phân tích cú pháp, thao tác thời gian 407, mô -đun thời gian 336, 191, 405

Độ chính xác của các hàm thời gian, 408 thời gian hiện tại, phân tích thời gian 405, hàm 343 thời gian [], API cơ sở dữ liệu, hàm 301 Time [], Mô -đun thời gian, Phương thức 191, 407 [], của các đối tượng DateTime, lớp 340 Timedela, Mô -đun DateTime, 340 Lớp TimedRotatingFileHandler, Mô -đun ghi nhật ký, hàm 363 TimeFromTicks [], API cơ sở dữ liệu, mô -đun thời gian 301, hàm 191 Timeit []

Mô -đun CPROFILE, mô -đun thời gian 190, thuộc tính thời gian chờ 191, của lớp máy chủ socket [] Hàm, API cơ sở dữ liệu, chức năng 301 dấu thời gian

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

710

Biến thời gian, mô -đun thời gian

Cài đặt, 154 Cài đặt trong thư mục trang web trên mỗi người dùng, 154, 178 Con trỏ này, tham số của các phương thức, lớp 119, mô-đun luồng, thuộc tính 436, của các đối tượng bản ghi, mô-đun luồng 359, 436

Các nguyên thủy đồng bộ hóa, 438

Xử lý tín hiệu, 402 tín hiệu với các semaphores, 439 treo, 443 đồng bộ hóa, 414 chấm dứt, 443 ném [] Phương pháp máy phát điện, 105 sử dụng hàng đợi, 444 ví dụ về luồng công nhân, 446 biến an toàn, API cơ sở dữ liệu, 302

Lớp ThreadingMixin, Mô -đun máy chủ sockets, 494

Phương thức ném [], của máy phát điện, 53, 105-106

Lớp học ThreadingTcpserver, Mô -đun máy chủ Sockets, 494

lớp thời gian, mô -đun DateTime, 338

Lớp Threadingudpserver, mô -đun SocketServer, thuộc tính 494 ThreadName, của các đối tượng bản ghi, 359 Chủ đề

Các tác vụ ràng buộc CPU, 444 Thêm vào máy chủ mạng, 494 hoạt động nguyên tử và tháo gỡ, 193 khoảng thời gian kiểm tra, 234 Đóng [] Phương thức của máy phát điện, 104 so với Coroutines, 467 biến điều kiện, 441 Daemonic, 436 cơ sở dữ liệu Định nghĩa về, 413 sự kiện, 440 Mô -đun mở rộng, Khóa thông dịch viên toàn cầu 607, 414, 444 Lưu trữ cục bộ, 443 Chủ đề chính, 413 MUTEX LOCK Lập lịch, 414 semaphores, 439 cài đặt kích thước ngăn xếp, 444 cài đặt tên, 436

Thời gian và ngày phân tích cú pháp, thao tác thời gian 407, mô -đun thời gian 336, 191, 405

Độ chính xác của các hàm thời gian, 408 thời gian hiện tại, phân tích thời gian 405, hàm 343 thời gian [], API cơ sở dữ liệu, hàm 301 Time [], Mô -đun thời gian, Phương thức 191, 407 [], của các đối tượng DateTime, lớp 340 Timedela, Mô -đun DateTime, 340 Lớp TimedRotatingFileHandler, Mô -đun ghi nhật ký, hàm 363 TimeFromTicks [], API cơ sở dữ liệu, mô -đun thời gian 301, hàm 191 Timeit []

Mô -đun CPROFILE, mô -đun thời gian 190, thuộc tính thời gian chờ 191, của lớp máy chủ socket [] Hàm, API cơ sở dữ liệu, chức năng 301 dấu thời gian

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

đo thời gian

Đo thời gian, giao thức TIPC 191, 470

Định dạng địa chỉ, 472 Tipc_* Hằng số, Mô -đun ổ cắm, Phương thức 473 Tiêu đề [], của chuỗi, 44

Chức năng của TreeBuilder [], xml.etree.elementtree mô-đun, 577 hàm hình tam giác [], mô-đun ngẫu nhiên, 256 chuỗi được trích xuất ba, 11

và nội suy biến, 163

Phương thức toString [], của các đối tượng mảng, 260

Chức năng Truth [], Mô -đun toán tử, 274

Thuộc tính Total_Changes, của các đối tượng kết nối, 308

Tuyên bố thử, 22, 84-85

Phương thức tounicode [], của các đối tượng mảng, 260

Mô -đun Tty, 587

Phương thức ToxMl [], của các đối tượng nút dom, 573

hàm ttyname [], mô -đun hệ điều hành, 385

Chức năng Trace [], Kiểm tra mô -đun, 225

Chiến lược điều chỉnh, 194

tin nhắn theo dõi, 22

loại tuple, 38

Mô -đun theo dõi, 235

Tuple giải nén, và for-loops, 15

Đối tượng Traceback, 51-52

hàm tuple [], 77, 211

Các thuộc tính của, 53 khung ngăn xếp, 53 _ _traceBack_ _ thuộc tính, của các đối tượng ngoại lệ, biến TracebackLimit, mô -đun SYS, 232 Tracebacks

Tạo với mô -đun Traceback, 236 giới hạn lượng đầu ra, 232 Tracebacktype, 51, 237 Trailing J trên các chữ số phức tạp, 27 Trailing L trên các số nguyên dài, 27 dấu phẩy kéo dài

và các bộ dữ liệu, 14 câu lệnh in, 162 TransferCmd [] Phương thức, của các đối tượng FTP, 500 Phương thức dịch [], của chuỗi, 42, 44 thuộc tính bẫy, của các đối tượng ngữ cảnh, 247

Giá trị sự thật, 9

-TT Tùy chọn dòng lệnh, 26, 173-174

Tuples, 14

và định dạng chuỗi, 70 là khóa từ điển, 16 là khóa từ điển, 74 là trình tự, 39 so sánh trên, 70 kết hợp, 14 Tạo một danh sách từ từ điển, 45 tạo với các thuộc tính được đặt tên, 264 tính bất biến, 14 tính bất biến của, 69 lập chỉ mục, 14 Tiết kiệm bộ nhớ, 14 thiếu sót của parantheses, 14 vấn đề với việc sử dụng làm cấu trúc dữ liệu, 264 đại diện cho hồ sơ, 14 singleton, 14

F

H lib

fl

B

d

ff

Nhà điều hành Unary Plus +

Cắt, 14 việc giải nén trong Python 3, 623 Giải nén trong Lặp lại, 82 Sử dụng bởi Thư viện tiêu chuẩn, 265 Sử dụng trong Danh sách Tolectensions, 109 so với danh sách, 14 Thư viện xoắn, 415, 467 Danh sách hai chiều, 13, 15 loại, 47

của các đối tượng FieldStorage, 535 đối tượng Tarinfo, 322 đối tượng ổ cắm, kiểm tra loại 484

Ví dụ với metaclass, 140 đối tượng, 34 tác động hiệu suất của, 34 vấn đề với các đối tượng proxy, 135

loại

Boolean, 38 tích hợp, 37, 201 có thể gọi được, 47 từ điển, 44 điểm nổi, 38 frozenset, 46 số nguyên, 38 ổ cắm, 470 set, 46 loại, 47 thuộc tính Tzinfo, của các đối tượng thời gian, biến đổi 338 tzname, Mô-đun thời gian , Phương thức 405 tzName []

của các đối tượng thời gian, 339 đối tượng Tzinfo, hàm 342 Tzset [], Mô -đun thời gian, 407

U

Loại ép buộc và quá tải toán tử, so sánh 134 đối tượng, chuyển đổi loại 34, 76

Thiếu chuyển đổi ngầm, 62 cột trong DataFile, 37 Phương pháp đặc biệt cho, 62

711

\ U thoát mã, theo chuỗi, mã thoát 28 \ u, trong chuỗi, tùy chọn dòng lệnh 28 -U, hàm 28, 173 u, để mở [] hàm

Loại phân cấp, 138

Tùy chọn dòng lệnh -U, 173

Nhập đối tượng, 50

U [p] Lệnh gỡ lỗi, mô -đun PDB, 189

loại đối tượng, 33

Ví dụ về máy khách UDP, 486

loại [] hàm, 34, 211

Giao tiếp UDP, Sơ đồ, 451

và ngoại lệ, 89

Giao thức UDP, 449

loại [] metaclass, 138

Ví dụ về máy chủ UDP, 485

Thuộc tính Type_options, của các đối tượng FieldStorage, 535

Lớp Udpserver, Mô -đun máy chủ Sockets, 491

Thuộc tính kiểu chữ, của các đối tượng mảng, 259

thuộc tính uid, của các đối tượng Tarinfo, 322

Ngoại lệ kiểu kiểu, 87, 215

hàm umask [], mô -đun hệ điều hành, 381

và các cuộc gọi chức năng, 94 và loại ép buộc, 62 thứ tự phân giải phương thức, mô -đun 122 loại, 47, 237

và Python 3, 237

Lệnh gỡ lỗi Unalias, Mô -đun PDB, Thuộc tính 189 Uname, của các đối tượng Tarinfo, chức năng 322 uname [], mô -đun OS, 381 toán tử trừ Unary -, 65 unary Plus Toán tử +, 65

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Nhà điều hành Unary Plus +

712

Cắt, 14 việc giải nén trong Python 3, 623 Giải nén trong Lặp lại, 82 Sử dụng bởi Thư viện tiêu chuẩn, 265 Sử dụng trong Danh sách Tolectensions, 109 so với danh sách, 14 Thư viện xoắn, 415, 467 Danh sách hai chiều, 13, 15 loại, 47

của các đối tượng FieldStorage, 535 đối tượng Tarinfo, 322 đối tượng ổ cắm, kiểm tra loại 484

Ví dụ với metaclass, 140 đối tượng, 34 tác động hiệu suất của, 34 vấn đề với các đối tượng proxy, 135

loại

Boolean, 38 tích hợp, 37, 201 có thể gọi được, 47 từ điển, 44 điểm nổi, 38 frozenset, 46 số nguyên, 38 ổ cắm, 470 set, 46 loại, 47 thuộc tính Tzinfo, của các đối tượng thời gian, biến đổi 338 tzname, Mô-đun thời gian , Phương thức 405 tzName []

của các đối tượng thời gian, 339 đối tượng Tzinfo, hàm 342 Tzset [], Mô -đun thời gian, 407

U

Loại ép buộc và quá tải toán tử, so sánh 134 đối tượng, chuyển đổi loại 34, 76

Thiếu chuyển đổi ngầm, 62 cột trong DataFile, 37 Phương pháp đặc biệt cho, 62

\ U thoát mã, theo chuỗi, mã thoát 28 \ u, trong chuỗi, tùy chọn dòng lệnh 28 -U, hàm 28, 173 u, để mở [] hàm

Loại phân cấp, 138

Tùy chọn dòng lệnh -U, 173

và Python 3, 211 Unicode

Python 2 so với Python 3, 28 và BOM ký tự, 168 và XML, điểm đánh dấu thứ tự byte 168, mã hóa và giải mã ký tự 280, 42 thuộc tính ký tự cơ sở dữ liệu, 170 điểm mã, 28 mã hóa phổ biến, 168-169 mã nguồn, 31 tệp I/O, 167 trộn với chuỗi byte, 70

Sự thống nhất của số nguyên và các loại dài, 38 nguyên tắc truy cập thống nhất, 125 mảng loại đồng đều, hàm 259 đồng nhất [], mô -đun ngẫu nhiên, 255 ExplementedFileMode Exception, HTTP.Client Module, 504 Union Class, CTYPES Module, 614 Union Toán tử | Phương pháp 15 Union [], của các bộ, thử nghiệm 46 đơn vị

Python 3 Di cư, ví dụ 635, mô -đun 184 Unittest, 183 Mô -đun Unittest, 183

Ví dụ, 184 Chế độ dòng mới phổ quát, giao thức miền UNIX 159, 470

Định dạng địa chỉ, Nhật ký hệ thống UNIX 472, thông báo phát hành, 363 UNIX

#! Thực hiện các chương trình, 6 thư mục trang web trên mỗi người dùng, định nghĩa kỷ nguyên thời gian, lớp 405 UNIXDATAGRAMSERVER, MODULE SOCKETSERVER, 491 UNIXSTREAMERSER, MODULE SOCKETSERVER, 491 UnknownHandler Class, Urllib.Request Module, 518

F

H lib

fl

B

d

ff

Cảnh báo của người dùng

Ngoại lệ không xác định, mô -đun http.client, 504

Phương pháp trên [], của chuỗi, 44

Ngoại lệ không xác định

hàm urandom [], mô -đun hệ điều hành, 396

Chức năng hủy liên kết [], Mô -đun HĐH, 390 Mô -đun dỡ hàng, 149

713

Biến đại từ, mô -đun chuỗi, hàm urldefrag [], mô -đun urllib.parse, 521

Hàm giải nén [], mô -đun cấu trúc, 290

hàm urlencode [], mô -đun urllib.parse, 522

Phương thức giải nén [], của các đối tượng cấu trúc, 291

Ngoại lệ URLERROR, 516

Chức năng unpack_from [], mô -đun cấu trúc, phương thức 291 unpack_from [], của các đối tượng struct, 291 giải nén

Cấu trúc dữ liệu nhị phân, 290 trình tự, 67-68 bộ dữ liệu, 14

Mô -đun urllib.Error, hàm 523 urljoin [], mô -đun urllib.parse, mô -đun 521 urllib, 522

Xem Urllib.Request, Gói 515 Urllib, 514 Urllib.Error Module, 523 Urllib.Parse Module, 520

Lớp Unpickler, mô -đun Pickle, 228

Mô -đun Urllib.Request, 515

hàm unters [], mô -đun urllib.parse, 522

Mô -đun Urllib.Response, 520

hàm unquote_plus [], mô -đun urllib.parse, 522

Mô -đun Urllib2, xem Urllib.Request, 515

Mô -đun Urllib.robotparser, 523

hàm unquote_to_bytes [], mô -đun urllib.parse, 522

hàm urlopen [], mô -đun urllib.request, 515

Phương pháp unpister [], của các đối tượng thăm dò ý kiến, 460

Mô -đun Urlparse, 520

hàm unregister_dislect [], mô -đun CSV, 551

hàm urlparse [], mô -đun urllib.parse, 520

hàm unsetenv [], mô -đun hệ điều hành, 381

hàm urlsafe_b64decode [], mô -đun base64, 546

Cho đến khi lệnh trình gỡ lỗi, mô -đun PDB, thuộc tính 189 uned_data, của các đối tượng giải mã

của của của

Dicts, 45 đối tượng tiêu hóa, 559 đối tượng HMAC, 560 bộ, 15, 47

hàm urlsafe_b64encode [], mô -đun base64, hàm 546 urlsplit [], mô -đun urllib.parse, 521 urlunparse [] funct Mô -đun người dùng, 586

hàm update_wrapper [], mô -đun functools, 269

Tùy chọn —User để setup.py, 154

Cập nhật từ điển, 45

Tiêu đề tác nhân người dùng trong các yêu cầu HTTP, thay đổi, 517

tải lên

Các tệp trong tập lệnh CGI, 536 tệp đến máy chủ HTTP có POST, 505 tệp cho máy chủ FTP, 500 gói đến PYPI, 155

thuộc tính tên người dùng

của các đối tượng Urlparse, 520 đối tượng URLSplit, 521 Cảnh báo về người dùng, 216, 238

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Cảnh báo của người dùng

714

Ngoại lệ không xác định, mô -đun http.client, 504

Phương pháp trên [], của chuỗi, 44

Ngoại lệ không xác định

hàm urandom [], mô -đun hệ điều hành, 396

Chức năng hủy liên kết [], Mô -đun HĐH, 390 Mô -đun dỡ hàng, 149

Biến đại từ, mô -đun chuỗi, hàm urldefrag [], mô -đun urllib.parse, 521

Hàm giải nén [], mô -đun cấu trúc, 290

hàm urlencode [], mô -đun urllib.parse, 522

Phương thức giải nén [], của các đối tượng cấu trúc, 291

Ngoại lệ URLERROR, 516

Chức năng unpack_from [], mô -đun cấu trúc, phương thức 291 unpack_from [], của các đối tượng struct, 291 giải nén

Cấu trúc dữ liệu nhị phân, 290 trình tự, 67-68 bộ dữ liệu, 14

Phương thức VFormat [], của các đối tượng định dạng, 288

Tùy chọn dòng lệnh -V, 173-174

Xem các đối tượng, Python 3, 632

Chức năng của Trình xác thực [], Mô -đun WSGiref.Handlers, 543

Thuộc tính âm lượng, của các đối tượng zipinfo, 327

Thuộc tính giá trị

hàm vonmiseVariate [], mô -đun ngẫu nhiên, 256

của các đối tượng FieldStorage, 535 đối tượng morsel, 512

W

Giá trị [] hàm, mô -đun đa xử lý, 426

-W Tùy chọn dòng lệnh, 216, 239-240

Phương thức giá trị [], của các đối tượng Trình quản lý, 429

Chế độ W W, chức năng Open [], 159

ValueError Exception, 87, 215

W [ở đây] Lệnh gỡ lỗi, mô -đun PDB, 189

và danh sách, 40 và chuỗi, 41 phương thức valuerefs [], của các đối tượng yếu, phương thức 241 giá trị []

của các đối tượng tin nhắn, 552 của Dicts, 45 của Dicts trong Python 3, 632

Chờ [] hàm, mô -đun hệ điều hành, phương thức 394 chờ []

của các đối tượng không đồng bộ, 425 đối tượng điều kiện, 441 đối tượng sự kiện, 440 đối tượng popen, hàm 404 Wait3 [], mô -đun HĐH, 394

ValueView Lớp cơ sở trừu tượng, 266

Chức năng Wait4 [], Mô -đun HĐH, 394

Nội suy biến trong chuỗi, 163

hàm waitpid [], mô -đun hệ điều hành, 394

Đối số từ khóa biến trong định nghĩa chức năng, 95

Hàm đi bộ [], Mô -đun HĐH, Phương thức 390 Walk [], của các đối tượng tin nhắn, 554

F

H lib

fl

B

d

ff

trình bao bọc và các phương thức liên kết thuộc tính

715

Thời gian đồng hồ treo tường, có được, 191

Trong khi tuyên bố, 8, 82

Hàm cảnh báo [], mô -đun cảnh báo, 216, 239

biến khoảng trắng, mô -đun chuỗi, 287

hàm warn_explicit [], mô -đun cảnh báo, 239

Chức năng wifexited [], mô -đun hệ điều hành, 394

Cảnh báo cảnh báo, 216, 238 CẢNH BÁO [] Phương pháp, của các đối tượng logger, mô -đun cảnh báo 357, 238 cảnh báo

Chuyển đổi thành các trường hợp ngoại lệ, 239 khác biệt so với các trường hợp ngoại lệ, 216 triệt tiêu, biến số 238 WARNOPTIDS, MODULE SYS, 232 LỚP lớp, mô -đun yếu, mô -đun 241 yếu, 130, 240 lớp yếu, mô -đun yếu, khung web 241, 538

và chuỗi mẫu, 164 Lập trình web, 531 Máy chủ web

Xử lý tùy chỉnh các yêu cầu, 510 Chạy độc lập trong Python, mô -đun Webbrowser 508, Phương thức 544 Day [], của các đối tượng ngày, 338

Hàm wifcontinued [], mô -đun hệ điều hành, hàm 395 wifsignaled [], mô -đun hệ điều hành, hàm 395 wifstopped [], mô -đun hệ điều hành, chức năng 395 windll []

Đăng ký Accres, 408 Access Registry, 175 Tạo phân phối nhị phân với Distutils, 153 lần nhấp đúp vào các chương trình Python, 176 chữ cái trong tên tệp, khóa tệp 399 Mô-đun đa xử lý, thư mục trang web 417 trên mỗi người dùng, 177 Fork Watch

và ngoại lệ, 23 và khóa, 89 mô -đun thập phân, 248 nguyên thủy khóa, 442

hàm weibullvariate [], mô -đun ngẫu nhiên, 256

nhóm làm việc, của các quy trình, 424

Số cổng nổi tiếng, 450

hàm wrap_socket [], mô -đun SSL, 486

Hàm wexitstatus [], mô -đun hệ điều hành, 394

Chức năng bao bọc, 95

Thuộc tính WFILE

của các đối tượng BaseHttprequestHandler, 509 đối tượng StreamRequestHandler, mô -đun 491, 310, 310

và đóng cửa, 100 ví dụ về, 101 trong các mô -đun mở rộng, 594 bao bọc và phương thức liên kết thuộc tính, 132

hàm whatdb [], mô -đun DBM, 310

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

trình bao bọc và các phương thức liên kết thuộc tính

716

Thời gian đồng hồ treo tường, có được, 191

Trong khi tuyên bố, 8, 82

Hàm cảnh báo [], mô -đun cảnh báo, 216, 239

biến khoảng trắng, mô -đun chuỗi, 287

hàm warn_explicit [], mô -đun cảnh báo, 239

Chức năng wifexited [], mô -đun hệ điều hành, 394

Cảnh báo cảnh báo, 216, 238 CẢNH BÁO [] Phương pháp, của các đối tượng logger, mô -đun cảnh báo 357, 238 cảnh báo

Chuyển đổi thành các trường hợp ngoại lệ, 239 khác biệt so với các trường hợp ngoại lệ, 216 triệt tiêu, biến số 238 WARNOPTIDS, MODULE SYS, 232 LỚP lớp, mô -đun yếu, mô -đun 241 yếu, 130, 240 lớp yếu, mô -đun yếu, khung web 241, 538

và chuỗi mẫu, 164 Lập trình web, 531 Máy chủ web

Xử lý tùy chỉnh các yêu cầu, 510 Chạy độc lập trong Python, mô -đun Webbrowser 508, Phương thức 544 Day [], của các đối tượng ngày, 338

Mã thoát x \ x, trong chuỗi, tùy chọn dòng lệnh 28 -x, mô -đun 173-174 xdrlib, gói 587 xml, hàm 568 xml []

Các ký tự thoát ra và không phân chia, tài liệu ví dụ 583, 569 phân tích các tệp lớn, 579 không gian tên trong mô-đun ElementTree, 578 Parsing, 568 XML-RPC, 524 XML-RPC Server, MultiThreaded Frested, 494 XML-RPC

Ví dụ về, 529 Tùy chỉnh máy chủ, mô -đun 530 xml.dom.minidom, 570 xml.etree.elementtree Module, 573 XML.SAX MODULE, 580

ghi vào một tập tin, 159

mô -đun XML.SAX.SAXUTILS, 583

WSGI [Giao diện cổng máy chủ web], 540

Xmlcharrefreplace xử lý lỗi, 166-167

WSGI

Hàm xmlgenerator [], mô -đun xml.sax.saxutils, 584

Đặc điểm kỹ thuật ứng dụng, ví dụ 540 về, tích hợp 541 với các khung web, 543 trường mẫu xử lý, 541 chạy máy chủ độc lập, 542 chạy trong các tập lệnh CGI, 542 Sử dụng máy phát điện cho I/O, 165 Ứng dụng, 543

Hàm xmlid [], mô -đun xml.etree.elementtree, gói 575 XMLRPC, mô -đun 524 XMLRPC.

F

H lib

fl

B

d

ff

Hàm zipinfo [], mô -đun zipfile

717

Lớp XMLRPCServer, mô -đun XMLRPC.Server, hàm 527 XOR [], Mô -đun toán tử, 274 _ _xor_ _ [] Phương thức, 60 XPath, 569 Xrange Loại, 38 Xrange [] so với danh sách, 44 xrange Hàm , 211

và Python 3, 17, 44, 211 XSLT, 569

Xử lý Y Y2K, thuộc tính 407 năm, của các đối tượng ngày, 337 biểu thức năng suất, 20, báo cáo năng suất 104, 19, 53, 102

và người quản lý bối cảnh, 90 lần sử dụng với I/O, 164-165

Z ZerodivisionError Exception, 87, 215 Zfill [] Phương thức, của chuỗi, 44 .zip Tệp

và các mô -đun, 147 giải mã và mã hóa, 324 sử dụng làm kho lưu trữ mã, hàm 147 zip [], 83, 211

và Python 3, 211 Future_builtins Module, 217 Ví dụ chuyển đổi loại, mô-đun 37 Zipfile, hàm 324 ZipFile [], Mô-đun Zipfile, Mô-đun 325 Zipimport, Chức năng 586 ZipInfo [], Mô-đun Zipfile, 325

Làm thế nào chúng ta có thể làm cho chỉ số này hữu ích hơn? Gửi email cho chúng tôi tại [Email & NBSP; được bảo vệ]

F

H lib

fl

B

d

ff

Bài Viết Liên Quan

Chủ Đề