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:
- 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.
- Este artigo
- 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.
- 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
Em JS, o método split()
refere-se a strings:
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 cursoque 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
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
.
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()
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;
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', )
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>', );
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', )
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(); } );
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.