When using the pytest.fixture decorator with a callable as the scope argument for dynamic scoping, it is not easily possible to type the callable correctly so that type checkers will, not complain.
Example:
def determine_my_client_scope(_fixture_name: str, config: pytest.Config) -> str:
return config.getoption("--my-client-fixture-scope", "session")
@pytest.fixture(scope=determine_my_client_scope)
def my_client() -> str:
return "Hello world!"
gives (using basedpyright):
Argument of type "(_fixture_name: str, config: Config) -> str" cannot be assigned to parameter "scope" of type "_ScopeName | ((str, Config) -> _ScopeName)" in function "fixture"
Type "(_fixture_name: str, config: Config) -> str" is not assignable to type "_ScopeName | ((str, Config) -> _ScopeName)"
Type "(_fixture_name: str, config: Config) -> str" is not assignable to type "(str, Config) -> _ScopeName"
Function return type "str" is incompatible with type "_ScopeName"
Type "str" is not assignable to type "_ScopeName"
"str" is not assignable to type "Literal['session']"
[...]
The issue is that the _ScopeName type is private to pytest, so we cannot use it for typing the callable. It would make sense to either make this type public, so people cannot type their functions appropriately, or just use str in the typing.
pytest version: 9.0.2
When using the pytest.fixture decorator with a callable as the
scopeargument for dynamic scoping, it is not easily possible to type the callable correctly so that type checkers will, not complain.Example:
gives (using basedpyright):
The issue is that the
_ScopeNametype is private to pytest, so we cannot use it for typing the callable. It would make sense to either make this type public, so people cannot type their functions appropriately, or just usestrin the typing.pytest version: 9.0.2