Me pregunto si algo como esto es posible en python (3.2, si es relevante).Usando Context Manager para Control Flow
with assign_match('(abc)(def)', 'abcdef') as (a, b):
print(a, b)
Cuando el comportamiento es:
- si las coincidencias de expresiones regulares, los grupos de expresiones regulares se asignan a
a
yb
- si hay una falta de coincidencia no, sería una excepción
- si el partido es
None
, simplemente omitir completamente el contexto
Mi objetivo aquí es básicamente una forma extremadamente concisa de realizar el comportamiento contextual.
he intentado hacer lo siguiente gestor de contexto:
import re
class assign_match(object):
def __init__(self, regex, string):
self.regex = regex
self.string = string
def __enter__(self):
result = re.match(self.regex, self.string)
if result is None:
raise ValueError
else:
return result.groups()
def __exit__(self, type, value, traceback):
print(self, type, value, traceback) #testing purposes. not doing anything here.
with assign_match('(abc)(def)', 'abcdef') as (a, b):
print(a, b) #prints abc def
with assign_match('(abc)g', 'abcdef') as (a, b): #raises ValueError
print(a, b)
En realidad funciona exactamente como se desea para el caso en que el partido de expresiones regulares, pero, como se puede ver, se lanza la ValueError
si no hay coincidencia. ¿Hay alguna manera de que pueda "saltar" a la secuencia de salida?
Gracias!
puede escribir 'for a, b in ...' – jfs
Explicit 'raise StopIteration' no es necesario. 'if match: yield match.groups()' es suficiente. – jfs
Gracias por el consejo, J.F.! El código final refleja tu punto. –