Skip to content

Commit 1db78be

Browse files
committed
runner: use insertion-ordered dict instead of stack, dict pair
Since dicts are now ordered, we can use the finalizers dict itself as the dict, simplifying the code.
1 parent 03c3a90 commit 1db78be

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

src/_pytest/runner.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,7 @@ class SetupState:
406406
"""Shared state for setting up/tearing down test items or collectors."""
407407

408408
def __init__(self) -> None:
409-
self.stack: List[Node] = []
410-
self._finalizers: Dict[Node, List[Callable[[], object]]] = {}
409+
self.stack: Dict[Node, List[Callable[[], object]]] = {}
411410

412411
_prepare_exc_key = StoreKey[Union[OutcomeException, Exception]]()
413412

@@ -423,9 +422,7 @@ def prepare(self, colitem: Item) -> None:
423422
needed_collectors = colitem.listchain()
424423
for col in needed_collectors[len(self.stack) :]:
425424
assert col not in self.stack
426-
assert col not in self._finalizers
427-
self.stack.append(col)
428-
self._finalizers[col] = []
425+
self.stack[col] = []
429426
try:
430427
col.setup()
431428
except TEST_OUTCOME as e:
@@ -437,16 +434,15 @@ def addfinalizer(self, finalizer: Callable[[], object], colitem: Node) -> None:
437434
assert colitem and not isinstance(colitem, tuple)
438435
assert callable(finalizer)
439436
assert colitem in self.stack, (colitem, self.stack)
440-
self._finalizers[colitem].append(finalizer)
437+
self.stack[colitem].append(finalizer)
441438

442439
def teardown_exact(self, nextitem: Optional[Item]) -> None:
443440
needed_collectors = nextitem and nextitem.listchain() or []
444441
exc = None
445442
while self.stack:
446-
if self.stack == needed_collectors[: len(self.stack)]:
443+
if list(self.stack.keys()) == needed_collectors[: len(self.stack)]:
447444
break
448-
colitem = self.stack.pop()
449-
finalizers = self._finalizers.pop(colitem)
445+
colitem, finalizers = self.stack.popitem()
450446
finalizers.insert(0, colitem.teardown)
451447
while finalizers:
452448
fin = finalizers.pop()
@@ -457,12 +453,10 @@ def teardown_exact(self, nextitem: Optional[Item]) -> None:
457453
# ideally all should be reported.
458454
if exc is None:
459455
exc = e
460-
for colitem in self._finalizers:
461-
assert colitem in self.stack
462456
if exc:
463457
raise exc
464458
if nextitem is None:
465-
assert not self._finalizers
459+
assert not self.stack
466460

467461

468462
def collect_one_node(collector: Collector) -> CollectReport:

0 commit comments

Comments
 (0)