#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 следующими способами.
- говорите(«по — английски») — ожидаемый результат должен быть
english
- говорите(«английский», «французский») — ожидаемый результат должен быть
english
иfrench
- говорите(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 потерпят неудачу