with open["hello.txt", "wb"] as f: f.write["Hello Python!\n"]
dường như giống như
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
Ưu điểm của việc sử dụng mở .. như thay vì f =? Có phải nó chỉ là đường cú pháp? Chỉ lưu một dòng mã?
hỏi ngày 29 tháng 4 năm 2010 lúc 14:58Apr 29, 2010 at 14:58
Prosseekprosseeekprosseek
175K201 Huy hiệu vàng554 Huy hiệu bạc854 Huy hiệu đồng201 gold badges554 silver badges854 bronze badges
2
Để tương đương với phiên bản câu lệnh with
, mã bạn đã viết nên thay vào đó như thế này:
f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
Mặc dù điều này có vẻ giống như đường cú pháp, nhưng nó đảm bảo rằng bạn phát hành tài nguyên. Nói chung, thế giới phức tạp hơn các ví dụ bị kích thích này và nếu bạn quên một try.. except...
hoặc không xử lý một trường hợp cực đoan, bạn có rò rỉ tài nguyên trên tay.
Tuyên bố with
giúp bạn tiết kiệm khỏi những rò rỉ đó, giúp việc viết mã sạch dễ dàng hơn. Để giải thích đầy đủ, hãy nhìn vào PEP 343, nó có rất nhiều ví dụ.
Đã trả lời ngày 29 tháng 4 năm 2010 lúc 15:12Apr 29, 2010 at 15:12
mg.mg.mg.
7.6371 Huy hiệu vàng25 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge25 silver badges30 bronze badges
0
Nếu f.write
ném một ngoại lệ, f.close[]
được gọi khi bạn sử dụng with
và không được gọi trong trường hợp thứ hai. Ngoài ra f
có phạm vi nhỏ hơn và mã sạch hơn khi sử dụng
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
0Đã trả lời ngày 29 tháng 4 năm 2010 lúc 15:02Apr 29, 2010 at 15:02
Kathy Van Stonekathy Van StoneKathy Van Stone
25K3 Huy hiệu vàng31 Huy hiệu bạc40 Huy hiệu đồng3 gold badges31 silver badges40 bronze badges
Cái trước vẫn đóng f
nếu một ngoại lệ xảy ra trong thời gian
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
2.
Tim Pietzcker
Phù bằng vàng 319K5757 gold badges494 silver badges550 bronze badges
Đã trả lời ngày 29 tháng 4 năm 2010 lúc 15:01Apr 29, 2010 at 15:01
DJCDJCdjc
11.4K5 Huy hiệu vàng43 Huy hiệu bạc52 Huy hiệu Đồng5 gold badges43 silver badges52 bronze badges
Tuyên bố with
trong Python được sử dụng trong xử lý ngoại lệ để làm cho mã sạch hơn và dễ đọc hơn nhiều. Nó đơn giản hóa việc quản lý các tài nguyên chung như luồng tệp. Quan sát ví dụ mã sau về cách sử dụng câu lệnh with
làm cho mã sạch hơn. statement in Python is used in exception handling to make the code cleaner and much more readable. It simplifies the management of common resources like file streams. Observe the following code example on how the use of with
statement makes code cleaner.
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
7f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
9f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
0f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
1f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
4f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
7f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
9f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
0f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
1f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2with
7with
8
with
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
4try.. except...
2f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2try.. except...
4with
8
with
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
8try.. except...
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
7f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
9f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
0f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
1with
5f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5with
8with
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
4f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2Lưu ý rằng không giống như hai triển khai đầu tiên, không cần phải gọi f.write
3 khi sử dụng câu lệnh with
. Bản thân tuyên bố with
đảm bảo mua lại và phát hành các tài nguyên thích hợp. Một ngoại lệ trong cuộc gọi f.write
6 trong quá trình triển khai đầu tiên có thể ngăn tệp đóng đúng cách có thể giới thiệu một số lỗi trong mã, tức là nhiều thay đổi trong các tệp không có hiệu lực cho đến khi tệp được đóng đúng.
Cách tiếp cận thứ hai trong ví dụ trên đảm nhận tất cả các ngoại lệ nhưng sử dụng câu lệnh with
làm cho mã nhỏ gọn và dễ đọc hơn nhiều. Do đó, câu lệnh with
giúp tránh các lỗi và rò rỉ bằng cách đảm bảo rằng tài nguyên được phát hành đúng khi mã sử dụng tài nguyên được thực thi hoàn toàn. Tuyên bố with
được sử dụng phổ biến với các luồng tệp, như được hiển thị ở trên và với các khóa, ổ cắm, quy trình con và telnet, v.v.
Hỗ trợ câu lệnh "với" trong các đối tượng do người dùng xác định
Không có gì đặc biệt trong f.close[]
0 mà làm cho nó có thể sử dụng được với câu lệnh with
và cùng một chức năng có thể được cung cấp trong các đối tượng do người dùng xác định. Hỗ trợ câu lệnh with
trong các đối tượng của bạn sẽ đảm bảo rằng bạn không bao giờ để bất kỳ tài nguyên nào mở. Để sử dụng câu lệnh with
trong các đối tượng do người dùng xác định, bạn chỉ cần thêm các phương thức f.close[]
4 và f.close[]
5 trong các phương thức đối tượng. Hãy xem xét các ví dụ sau để làm rõ thêm.
To use with
statement in user defined objects you only need to add the methods f.close[]
4 and f.close[]
5 in the object methods. Consider the following example for further clarification.
f.close[]
6 f.close[]
77__78f.close[]
9
with
9with
1 with
2with
3with
4
with
5with
3with
7
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 with
9with
9with
1 f
2with
3f.close[]
9
with
5with
3f
7
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
7f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
8with
3f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
03f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
1f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2with
5
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
07 with
3f
7f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5with
9with
1
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
13with
3f.close[]
9with
5with
3f
7
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
21f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
22f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
23with
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
25try.. except...
2f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2Hãy để kiểm tra mã trên. Nếu bạn nhận thấy, những gì tiếp theo từ khóa with
là hàm tạo của
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
29. Ngay sau khi thực thi vào bối cảnh của câu lệnh with
, một đối tượng f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
29 được tạo và Python sau đó gọi phương thức f.close[]
4. Trong phương thức f.close[]
4 này, khởi tạo tài nguyên bạn muốn sử dụng trong đối tượng. Phương thức f.close[]
4 này phải luôn luôn trả về một mô tả của tài nguyên thu được.Các mô tả tài nguyên là gì? Đây là những tay cầm được cung cấp bởi hệ điều hành để truy cập các tài nguyên được yêu cầu. Trong khối mã sau,
5 là bộ mô tả của tài nguyên luồng tệp.f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
These are the handles provided by the operating system to access the requested resources. In the following code block,
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5 is a descriptor of the file stream resource.
Trong ví dụ
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
29 được cung cấp ở trên, phương thức f.close[]
4 tạo ra một mô tả tệp và trả về nó. Tên f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
38 Ở đây được sử dụng để tham khảo bộ mô tả tệp được trả về bằng phương thức f.close[]
4. Khối mã sử dụng tài nguyên thu được được đặt bên trong khối của câu lệnh with
. Ngay sau khi mã bên trong khối with
được thực thi, phương thức f.close[]
5 được gọi. Tất cả các tài nguyên thu được được phát hành theo phương pháp f.close[]
5. Đây là cách chúng tôi sử dụng câu lệnh with
với các đối tượng do người dùng xác định.Giao diện này của các phương thức f.close[]
4 và f.close[]
5 cung cấp hỗ trợ của câu lệnh with
trong các đối tượng do người dùng xác định được gọi là Trình quản lý ngữ cảnh.Context Manager.
Mô -đun bối cảnh
Trình quản lý bối cảnh dựa trên lớp như được hiển thị ở trên không phải là cách duy nhất để hỗ trợ câu lệnh with
trong các đối tượng do người dùng xác định. Mô -đun
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
49 cung cấp thêm một vài trừu tượng được xây dựng trên giao diện trình quản lý bối cảnh cơ bản. Dưới đây là cách chúng tôi có thể viết lại trình quản lý bối cảnh cho đối tượng f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
29 bằng mô -đun f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
49.f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
52 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
53f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
54 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
55f.close[]
6 f.close[]
77__78f.close[]
9
with
9with
1 with
2with
3
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
64with
5with
3with
7
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
69with
9
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
71with
9with
1
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
74with
3f.close[]
9with
5with
7with
8
Is
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
80f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90 f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5with
5try.. except...
4with
8
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
80f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
8f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
98f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
6 f.close[]
7f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
01f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
03with
9
f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
05try.. except...
2f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
2Trong ví dụ mã này, do câu lệnh
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90 Trong định nghĩa của nó, hàm f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 là hàm của trình tạo. Khi hàm f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 này được gọi, nó tạo ra một mô tả tài nguyên có tên f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5. Bộ mô tả tài nguyên này sau đó được chuyển cho người gọi và được đại diện ở đây bởi biến f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
12. Sau khi mã bên trong khối with
được thực thi, điều khiển chương trình trở lại chức năng f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09. Hàm f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 tiếp tục thực thi và thực thi mã theo câu lệnh f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90. Phần mã này xuất hiện sau tuyên bố f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90 phát hành các tài nguyên thu được. f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
71 ở đây là một người trang trí.When this
f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 function is called, it creates a resource descriptor named f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
5. This resource descriptor is then passed to the caller and is represented here by the variable f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
12. After the code inside the with
block is executed the program control returns back to the f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 function. The f = open["hello.txt", "wb"]
try:
f.write["Hello Python!\n"]
finally:
f.close[]
09 function resumes its execution and executes the code following the f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90 statement. This part of code which appears after the f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90 statement releases the acquired
resources. The f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
71 here is a decorator.Việc triển khai dựa trên lớp trước và triển khai dựa trên trình tạo này của các nhà quản lý ngữ cảnh là giống nhau. Mặc dù sau này dường như dễ đọc hơn, nó đòi hỏi kiến thức về máy phát điện, trang trí và
f = open["hello.txt", "wb"]
f.write["Hello Python!\n"]
f.close[]
90.