Есть ли способ установить «массив строк» ​​в качестве типа для параметра в функции? - PullRequest
1 голос
/ 02 мая 2019

Я хочу проверить при передаче аргументов функции, является ли аргумент массивом строк.

Как установка типа для параметра функции «массив строк». Но я не хочу перебирать массив в поисках нестроковых элементов.

Есть ли такой тип?

Ответы [ 4 ]

2 голосов
/ 02 мая 2019
>>> isinstance(["abc", "def", "ghi", "jkl"], list)
True
>>> isinstance(50, list)
False

Вы можете использовать это внутри своей функции, чтобы проверить, является ли ваш аргумент списком.

1 голос
/ 02 мая 2019

Попробуйте это:

l = ["abc", "def", "ghi", "jkl"]  
isinstance(l, list) and all(isinstance(i,str) for i in l)

вывод:

In [1]: a = ["abc", "def", "ghi", "jkl"]                                        

In [2]: isinstance(a, list) and all(isinstance(i,str) for i in a)               
Out[2]: True

In [3]: a = ["abc", "def", "ghi", "jkl",2]                                      

In [4]: isinstance(a, list) and all(isinstance(i,str) for i in a)               
Out[4]: False
1 голос
/ 02 мая 2019

Будет ли работать лямбда-функция?

def check_arr_str(li):

    #Filter out elements which are of type string
    res = list(filter(lambda x: isinstance(x,str), li))

    #If length of original and filtered list match, all elements are strings, otherwise not
    return (len(res) == len(li) and isinstance(li, list))

Выходные данные будут выглядеть как

print(check_arr_str(['a','b']))
#True
print(check_arr_str(['a','b', 1]))
#False
print(check_arr_str(['a','b', {}, []]))
#False
print(check_arr_str('a'))
#False

Если необходимо исключение, мы можем изменить функцию следующим образом.

def check_arr_str(li):

    res = list(filter(lambda x: isinstance(x,str), li))
    if (len(res) == len(li) and isinstance(li, list)):
        raise TypeError('I am expecting list of strings')

Другой способ сделать это - использовать any, чтобы проверить, есть ли в списке какой-либо элемент, который не является строкой, или параметр не является списком (спасибо @Netwave за предложение)

def check_arr_str(li):

    #Check if any instance of the list is not a string
    flag = any(not isinstance(i,str) for i in li)

    #If any instance of an item  in the list not being a list, or the input itself not being a list is found, throw exception
    if (flag or not isinstance(li, list)):
        raise TypeError('I am expecting list of strings')
1 голос
/ 02 мая 2019

Способ сделать это пуленепробиваемым - проверить их в функции (к сожалению, перебирая элементы), но использование all с пониманием делает оценку ленивой и остановится в первом элементе, который не является строковым экземпляром. :

def foo(my_str_list):
    is_list = isinstance(my_str_list, list) 
    are_strings = all(isinstance(x, str) for x in my_str_list)
    if not is_list or not are_strings:
        raise TypeError("Funtion argument should be a list of strings.")
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...