Да, но только если вы в порядке с созданием нового списка:
from typing import List, Type, TypeVar
T = TypeVar('T')
def verify_contains(items: List[object], inner_type: Type[T]) -> List[T]:
# Mypy currently needs this hint to infer what 'clean_items' is
# supposed to contain. Other type checkers may not.
clean_items: List[T] = []
for item in items:
if not isinstance(item, inner_type):
raise TypeError("List contents must be all ints")
clean_items.append(item)
return clean_items
Если вы не знаете, что такое TypeVars, они позволяют вам написать generi c код. См. https://mypy.readthedocs.io/en/stable/generics.html для более подробной информации.
Тип позволяет вам указать, что вы хотите объект класса, а не экземпляр класса. См. https://www.python.org/dev/peps/pep-0484/#the -type-of-class-objects для получения более подробной информации.
Причина, по которой нам нужно создать новый список, заключается в том, что если мы этого не сделаем, вы может привести к ошибке в вашем коде из-за мутации. Например:
original: List[object] = [3, 2, 1]
all_ints = verify_contains(original, int)
# Legal, since strs are a kind of object
original.append("boom")
# ...but if verify_contains doesn't return a copy, this will
# print out [3, 2, 1, "boom"]!
print(all_ints)
Если вы можете игнорировать эту потенциальную ошибку, используйте приведение, как это предлагается в некоторых других ответах.
Еще один альтернативный подход может быть просто использовать библиотеку, такую как Pydanti c вместо того, чтобы писать эту логику проверки c самостоятельно.
Лично я бы выбрал такой подход: я могу сосредоточиться только на написании выровнять схемы, используя типы PEP 484, и позволить библиотеке обрабатывать проверку для меня.