Análogos en Python y JavaScript. Parte dos

Continuamos publicando una traducción de una serie de artículos sobre las similitudes y diferencias entre los dos idiomas.


Hoy hablaremos sobre la serialización de diccionarios, JSON, regulares, errores y excepciones.


Otros artículos en esta serie:


  1. La primera parte es conversión de tipo, operador ternario, acceso a una propiedad por nombre de propiedad, diccionarios, listas, cadenas, concatenación de cadenas.
  2. Este articulo
  3. Parte tres : Python y JS modernos: patrones de cadenas (cadenas f), desempaque de listas, funciones lambda, iteraciones de listas, generadores, conjuntos.
  4. La cuarta parte es argumentos de función, crear y trabajar con clases, herencia, getter setter y propiedades de clase.

Json


Cuando se trabaja con muchas API, es conveniente serializar objetos en objetos JSON para facilitar la transferencia y el análisis posterior.


Python tiene un módulo json estándar:


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

Aquí formateamos JSON con sangría de 4 espacios.


En JS, hay un objeto JSON con métodos para crear y analizar cadenas JSON:


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

Analizar cuerdas con asiduos


En el último artículo, combinamos varias líneas en una. Pero, ¿cómo dividir una cadena larga en varias, especialmente si el separador no es un solo carácter como una coma, sino una gama completa de opciones diferentes? Aquí es donde las expresiones regulares y el método split() vienen al rescate.


En Python, el método split() se refiere a un patrón de expresión regular. Aquí se explica cómo dividir una cadena de texto en oraciones de puntuación:


 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', ''] 

En JS, el método split() se refiere a cadenas:


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

Búsqueda regular por patrón


Las expresiones regulares a menudo se usan para validar datos de formularios.
Por ejemplo, para verificar la exactitud de la dirección de correo electrónico ingresada, debe compararse con el patrón de expresión regular.


Autor de la traducción en el curso.

que verificar la dirección con clientes habituales es una tarea no trivial y un poco más complicada que el método dado en este artículo


En Python, se verá más o menos así:


 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' 

Si una sección de texto coincide con una plantilla, el uso del método group() devuelve la sección completa en la que puede seleccionar grupos individuales definidos en la plantilla.


0 - la línea completa (sub) coincidente, 1 - el primer grupo, 2 - el segundo, etc.


Si no se encuentran coincidencias, se devolverá un objeto de tipo None .


En JS, hay un método de cadena match() que devuelve la parte coincidente de una cadena o 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' 

En JS, el objeto coincidente se ve como una matriz. El elemento con índice [0] es la fila (sub) completa que coincide, el primer elemento es el primer grupo, el segundo es el segundo, etc. - todo de acuerdo con los grupos definidos en la plantilla.


A veces, además de buscar, se requiere determinar la posición de la muestra en el texto. Esto se puede hacer usando el método search() .
En Python, este método se refiere a expresiones regulares y devuelve un objeto coincidente. Este objeto coincidente tiene un método start() que devuelve el inicio de la aparición de esta subcadena en la línea principal:


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

El método JS tiene una search() método de cadena search() devuelve el índice del comienzo de la subcadena. O -1 si no se encontraron coincidencias.


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

Reemplazar por patrón usando expresiones regulares


Por lo general, se necesita un reemplazo de plantilla cuando desea borrar datos o agregar algunas propiedades al texto. Por ejemplo, podemos tomar una línea y hacer que todas las direcciones de correo electrónico encuentren enlaces:


Python tiene un método de patrón sub() regex para esto:


 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>' 

Los desarrolladores de JS pueden usar el método de cadena 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>' 

En Python, los grupos coincidentes están disponibles como \g<0>, \g<1>, \g<2> , etc.
En JS, como $&, $1, $2 , etc.


También es posible reemplazar la parte coincidente con una función. Dichas funciones son útiles al reemplazar el ajuste del texto fuente o para contar, recopilar u obtener otra información sobre el texto. Por ejemplo, cuando uso una llamada de función al reemplazar, puedo escribir resaltado de sintaxis HTML.


Cambiemos todas las direcciones de correo electrónico en LETRAS MAYÚSCULAS.


En Python, la función de reemplazo obtiene el objeto coincidente. Usamos el método group () para realizar acciones con el texto correspondiente y devolverlo como reemplazo:


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

En JS, la función de reemplazo obtiene la coincidencia completa de la cadena, primera aparición, segunda, etc. Realizamos las acciones necesarias y devolvemos la línea modificada:


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

Manejo de errores


A diferencia de Python, el JavaScript front-end basado en navegador generalmente no se usa para escribir / leer archivos o acceder a bases de datos. Por lo tanto, los bloques try..catch bastante raros en JS en comparación con los bloques try..except en Python.


Pero, en cualquier caso, el manejo de errores se puede realizar en un script de usuario, invocado desde una función de biblioteca e interceptado en el código principal.


En el siguiente ejemplo de MyException , definiremos nuestra MyException , la MyException en una función y veremos cómo capturarla y manejarla en el bloque 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') 

El siguiente código JS hace lo mismo: definimos la clase MyException , la MyException en una función, la interceptamos y procesamos en un bloque 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'); } 

En ambos idiomas, la clase MyException tiene un parámetro de message y un método para la representación de cadena dependiendo del valor del message .


Por supuesto, las excepciones deben ser lanzadas / planteadas solo en caso de un error. Y si ha identificado este error en su módulo.


Conclusiones


  • Serializar a / desde JSON es bastante sencillo: qué hay en Python, qué hay en JS.
  • Los habituales son una poderosa herramienta de procesamiento de textos en ambos idiomas.
  • Puede hacer reemplazos usando funciones.
  • Para casos más complejos, puede usar llamadas, interceptación y manejo de errores.

Como se dijo la última vez, puede coincidir línea por línea con los ejemplos de código proporcionados aquí para comprender estructuras de datos y métodos similares para trabajar con ellos: cadenas, matrices, diccionarios, acceso a objetos.


En la siguiente parte, hablaremos sobre patrones de texto, desempaquetar listas, funciones lambda, iteraciones sin usar índices, generadores y conjuntos.

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


All Articles