mark/structures: slightly optimize some functions
`normalize_mark_list` shows up in pandas collection profiles. It's simple enough to improve.
This commit is contained in:
parent
f65dfc39f3
commit
637e8efdd4
|
@ -360,7 +360,7 @@ class MarkDecorator:
|
||||||
return self.with_args(*args, **kwargs)
|
return self.with_args(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def get_unpacked_marks(obj) -> List[Mark]:
|
def get_unpacked_marks(obj: object) -> Iterable[Mark]:
|
||||||
"""Obtain the unpacked marks that are stored on an object."""
|
"""Obtain the unpacked marks that are stored on an object."""
|
||||||
mark_list = getattr(obj, "pytestmark", [])
|
mark_list = getattr(obj, "pytestmark", [])
|
||||||
if not isinstance(mark_list, list):
|
if not isinstance(mark_list, list):
|
||||||
|
@ -368,7 +368,9 @@ def get_unpacked_marks(obj) -> List[Mark]:
|
||||||
return normalize_mark_list(mark_list)
|
return normalize_mark_list(mark_list)
|
||||||
|
|
||||||
|
|
||||||
def normalize_mark_list(mark_list: Iterable[Union[Mark, MarkDecorator]]) -> List[Mark]:
|
def normalize_mark_list(
|
||||||
|
mark_list: Iterable[Union[Mark, MarkDecorator]]
|
||||||
|
) -> Iterable[Mark]:
|
||||||
"""
|
"""
|
||||||
Normalize an iterable of Mark or MarkDecorator objects into a list of marks
|
Normalize an iterable of Mark or MarkDecorator objects into a list of marks
|
||||||
by retrieving the `mark` attribute on MarkDecorator instances.
|
by retrieving the `mark` attribute on MarkDecorator instances.
|
||||||
|
@ -376,14 +378,11 @@ def normalize_mark_list(mark_list: Iterable[Union[Mark, MarkDecorator]]) -> List
|
||||||
:param mark_list: marks to normalize
|
:param mark_list: marks to normalize
|
||||||
:returns: A new list of the extracted Mark objects
|
:returns: A new list of the extracted Mark objects
|
||||||
"""
|
"""
|
||||||
|
for mark in mark_list:
|
||||||
def parse_mark(mark: Union[Mark, MarkDecorator]) -> Mark:
|
|
||||||
mark_obj = getattr(mark, "mark", mark)
|
mark_obj = getattr(mark, "mark", mark)
|
||||||
if not isinstance(mark_obj, Mark):
|
if not isinstance(mark_obj, Mark):
|
||||||
raise TypeError(f"got {repr(mark_obj)} instead of Mark")
|
raise TypeError(f"got {repr(mark_obj)} instead of Mark")
|
||||||
return mark_obj
|
yield mark_obj
|
||||||
|
|
||||||
return [parse_mark(x) for x in mark_list]
|
|
||||||
|
|
||||||
|
|
||||||
def store_mark(obj, mark: Mark) -> None:
|
def store_mark(obj, mark: Mark) -> None:
|
||||||
|
@ -394,7 +393,7 @@ def store_mark(obj, mark: Mark) -> None:
|
||||||
assert isinstance(mark, Mark), mark
|
assert isinstance(mark, Mark), mark
|
||||||
# Always reassign name to avoid updating pytestmark in a reference that
|
# Always reassign name to avoid updating pytestmark in a reference that
|
||||||
# was only borrowed.
|
# was only borrowed.
|
||||||
obj.pytestmark = get_unpacked_marks(obj) + [mark]
|
obj.pytestmark = [*get_unpacked_marks(obj), mark]
|
||||||
|
|
||||||
|
|
||||||
# Typing for builtin pytest marks. This is cheating; it gives builtin marks
|
# Typing for builtin pytest marks. This is cheating; it gives builtin marks
|
||||||
|
|
Loading…
Reference in New Issue