Заявление Python «with as» в Julia, JavaScript, Lua и других языках

Одна из проблем, с которой я столкнулся с этой with asфункцией в Python, - ее необходимость неочевидна, если у вас нет более глубокого понимания ограничений языка Python.

Например, разработчику Ruby, Julia, Lua, Go, JavaScript или Swift не нужно добавлять этот оператор. Это почему?

В основе проблемы лежит заветная особенность многих разработчиков Python: использование отступов для обозначения блоков кода.

В JavaScript я мог бы написать, например,

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

Он иллюстрирует преимущество наличия символа для обозначения конца блока кода, а не изменения отступа.

Использование функций высшего порядка с замыканиями для выделения ресурсов и очистки

Давайте подробнее рассмотрим преимущества дружественного синтаксиса для встроенных многострочных замыканий. Я проиллюстрирую это на примере кода Julia, хотя JavaScript, Lua и многие другие языки будут работать так же хорошо.

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

Прелесть этого способа открытия и закрытия файлов в том, что вы не забудете закрыть файл.

Решение Python

Как объяснялось, трудно добиться того же в синтаксисе Python. Так with-asбыло изобретено. Позвольте мне показать, как предыдущий пример будет реализован на 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)

Мы можем использовать этот класс для открытия и чтения файла следующим образом:

with openfile("foobar.txt") as file:
  print(readline(file))

  1. Сначала вызывается конструктор openfileкласса, и мы сохраняем имя файла, который хотим открыть.
  2. Экземпляр openfileкласса передается в with-asконструкцию, что вызывает __enter__вызов ее метода. Предполагается, что мы получим желаемые ресурсы. В данном случае дескриптор файла.
  3. Возвращенный объект становится аргументом as. Так as fileотносится к объекту, возвращаемому из __enter__. Имена не должны совпадать. Мы могли бы написать as foobarвместо этого.
  4. Когда весь код внутри with-asблока будет запущен, Python вызовет __exit__освобождение ресурсов. Это также будет вызываться в случае возникновения каких-либо исключений.

Существует множество вариантов создания этих классов диспетчера контекста путем создания подклассов или использования декораторов.

Suggested posts

Поиск информации о доменных именах

Отрывок из книги «Маленькие программные инструменты Sharp» Брайана П. Хогана.

Поиск информации о доменных именах

Когда вы делаете запрос на facebook.com, ваш компьютер ищет доменное имя, чтобы преобразовать это доменное имя в IP-адрес, чтобы ваш компьютер мог установить это соединение.

D-слово и L-слово в дизайне пользовательского интерфейса. Язык имеет значение. Не будь расистом.

D-слово и L-слово в дизайне пользовательского интерфейса. Язык имеет значение. Не будь расистом.

Наш язык является мощным инструментом, который может формировать наши мысли, отношения и действия. Даже кажущиеся безобидными термины могут увековечить вредные предубеждения и стереотипы.

Related posts

Сетевое телевидение Твиттер

Сетевое телевидение Твиттер

То, что было старым, теперь снова новое, а то, что раньше было блестящим, теперь кажется скучным. Я не говорю о джинсах JNCO, которые вернулись среди крутых парней в центре города вместе с другими моделями конца 1990-х годов.

Сольное выступление рыжеволосой девушки

По заданию Хайдена Кэти снимает, как она мастурбирует.

Сольное выступление рыжеволосой девушки

Было уже за полночь, когда Хейден отвез Кэти обратно в общежитие колледжа после их совместного вечера. У нее был ранний урок утром, и у нее не было другой смены одежды после того, как она осталась с ним прошлой ночью.

Создание безопасной рабочей среды

Создание безопасной рабочей среды

«Он защитит меня, когда я в опасности. Он спрячет меня в своей палатке.

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

Переход к новой карьере может быть чрезвычайно сложным, если вы пытаетесь сделать это в одиночку. Важно найти партнеров по подотчетности, которые находятся на том же уровне обучения, что и вы, у которых схожие цели, упорство и стремление.