Почему моя проверка того, когда аргумент функции не относится к заданному типу, не работает?

#python #function

Вопрос:

У меня есть очень простая функция, которая принимает в качестве входных данных строку, я попытался проверить функцию, чтобы, если аргументы функции не являются строкой, она выдала ошибку, иначе вернет строку.

Проблема прямо сейчас заключается в том, что , когда я передаю int , я ожидаю, что функция отобразит ошибку, но она просто выводит кортеж int . Что я здесь делаю не так?

 def speak(*languages):

    """Function takes a set of langs as input  and returns a list of languages"""
    
    try:
        if  type(languages) ==  str:
            languages = list(languages)
    except TypeError as error:
        print(error, ' You need to pass in the right datatype')
    else:
        return languages
 

Я тоже пробовал это.

 def speak(*languages):

    """Function takes a set of langs as input  and returns a list of languages"""
    
    try:
        if  isinstance(languages, str):
            languages = list(languages)
    except TypeError as error:
        print(error, ' You need to pass in the right datatype')
    else:
        return languages
 

Я вызываю функцию speak следующими способами.

  1. говорите(«по — английски») — ожидаемый результат должен быть english
  2. говорите(«английский», «французский») — ожидаемый результат должен быть english и french
  3. говорите(34) — я ожидаю, что функция выдаст ошибку

Комментарии:

1. languages кстати, это будет список, а не строка.

2. @mkrieger1 Кортеж, а не список.

3. Приведите пример того, как вы вызываете speak() , т. е. Покажите параметры, которые вы передаете

4. Почему звездочка внутри *languages ? Как отмечали другие, вы должны показать, как вы вызываете свою функцию и каков ожидаемый результат для каждого случая.

5. @Carlos Я только что обновил вопрос, указав способы вызова функции и ожидаемый результат

Ответ №1:

После того, как вы предоставили свои примеры вызовов, похоже, что вы хотите проверить все аргументы на строковый тип, а не один аргумент. Верно?

Вы можете использовать any для этого, что будет верно, если какое-либо значение списка/генератора истинно. В понимании генератора вы можете выполнить isinstance все (позиционные) аргументы

 def speak(*languages):
    """Function takes a set of langs as input  and returns a list of languages"""
    
    if any(not isinstance(lang, str) for lang in languages):
        raise TypeError('You need to pass in the right datatype')

    return list(languages)
 
 >>> speak('english')
>>> speak('english', 'french')
>>> speak(34)
Traceback (most recent call last):
  File "<string>", line 14, in <module>
  File "<string>", line 5, in speak
TypeError: You need to pass in the right datatype
 

Ответ №2:

Я не думаю, что здесь нужно пытаться, кроме как. Может быть, попробовать что-то вроде этого (следуя вашим рассуждениям):

 def speak(*languages):

    """Function takes a set of langs as input  and returns a list of languages"""
    for lang in list(languages):
        if not isinstance(lang, str):
            print(' You need to pass in the right datatype')
            return
    else:
        languages = list(languages)
        return languages

print(speak('english')) # english
print(speak('english', 'french')) # english and french
print(speak(34)) # error
 

Комментарии:

1. передача строки в качестве аргумента в приведенную выше функцию выполняет else инструкцию. чего не должно быть. Я ожидаю if , что заявление пройдет в таком состоянии

2. @ChukwukaOkolie Отредактировал ответ вместе с вашими тестовыми примерами

Ответ №3:

Ни type(languages) == str то , ни isinstance(languages, str) другое не бросит TypeError , так что в вас except никогда не попадут. Вам просто нужно else после вашего if :

 def speak(*languages):
    """Function takes a set of langs as input and returns a list of languages"""

    if isinstance(languages, str):
        return list(languages)
    else:
        raise TypeError('You need to pass in the right datatype')
 

Примечание: Я не думаю, что вы хотите list(languages) , чтобы выше — list("a str") дает ['a', ' ', 's', 't', 'r'] . Но я оставил его, потому что это не имеет отношения к вопросу.

Ответ №4:

На самом деле вы не выдаете здесь ошибку, для этого вам нужно использовать raise :

 def speak(*languages):

    """Function takes a set of langs as input  and returns a list of languages"""
    
    if  isinstance(languages, str):
        languages = list(languages)
        
    else:
        raise TypeError('You need to pass in the right datatype')
        
    return languages
 

Комментарии:

1. Приведенная выше функция выдает ошибку, когда я передаю str в качестве аргумента, что не должно быть ожидаемым поведением

2. Я попробовал ваше решение speak('english') , используя speak(50) и. два вызова функций выдают ошибку. Я ожидаю, что 1 пройдет, а 2 потерпят неудачу