Một trong những thách thức đối với tôi để nắm bắt được with astính năng trong Python, nhu cầu của nó là không rõ ràng trừ khi bạn hiểu sâu hơn về các giới hạn của ngôn ngữ Python.
Ví dụ, một nhà phát triển Ruby, Julia, Lua, Go, JavaScript hoặc Swift sẽ không cần thêm câu lệnh này. Tại sao vậy?
Trung tâm của vấn đề là một tính năng được nhiều nhà phát triển Python ấp ủ: việc sử dụng thụt đầu dòng để chỉ ra các khối mã.
Trong JavaScript, tôi có thể viết ví dụ:
openfile('foobar.txt', function(file) {
// called after file has been opened
// file is a handle to the open file
read_data(file)
...
});
openfile("foobar.txt", function(file)
-- called after file has been opened
-- file is a handle to the open file
read_data(file)
...
end)
openfile("foobar.txt", def (file):
# called after file has been opened
# file is a handle to the open file
read_data(file)
...
Nó minh họa lợi ích của việc có một biểu tượng để báo hiệu sự kết thúc của một khối mã hơn là sự thay đổi thụt lề.
Hãy để chúng tôi tìm hiểu một chút chi tiết về lợi ích của việc có một cú pháp thân thiện cho các đóng đa dòng nội tuyến. Tôi sẽ minh họa bằng một ví dụ mã Julia, mặc dù JavaScript, Lua và nhiều ngôn ngữ khác sẽ hoạt động tốt.
function openfile(callback, filename::String)
file = open(filename)
callback(file)
close(file)
end
openfile(file -> print(readline(file)), "foobar.txt")
openfile("foobar.txt") do file
print(readline(file))
end
Cái hay của cách mở và đóng tệp này là bạn sẽ không quên đóng tệp.
Như đã giải thích, rất khó để đạt được cú pháp tương tự trong Python. Do đó with-asđã được phát minh. Hãy để tôi cho thấy ví dụ trước sẽ được triển khai như thế nào trong Python.
class openfile:
def __init_(self, filename):
self.filename
def __enter__(self):
self.file = open(self.filename)
return file
def __exit__(self, exc_type, exc_val, exc_tb):
close(self.file)
Chúng ta có thể sử dụng lớp này để mở và đọc từ tệp theo cách sau:
with openfile("foobar.txt") as file:
print(readline(file))
openfilelớp được gọi và chúng ta lưu trữ tên của tệp chúng ta muốn mở.openfilelớp được chuyển tới with-ascấu trúc, khiến __enter__phương thức của nó được gọi. Nó được cho là để có được các tài nguyên mong muốn của chúng tôi. Một xử lý tệp trong trường hợp này.as. Vì vậy, as fileđề cập đến đối tượng được trả về từ __enter__. Những cái tên không cần phải trùng nhau. Chúng tôi có thể đã viết as foobarthay thế.with-askhối đã được chạy, Python sẽ gọi __exit__để giải phóng tài nguyên. Điều này cũng sẽ được gọi trong trường hợp có bất kỳ ngoại lệ nào được ném ra.Có rất nhiều biến thể về cách tạo các lớp trình quản lý ngữ cảnh này , bằng cách phân lớp con hoặc sử dụng trình trang trí.
Khi bạn gửi yêu cầu tới facebook.com, máy tính của bạn sẽ tra cứu tên miền để dịch tên miền đó thành địa chỉ IP để máy tính của bạn có thể thực hiện kết nối đó.
Ngôn ngữ của chúng ta là một công cụ mạnh mẽ có thể định hình suy nghĩ, thái độ và hành động của chúng ta. Ngay cả những thuật ngữ dường như vô hại cũng có thể duy trì những định kiến và định kiến có hại.
“Anh ấy sẽ bảo vệ tôi khi tôi gặp nguy hiểm. Anh ấy sẽ giấu tôi trong lều của anh ấy.
Để tránh sự mơ hồ, các thuật ngữ sau đây sẽ được sử dụng; Trình xác thực; Điện thoại di động được sử dụng để đăng nhập Website; Trang web hoặc ứng dụng mà người dùng đang sử dụng để thực hiện yêu cầu đăng nhập Dịch vụ; Nhà cung cấp cung cấp dịch vụ nhất định, ví dụ:
Nếu chúng ta muốn tiếp tục phát triển trên hành tinh này, chúng ta sẽ phải có những cuộc đối thoại nguy hiểm. Những thứ thách thức những gì chúng ta đã làm, những gì chúng ta đang làm và những gì chúng ta hiện đang chuẩn bị tiếp tục làm (hoặc đang có kế hoạch làm).
Tay tôi ngứa ngáy lan rộng khi tôi mặc cả với người bán sách địa phương để mua một cuốn sách khác. Cuốn sách này giống như những cuốn còn lại mà tôi đã mua gần đây sẽ lên ngôi trong đống 'Cần đọc' (TBR) của tôi; tuy nhiên, tôi đã mua nó.