From 02ce724adae63eca17176fd5941308a08dd5b365 Mon Sep 17 00:00:00 2001 From: Chris NeJame Date: Fri, 17 Jan 2020 21:03:43 -0500 Subject: [PATCH 1/2] avoid exponential recursion by checking if already added --- src/_pytest/fixtures.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 15ef3b05538..4e5742b9a27 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -886,7 +886,14 @@ def execute(self, request): for argname in self._dependee_fixture_argnames(request): fixturedef = request._get_active_fixturedef(argname) if argname != "request": - fixturedef.addfinalizer(functools.partial(self.finish, request=request)) + for fin in fixturedef._finalizers: + if "request" in fin.keywords: + if self == fin.keywords["request"]._fixturedef: + break + else: + fixturedef.addfinalizer( + functools.partial(self.finish, request=request) + ) my_cache_key = self.cache_key(request) cached_result = getattr(self, "cached_result", None) From 9e013400c3dd3d9f2bd3fdeb3d0227de1f9fbd8c Mon Sep 17 00:00:00 2001 From: Chris NeJame Date: Sat, 18 Jan 2020 05:52:18 -0500 Subject: [PATCH 2/2] Finalizer might not have keywords attribute --- src/_pytest/fixtures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 4e5742b9a27..cefda9582e4 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -887,7 +887,7 @@ def execute(self, request): fixturedef = request._get_active_fixturedef(argname) if argname != "request": for fin in fixturedef._finalizers: - if "request" in fin.keywords: + if "request" in getattr(fin, "keywords", {}): if self == fin.keywords["request"]._fixturedef: break else: