[text] slightly improve performance of 'extract' functions

by using 'None' instead of '0' as default 'pos' value
this only saves a few nanoseconds per call, but still
This commit is contained in:
Mike Fährmann
2025-05-23 17:53:28 +02:00
parent f3ed15573a
commit fe39b7d8c8

View File

@@ -100,7 +100,7 @@ def nameext_from_url(url, data=None):
return data return data
def extract(txt, begin, end, pos=0): def extract(txt, begin, end, pos=None):
"""Extract the text between 'begin' and 'end' from 'txt' """Extract the text between 'begin' and 'end' from 'txt'
Args: Args:
@@ -125,7 +125,7 @@ def extract(txt, begin, end, pos=0):
last = txt.index(end, first) last = txt.index(end, first)
return txt[first:last], last+len(end) return txt[first:last], last+len(end)
except Exception: except Exception:
return None, pos return None, 0 if pos is None else pos
def extr(txt, begin, end, default=""): def extr(txt, begin, end, default=""):
@@ -137,14 +137,14 @@ def extr(txt, begin, end, default=""):
return default return default
def rextract(txt, begin, end, pos=-1): def rextract(txt, begin, end, pos=None):
try: try:
lbeg = len(begin) lbeg = len(begin)
first = txt.rindex(begin, 0, pos) first = txt.rindex(begin, None, pos)
last = txt.index(end, first + lbeg) last = txt.index(end, first + lbeg)
return txt[first + lbeg:last], first return txt[first + lbeg:last], first
except Exception: except Exception:
return None, pos return None, -1 if pos is None else pos
def rextr(txt, begin, end, pos=None, default=""): def rextr(txt, begin, end, pos=None, default=""):
@@ -156,7 +156,7 @@ def rextr(txt, begin, end, pos=None, default=""):
return default return default
def extract_all(txt, rules, pos=0, values=None): def extract_all(txt, rules, pos=None, values=None):
"""Calls extract for each rule and returns the result in a dict""" """Calls extract for each rule and returns the result in a dict"""
if values is None: if values is None:
values = {} values = {}
@@ -164,10 +164,10 @@ def extract_all(txt, rules, pos=0, values=None):
result, pos = extract(txt, begin, end, pos) result, pos = extract(txt, begin, end, pos)
if key: if key:
values[key] = result values[key] = result
return values, pos return values, 0 if pos is None else pos
def extract_iter(txt, begin, end, pos=0): def extract_iter(txt, begin, end, pos=None):
"""Yield values that would be returned by repeated calls of extract()""" """Yield values that would be returned by repeated calls of extract()"""
try: try:
index = txt.index index = txt.index
@@ -182,7 +182,7 @@ def extract_iter(txt, begin, end, pos=0):
return return
def extract_from(txt, pos=0, default=""): def extract_from(txt, pos=None, default=""):
"""Returns a function object that extracts from 'txt'""" """Returns a function object that extracts from 'txt'"""
def extr(begin, end, index=txt.index, txt=txt): def extr(begin, end, index=txt.index, txt=txt):
nonlocal pos nonlocal pos