Skip to content

Commit bc17034

Browse files
committed
Fix typing of params ids callable form
The previous typing had an object passed to the user, which they can't do anything with without asserting, which is inconvenient. Change it to Any instead. Note that what comes *back* to pytest (the return value) should be an `object`, because we want to handle arbitrary objects without assuming anything about them.
1 parent 91f6892 commit bc17034

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

src/_pytest/fixtures.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@ def __init__(
976976
ids: Optional[
977977
Union[
978978
Tuple[Union[None, str, float, int, bool], ...],
979-
Callable[[object], Optional[object]],
979+
Callable[[Any], Optional[object]],
980980
]
981981
] = None,
982982
) -> None:
@@ -1128,13 +1128,13 @@ def _ensure_immutable_ids(
11281128
ids: Optional[
11291129
Union[
11301130
Iterable[Union[None, str, float, int, bool]],
1131-
Callable[[object], Optional[object]],
1131+
Callable[[Any], Optional[object]],
11321132
]
11331133
],
11341134
) -> Optional[
11351135
Union[
11361136
Tuple[Union[None, str, float, int, bool], ...],
1137-
Callable[[object], Optional[object]],
1137+
Callable[[Any], Optional[object]],
11381138
]
11391139
]:
11401140
if ids is None:
@@ -1180,7 +1180,7 @@ class FixtureFunctionMarker:
11801180
ids = attr.ib(
11811181
type=Union[
11821182
Tuple[Union[None, str, float, int, bool], ...],
1183-
Callable[[object], Optional[object]],
1183+
Callable[[Any], Optional[object]],
11841184
],
11851185
default=None,
11861186
converter=_ensure_immutable_ids,
@@ -1223,7 +1223,7 @@ def fixture(
12231223
ids: Optional[
12241224
Union[
12251225
Iterable[Union[None, str, float, int, bool]],
1226-
Callable[[object], Optional[object]],
1226+
Callable[[Any], Optional[object]],
12271227
]
12281228
] = ...,
12291229
name: Optional[str] = ...
@@ -1241,7 +1241,7 @@ def fixture( # noqa: F811
12411241
ids: Optional[
12421242
Union[
12431243
Iterable[Union[None, str, float, int, bool]],
1244-
Callable[[object], Optional[object]],
1244+
Callable[[Any], Optional[object]],
12451245
]
12461246
] = ...,
12471247
name: Optional[str] = None
@@ -1258,7 +1258,7 @@ def fixture( # noqa: F811
12581258
ids: Optional[
12591259
Union[
12601260
Iterable[Union[None, str, float, int, bool]],
1261-
Callable[[object], Optional[object]],
1261+
Callable[[Any], Optional[object]],
12621262
]
12631263
] = None,
12641264
name: Optional[str] = None

src/_pytest/mark/structures.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ def __call__( # type: ignore[override]
433433
ids: Optional[
434434
Union[
435435
Iterable[Union[None, str, float, int, bool]],
436-
Callable[[object], Optional[object]],
436+
Callable[[Any], Optional[object]],
437437
]
438438
] = ...,
439439
scope: Optional[_Scope] = ...

src/_pytest/python.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from collections import defaultdict
1212
from collections.abc import Sequence
1313
from functools import partial
14+
from typing import Any
1415
from typing import Callable
1516
from typing import Dict
1617
from typing import Generator
@@ -920,7 +921,7 @@ def parametrize(
920921
ids: Optional[
921922
Union[
922923
Iterable[Union[None, str, float, int, bool]],
923-
Callable[[object], Optional[object]],
924+
Callable[[Any], Optional[object]],
924925
]
925926
] = None,
926927
scope: "Optional[_Scope]" = None,
@@ -1040,7 +1041,7 @@ def _resolve_arg_ids(
10401041
ids: Optional[
10411042
Union[
10421043
Iterable[Union[None, str, float, int, bool]],
1043-
Callable[[object], Optional[object]],
1044+
Callable[[Any], Optional[object]],
10441045
]
10451046
],
10461047
parameters: typing.Sequence[ParameterSet],
@@ -1226,7 +1227,7 @@ def _idval(
12261227
val: object,
12271228
argname: str,
12281229
idx: int,
1229-
idfn: Optional[Callable[[object], Optional[object]]],
1230+
idfn: Optional[Callable[[Any], Optional[object]]],
12301231
nodeid: Optional[str],
12311232
config: Optional[Config],
12321233
) -> str:
@@ -1266,7 +1267,7 @@ def _idvalset(
12661267
idx: int,
12671268
parameterset: ParameterSet,
12681269
argnames: Iterable[str],
1269-
idfn: Optional[Callable[[object], Optional[object]]],
1270+
idfn: Optional[Callable[[Any], Optional[object]]],
12701271
ids: Optional[List[Union[None, str]]],
12711272
nodeid: Optional[str],
12721273
config: Optional[Config],
@@ -1287,7 +1288,7 @@ def _idvalset(
12871288
def idmaker(
12881289
argnames: Iterable[str],
12891290
parametersets: Iterable[ParameterSet],
1290-
idfn: Optional[Callable[[object], Optional[object]]] = None,
1291+
idfn: Optional[Callable[[Any], Optional[object]]] = None,
12911292
ids: Optional[List[Union[None, str]]] = None,
12921293
config: Optional[Config] = None,
12931294
nodeid: Optional[str] = None,

testing/typing_checks.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,15 @@
1010
@pytest.mark.xfail(raises=RuntimeError)
1111
def check_mark_xfail_raises() -> None:
1212
pass
13+
14+
15+
# Issue #7494.
16+
@pytest.fixture(params=[(0, 0), (1, 1)], ids=lambda x: str(x[0]))
17+
def check_fixture_ids_callable() -> None:
18+
pass
19+
20+
21+
# Issue #7494.
22+
@pytest.mark.parametrize("func", [str, int], ids=lambda x: str(x.__name__))
23+
def check_parametrize_ids_callable(func) -> None:
24+
pass

0 commit comments

Comments
 (0)