Instrução “with as” do Python em Julia, JavaScript, Lua e outras linguagens

Um dos desafios para mim entender o with asrecurso em Python, sua necessidade não é aparente, a menos que você tenha uma compreensão mais profunda dos limites da linguagem Python.

Um desenvolvedor Ruby, Julia, Lua, Go, JavaScript ou Swift, por exemplo, não precisaria adicionar essa instrução. Por que é que?

No centro do problema está um recurso apreciado por muitos desenvolvedores Python: o uso de recuo para indicar blocos de código.

Em JavaScript eu poderia escrever, por exemplo

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

Ele ilustra o benefício de ter um símbolo para sinalizar o fim de um bloco de código em vez de uma mudança na indentação.

Usando funções de ordem superior com fechamentos para alocação e limpeza de recursos

Vamos entrar um pouco nos detalhes dos benefícios de ter uma sintaxe amigável para fechamentos de várias linhas em linha. Vou ilustrar com um exemplo de código Julia, embora JavaScript, Lua e muitas outras linguagens funcionem da mesma forma.

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

A beleza dessa maneira de abrir e fechar arquivos é que você não esquecerá de fechar o arquivo.

A Solução Python

Como explicado é difícil conseguir o mesmo em Python sua sintaxe. Assim with-asfoi inventado. Deixe-me mostrar como o exemplo anterior seria implementado em 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)

Podemos usar esta classe para abrir e ler um arquivo desta maneira:

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

  1. Primeiro o construtor da openfileclasse é chamado e armazenamos o nome do arquivo que queremos abrir.
  2. Uma instância da openfileclasse é passada para a with-asconstrução, o que faz com que seu __enter__método seja chamado. É suposto adquirir os nossos recursos desejados. Um identificador de arquivo neste caso.
  3. O objeto retornado se torna o argumento para as. So as filerefere-se ao objeto retornado de __enter__. Os nomes não precisam corresponder. Poderíamos ter escrito as foobarem vez disso.
  4. Quando todo o código dentro do with-asbloco for executado, o Python invocará __exit__para liberar recursos. Isso também será chamado caso haja alguma exceção lançada.

Existem muitas variações em como fazer essas classes gerenciadoras de contexto , seja por subclasses ou usando decoradores.

Suggested posts

Encontrar informações sobre nomes de domínio

Um trecho de Small, Sharp Software Tools por Brian P. Hogan

Encontrar informações sobre nomes de domínio

Quando você faz uma solicitação para facebook.com, seu computador procura o nome de domínio para traduzir esse nome de domínio em um endereço IP para que seu computador possa fazer essa conexão.

A palavra D e a palavra L em UI Design. Questões de Linguagem. Não seja racista.

A palavra D e a palavra L em UI Design. Questões de Linguagem. Não seja racista.

Nossa linguagem é uma ferramenta poderosa que pode moldar nossos pensamentos, atitudes e ações. Mesmo termos aparentemente inofensivos podem perpetuar preconceitos e estereótipos nocivos.

Related posts

Chega de senhas — como as senhas substituirão sua senha

Chega de senhas — como as senhas substituirão sua senha

Para evitar ambigüidade, os seguintes termos serão usados; Autenticador; O celular que está sendo utilizado para fazer o login no Site; O site ou aplicativo que o usuário está usando para fazer a solicitação de login do Serviço; O fornecedor que fornece o serviço fornecido, por exemplo

Por que alguns freelancers estão fingindo suas vidas

Por que alguns freelancers estão fingindo suas vidas

Estive recentemente no Linkedin, a maior rede social profissional do mundo, e encontrei postagens de designers freelancers que sigo que me chamaram a atenção. Todos postaram fotos de aviões, na praia com seus laptops, de piscinas e escritórios com vistas incríveis.

A performance solo da garota ruiva

A pedido de Hayden, Katie se filma se masturbando.

A performance solo da garota ruiva

Passava da meia-noite quando Hayden levou Katie de volta ao dormitório da faculdade depois da noite juntos. Ela tinha aula cedo de manhã e não tinha outra troca de roupa depois de ter ficado com ele na noite anterior.

Coletando OSINT para caçar ameaças

Coletando OSINT para caçar ameaças

Olá, entusiastas cibernéticos! Bem-vindo de volta ao OSINT para a série de caça a ameaças. No primeiro artigo, apresentei uma visão geral do OSINT e sua importância na caça às ameaças.