Análogos em Python e JavaScript. Parte dois

Continuamos a publicar uma tradução de uma série de artigos sobre as semelhanças e diferenças entre os dois idiomas.


Hoje falaremos sobre serialização de dicionários, JSON, regulares, erros e exceções.


Outros artigos desta série:


  1. A primeira parte é a conversão de tipos, operador ternário, acesso a uma propriedade pelo nome da propriedade, dicionários, listas, cadeias de caracteres, concatenação de cadeias.
  2. Este artigo
  3. Parte três : Python e JS modernos: padrões de strings (linhas-f), descompactação de lista, funções lambda, iterações de lista, geradores, conjuntos.
  4. A quarta parte são argumentos de função, criando e trabalhando com classes, herança, getter setter e propriedades de classe.

Json


Ao trabalhar com muitas APIs, é conveniente serializar objetos em objetos JSON para facilitar a transferência e a análise subsequente.


O Python possui um módulo json padrão:


import json json_data = json.dumps(dictionary, indent=4) dictionary = json.loads(json_data) 

Aqui nós formatamos JSON com recuo de 4 espaços.


Em JS, há um objeto JSON com métodos para criar e analisar cadeias JSON:


 json_data = JSON.stringify(dictionary, null, 4); dictionary = JSON.parse(json_data); 

Analisar strings com regulares


No último artigo, combinamos várias linhas em uma. Mas como dividir uma cadeia longa em várias, especialmente se o separador não é um caractere único como uma vírgula, mas toda uma gama de opções diferentes? É aqui que expressões regulares e o método split() são úteis.


No Python, o método split() se refere a um padrão de expressão regular. Veja como dividir uma sequência de texto em frases de pontuação:


 import re #     "!?."         delimiter = re.compile(r'[!?\.]+\s*') text = "Hello!!! What's new? Follow me." sentences = delimiter.split(text) # sentences == ['Hello', "What's new", 'Follow me', ''] 

Em JS, o método split() refere-se a strings:


 //     "!?."         delimiter = /[!?\.]+\s*/; text = "Hello!!! What's new? Follow me."; sentences = text.split(delimiter) // sentences === ["Hello", "What's new", "Follow me", ""] 

Pesquisa regular por padrão


Expressões regulares são frequentemente usadas para validar dados de formulários.
Por exemplo, para verificar a exatidão do endereço de email inserido, ele deve ser comparado ao padrão de expressão regular.


Autor da tradução no curso

que verificar o endereço com regulares é uma tarefa não trivial e um pouco mais complicada do que o método fornecido neste artigo


No Python, será algo parecido com isto:


 import re # name, "@", and domain pattern = re.compile(r'([\w.+\-]+)@([\w\-]+\.[\w\-.]+)') match = pattern.match('hi@example.com') # match.group(0) == 'hi@example.com' # match.group(1) == 'hi' # match.group(2) == 'example.com' 

Se uma seção de texto corresponder a um modelo, o uso do método group() retornará a seção inteira na qual você poderá selecionar grupos individuais definidos no modelo.


0 - a linha inteira (sub) correspondente, 1 - o primeiro grupo, 2 - o segundo, etc.


Se nenhuma correspondência for encontrada, um objeto do tipo None será retornado.


Em JS, existe um método de sequência match() que retorna a parte correspondente de uma sequência ou null .


 // name, "@", and domain pattern = /([\w.+\-]+)@([\w\-]+\.[\w\-.]+)/; match = 'hi@example.com'.match(pattern); // match[0] === 'hi@example.com' // match[1] === 'hi' // match[2] === 'example.com' 

Em JS, o objeto correspondente se parece com uma matriz. O elemento com índice [0] é a (sub) linha inteira que corresponde, o 1º elemento é o primeiro grupo, o 2º é o segundo, etc. - tudo de acordo com os grupos definidos no modelo.


Às vezes, além da pesquisa, é necessário determinar a posição da amostra no texto. Isso pode ser feito usando o método search() .
No Python, esse método se refere a expressões regulares e retorna um objeto correspondente. Esse objeto correspondente possui um método start() que retorna o início da ocorrência dessa substring na linha principal:


 text = 'Say hi at hi@example.com' first_match = pattern.search(text) if first_match: start = first_match.start() # start == 10 

O método JS possui um método de cadeia de caracteres search() retorna o índice do início da substring. Ou -1 se nenhuma correspondência for encontrada.


 text = 'Say hi at hi@example.com'; first_match = text.search(pattern); if (first_match > -1) { start = first_match; // start === 10 } 

Substituir por padrão usando expressões regulares


Normalmente, é necessária uma substituição de modelo quando você deseja limpar dados ou adicionar algumas propriedades ao texto. Por exemplo, podemos pegar uma linha e criar todos os endereços de email encontrados nos links:


Python possui um método padrão sub() regex para isso:


 html = pattern.sub( r'<a href="mailto:\g<0>">\g<0></a>', 'Say hi at hi@example.com', ) # html == 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

Os desenvolvedores de JS podem usar o método de sequência replace() :


 html = 'Say hi at hi@example.com'.replace( pattern, '<a href="mailto:$&">$&</a>', ); // html === 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

No Python, os grupos correspondentes estão disponíveis como \g<0>, \g<1>, \g<2> etc.
Em JS, como $&, $1, $2 etc.


Também é possível substituir a parte correspondente por uma função. Essas funções são úteis ao substituir o agrupamento do texto de origem ou para contar, coletar ou obter outras informações sobre o texto. Por exemplo, quando eu uso uma chamada de função ao substituir, posso escrever o realce da sintaxe HTML.


Vamos mudar todos os endereços de email em LETRAS MAIÚSCULAS.


No Python, a função de substituição obtém o objeto correspondente. Usamos o método group () para executar ações com o texto correspondente e retorná-lo como um substituto:


 text = pattern.sub( lambda match: match.group(0).upper(), 'Say hi at hi@example.com', ) # text == 'Say hi at HI@EXAMPLE.COM' 

Em JS, a função de substituição obtém a correspondência inteira da sequência, primeira ocorrência, segunda etc. Executamos as ações necessárias e retornamos a linha modificada:


 text = 'Say hi at hi@example.com'.replace( pattern, function(match, p1, p2) { return match.toUpperCase(); } ); // text === 'Say hi at HI@EXAMPLE.COM' 

Tratamento de erros


Ao contrário do Python, o JavaScript baseado no navegador front-end geralmente não é usado para gravar / ler arquivos ou acessar bancos de dados. Portanto, os blocos try..catch bastante raros em JS em comparação com os blocos try..except no Python.


Mas, em qualquer caso, a manipulação de erros pode ser realizada em um script do usuário, chamado a partir de uma função de biblioteca e interceptado no código principal.


No exemplo a seguir do MyException , definiremos nossa MyException , MyException uma função e veremos como capturá-la e manipulá-la no bloco try..except..finally :


 class MyException(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def proceed(): raise MyException('Error happened!') try: proceed() except MyException as err: print('Sorry! {}'.format(err)) finally: print('Finishing') 

O código JS a seguir faz o mesmo - definimos a classe MyException , MyException em uma função, interceptamos e processamos em um bloco try..catch..finally :


 function MyException(message) { this.message = message; this.toString = function() { return this.message; } } function proceed() { throw new MyException('Error happened!'); } try { proceed(); } catch (err) { if (err instanceof MyException) { console.log('Sorry! ' + err); } } finally { console.log('Finishing'); } 

Nos dois idiomas, a classe MyException possui um parâmetro de message e um método para a representação de seqüência de caracteres, dependendo do valor da message .


Obviamente, as exceções devem ser lançadas / geradas apenas em caso de erro. E se você identificou esse erro no seu módulo.


Conclusões


  • Serializar de / para JSON é bastante simples - o que está em Python, o que está em JS.
  • Os regulares são uma poderosa ferramenta de processamento de texto nos dois idiomas.
  • Você pode fazer substituições usando funções.
  • Para casos mais complexos, você pode usar chamada, interceptação e tratamento de erros.

Como foi dito na última vez, é possível combinar linha por linha os exemplos de código fornecidos aqui para entender estruturas de dados e métodos de trabalho semelhantes: strings, matrizes, dicionários, acesso a objetos.


Na próxima parte, falaremos sobre padrões de texto, listas de desempacotamento, funções lambda, iterações sem o uso de índices, geradores e conjuntos.

Source: https://habr.com/ru/post/pt417513/


All Articles