【问题标题】:Raising TypeError when type is not correct类型不正确时引发 TypeError
【发布时间】:2022-01-18 20:08:56
【问题描述】:

我想调用函数foo(a, b, c),其中参数可以是intfloat 这些参数用户输入使用space 作为分隔符。 例如:1 8 9

同时,用户不仅可以输入数字,还可以输入一些错字,例如: 1 8k 9。 在这种情况下,我应该提出 TypeError 并输入错误元素的数量

a, b, c = map(int, input().split())

for i, key in enumerate([a, b, c]):
   if not isinstance(key, (int, float)):
       raise TypeError(
           f'The type of {i + 1} element is incorrect')
foo(float(a), float(b), float(c))

在我的代码中出现下一个错误:我无法将k8 写入int 变量。

1 k8 5
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\digits\main.py", line 40, in <module>
    a, b, c = map(int, input().split())
ValueError: invalid literal for int() with base 10: 'k8'

当用户输入k8 时如何引发 TypeError? 如果用户输入k8 9 5h,情况如何?在这种情况下,我需要使用消息 The type of 1, 3 element is incorrect 引发 TypeError

【问题讨论】:

  • 那么你必须在这行之前检查输入是否可以转换为float或int:a, b, c = map(int, input().split())
  • 如果允许浮动,为什么要使用map(int, ...)

标签: python exception typeerror


【解决方案1】:

应该这样做:

args = input().split()

f_args = []
errors = []
for i, arg in enumerate(args, 1):
    try:
        f_args.append(float(arg))
    except ValueError:
        errors.append(str(i))
if errors:
    raise TypeError(f"The type of {', '.join(errors)} element is incorrect")

foo(*f_args)

【讨论】:

  • 谢谢!如果三个输入中有两个不正确,例如5 9k 6j,我该如何输入错误消息The type of 2, 3 element is incorrect
  • 那么您需要将i 值累积到一个列表中,而不是立即提高TypeError,以便在最后引发错误。让我解决这个问题。
  • 谢谢你,@Samwise 它对我来说很好用!需要时间来理解它,但我会的:)
  • 嗨,@Samwise!也许你可以帮助我:我需要使用任何参数调用foo,即用户输入。但是如果参数包含像8k 这样的符号,我需要在我的foo 函数中提高TypeError,而不是在它之前
  • 只要把上面的逻辑放到你的foo函数里面。
猜你喜欢
  • 2012-03-30
  • 2020-02-16
  • 1970-01-01
  • 2019-11-04
  • 2016-10-25
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多