Одна из проблем, с которой я столкнулся с этой 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. Так 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))
openfileкласса, и мы сохраняем имя файла, который хотим открыть.openfileкласса передается в with-asконструкцию, что вызывает __enter__вызов ее метода. Предполагается, что мы получим желаемые ресурсы. В данном случае дескриптор файла.as. Так as fileотносится к объекту, возвращаемому из __enter__. Имена не должны совпадать. Мы могли бы написать as foobarвместо этого.with-asблока будет запущен, Python вызовет __exit__освобождение ресурсов. Это также будет вызываться в случае возникновения каких-либо исключений.Существует множество вариантов создания этих классов диспетчера контекста путем создания подклассов или использования декораторов.
Когда вы делаете запрос на facebook.com, ваш компьютер ищет доменное имя, чтобы преобразовать это доменное имя в IP-адрес, чтобы ваш компьютер мог установить это соединение.
Наш язык является мощным инструментом, который может формировать наши мысли, отношения и действия. Даже кажущиеся безобидными термины могут увековечить вредные предубеждения и стереотипы.
То, что было старым, теперь снова новое, а то, что раньше было блестящим, теперь кажется скучным. Я не говорю о джинсах JNCO, которые вернулись среди крутых парней в центре города вместе с другими моделями конца 1990-х годов.
Было уже за полночь, когда Хейден отвез Кэти обратно в общежитие колледжа после их совместного вечера. У нее был ранний урок утром, и у нее не было другой смены одежды после того, как она осталась с ним прошлой ночью.
«Он защитит меня, когда я в опасности. Он спрячет меня в своей палатке.
Переход к новой карьере может быть чрезвычайно сложным, если вы пытаетесь сделать это в одиночку. Важно найти партнеров по подотчетности, которые находятся на том же уровне обучения, что и вы, у которых схожие цели, упорство и стремление.