diff --git a/src/_pytest/store.py b/src/_pytest/store.py index 0dcea1b93..eed50d103 100644 --- a/src/_pytest/store.py +++ b/src/_pytest/store.py @@ -104,6 +104,15 @@ class Store: except KeyError: return default + def setdefault(self, key: StoreKey[T], default: T) -> T: + """Return the value of key if already set, otherwise set the value + of key to default and return default.""" + try: + return self[key] + except KeyError: + self[key] = default + return default + def __delitem__(self, key: StoreKey[T]) -> None: """Delete the value for key. diff --git a/testing/test_store.py b/testing/test_store.py index ae6cfccdd..98014887e 100644 --- a/testing/test_store.py +++ b/testing/test_store.py @@ -37,6 +37,14 @@ def test_store() -> None: with pytest.raises(KeyError): store[key1] + # setdefault + store[key1] = "existing" + assert store.setdefault(key1, "default") == "existing" + assert store[key1] == "existing" + key_setdefault = StoreKey[bytes]() + assert store.setdefault(key_setdefault, b"default") == b"default" + assert store[key_setdefault] == b"default" + # Can't accidentally add attributes to store object itself. with pytest.raises(AttributeError): store.foo = "nope" # type: ignore[attr-defined] # noqa: F821