В Python, как указать аргумент - это список, в котором все элементы имеют одинаковый тип? - PullRequest
1 голос
/ 14 мая 2019

быстрый вопрос ...

Я пытаюсь сделать что-то вроде этого:

from typing import List


def reverse_list(original: List) -> List:
    return original[::-1]

Я хочу получить предупреждение, если передам что-то вроде этого: [1, 3, "a", 10], потому что не все элементы имеют одинаковый тип.

Я хотел бы принять ["c", "a", "b"] или [1, 8, 2] - и пусть Python знает, что возвращаемое значение будет списком строк или списком целых чисел.

Это выполнимо? Я чувствую, что это не так.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 14 мая 2019

Это то, что я придумал

def check_if_mix(list_: List):
    first_type = type(list_[0])
    return any(not isinstance(i, first_type) for i in list_)

check_mix([1,2,3])
>>>False

check_mix([1,2,"a"])
>>>True

Так что, если вы хотите получить предупреждение в случае смешанных типов, самый простой способ - проверить это перед обращением списка:

def reverse_list(original: List) -> List:
    if check_mix(original):
        print('WARNING: list contains mixed types')
    return original[::-1]
1 голос
/ 14 мая 2019

Вам нужно будет сделать тест самостоятельно

from typing import List
import warnings

def sameType(a, b):
 return type(a) == type(b)

def allSameType(aList):
 allZip = zip(aList, aList[1:])
 return all([sameType(a,b) for a,b in allZip])

def reverse_list(original: List) -> List:
    if not allSameType(original):
        warnings.warn('Not all the items in your list are the same type')
    return original[::-1]

Измените type(a) == type(b) на isinstance(a, b), если вы считаете, что унаследованные классы того же типа, что и их предки.

0 голосов
/ 14 мая 2019

Если для проверки вашей программы вы используете средство проверки статического типа, например mypy, то правильно сделать вашу функцию универсальной функцией :

from typing import List, TypeVar

T = TypeVar('T')

def reverse_list(original: List[T]) -> List[T]:
    return original[::-1]

То, что TypeVar является "заполнителем" - проверщик типов поймет, что если мы передадим List[str] в эту функцию, то T должен иметь тип str.Следовательно, он завершит вывод, что тип вывода также должен быть List[str] после завершения подстановки.

Обратите внимание, что это решение даже более эффективно, чем другие, так как проверка времени выполнения вообще не происходит -интерпретатор Python полностью игнорирует подсказки типов.Вместо этого средство проверки статического типа проверит правильность программы.

(Это также потенциально может быть недостатком - вам нужно будет добавить точные подсказки типов в большую часть вашей программы, прежде чем проверка типов начнет становитьсяэффективный способ защиты от ошибок, и это не всегда возможно.)

0 голосов
/ 14 мая 2019

Попробуй вот так.Выполните итерацию по каждому элементу в списке и выведите ошибку, если это не целое число.

from typing import List

def reverse_list(original: List) -> List:
    for element in original:
        if not isinstance(element, int):
            raise TypeError("Element of the list: " + element + " is not an integer.")
    return original[::-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...