Zastanawiam się, czy coś takiego jest możliwe w python (3.2, jeśli jest to istotne).Korzystanie z Context Manager do sterowania przepływem
with assign_match('(abc)(def)', 'abcdef') as (a, b):
print(a, b)
Jeżeli zachowanie jest:
- jeśli regex meczów, grupy regex przydzielane
a
ib
- Jeśli istnieje jakaś niezgodność, że to wyjątek
- jeśli mecz jest
None
, to po prostu ominąć kontekst całkowicie
Moim celem jest w gruncie rzeczy niezwykle zwięzły sposób na zachowanie kontekstualne.
Próbowałem czyniąc następujące menedżera kontekstowego:
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)
to rzeczywiście działa dokładnie tak, jak to pożądane dla przypadku, gdy mecz Wyrażenia regularne, ale, jak widać, to rzuca ValueError
jeśli nie ma odpowiednika. Czy jest jakiś sposób, aby zmusić go do "skoku" do sekwencji wyjścia?
Dzięki!
można napisać 'dla a, b w ...' – jfs
Jawne "podniesienie StopIteration" jest niepotrzebne. 'if match: yield match.groups()' jest wystarczające. – jfs
Dzięki za napiwek, J.F.! Końcowy kod odzwierciedla twój punkt. –