Merge pull request #9148 from bluetech/lru-cache-method

Avoid `@lru_cache` on methods
This commit is contained in:
Ran Benita 2021-10-01 16:16:51 +03:00 committed by GitHub
commit d8831c64eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 7 deletions

View File

@ -554,6 +554,7 @@ def set_location(node, lineno, col_offset):
return node return node
@functools.lru_cache(maxsize=1)
def _get_assertion_exprs(src: bytes) -> Dict[int, str]: def _get_assertion_exprs(src: bytes) -> Dict[int, str]:
"""Return a mapping from {lineno: "assertion test expression"}.""" """Return a mapping from {lineno: "assertion test expression"}."""
ret: Dict[int, str] = {} ret: Dict[int, str] = {}
@ -675,10 +676,6 @@ class AssertionRewriter(ast.NodeVisitor):
self.enable_assertion_pass_hook = False self.enable_assertion_pass_hook = False
self.source = source self.source = source
@functools.lru_cache(maxsize=1)
def _assert_expr_to_lineno(self) -> Dict[int, str]:
return _get_assertion_exprs(self.source)
def run(self, mod: ast.Module) -> None: def run(self, mod: ast.Module) -> None:
"""Find all assert statements in *mod* and rewrite them.""" """Find all assert statements in *mod* and rewrite them."""
if not mod.body: if not mod.body:
@ -906,7 +903,7 @@ class AssertionRewriter(ast.NodeVisitor):
# Passed # Passed
fmt_pass = self.helper("_format_explanation", msg) fmt_pass = self.helper("_format_explanation", msg)
orig = self._assert_expr_to_lineno()[assert_.lineno] orig = _get_assertion_exprs(self.source)[assert_.lineno]
hook_call_pass = ast.Expr( hook_call_pass = ast.Expr(
self.helper( self.helper(
"_call_assertion_pass", "_call_assertion_pass",

View File

@ -522,7 +522,6 @@ class PytestPluginManager(PluginManager):
if x.is_dir(): if x.is_dir():
self._getconftestmodules(x, importmode, rootpath) self._getconftestmodules(x, importmode, rootpath)
@lru_cache(maxsize=128)
def _getconftestmodules( def _getconftestmodules(
self, path: Path, importmode: Union[str, ImportMode], rootpath: Path self, path: Path, importmode: Union[str, ImportMode], rootpath: Path
) -> List[types.ModuleType]: ) -> List[types.ModuleType]:
@ -534,12 +533,19 @@ class PytestPluginManager(PluginManager):
else: else:
directory = path directory = path
# Optimization: avoid repeated searches in the same directory.
# Assumes always called with same importmode and rootpath.
existing_clist = self._dirpath2confmods.get(directory)
if existing_clist:
return existing_clist
# XXX these days we may rather want to use config.rootpath # XXX these days we may rather want to use config.rootpath
# and allow users to opt into looking into the rootdir parent # and allow users to opt into looking into the rootdir parent
# directories instead of requiring to specify confcutdir. # directories instead of requiring to specify confcutdir.
clist = [] clist = []
confcutdir_parents = self._confcutdir.parents if self._confcutdir else []
for parent in reversed((directory, *directory.parents)): for parent in reversed((directory, *directory.parents)):
if self._confcutdir and parent in self._confcutdir.parents: if parent in confcutdir_parents:
continue continue
conftestpath = parent / "conftest.py" conftestpath = parent / "conftest.py"
if conftestpath.is_file(): if conftestpath.is_file():