Câu lệnh “with as” của Python trong Julia, JavaScript, Lua và các ngôn ngữ khác

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ề.

Sử dụng các chức năng đặt hàng cao hơn có đóng cửa để phân bổ và dọn dẹp tài nguyên

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.

Giải pháp Python

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))

  1. Đầu tiên hàm tạo của openfilelớp được gọi và chúng ta lưu trữ tên của tệp chúng ta muốn mở.
  2. Một thể hiện của 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.
  3. Đối tượng được trả về trở thành đối số 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ế.
  4. Khi tất cả mã bên trong 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í.

Suggested posts

Tìm kiếm thông tin về tên miền

Đoạn trích từ Small, Sharp Software Tools của Brian P. Hogan

Tìm kiếm thông tin về tên miền

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 đó.

Chữ D và chữ L trong Thiết kế giao diện người dùng. Vấn đề ngôn ngữ. Đừng phân biệt chủng tộc.

Chữ D và chữ L trong Thiết kế giao diện người dùng. Vấn đề ngôn ngữ. Đừng phân biệt chủng tộc.

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.

Related posts

Tạo Môi Trường Làm Việc An Toàn

Tạo Môi Trường Làm Việc An Toàn

“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.

Không còn mật khẩu — mật khẩu sẽ thay thế mật khẩu của bạn như thế nào

Không còn mật khẩu — mật khẩu sẽ thay thế mật khẩu của bạn như thế nào

Để 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ụ:

Cuộc trò chuyện nguy hiểm

Cuộc trò chuyện nguy hiểm

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).

Thử thách đọc Goodreads là độc hại

Thử thách đọc Goodreads là độc hại

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ó.