【问题标题】:Try Except String vs Int Python尝试 String 与 Int Python 除外
【发布时间】:2015-12-01 20:32:22
【问题描述】:

我不确定是否使用 try/except 或 if 条件来检测数字是 int 还是 float。我知道我的输入是浮点数或整数,并且我想为所有浮点数引发值错误,如果数字是整数,则执行某些操作。可能会看到此类行为的一个示例是阶乘……但是,我不希望将 5.0 转换为 5。最好的方法是什么?

factorial(5)
> 120
factorial(asdf)
> ValueError
factorial(5.0)
> ValueError

我读了这个问题Parse String to Float or Int,但我还是很困惑

【问题讨论】:

  • 我建议您根本不要检测输入类型。如果您只是实现 factorial 而不关心输入类型,它可能 (a) 适用于有意义的类型,并且 (b) 无论如何都会引发其他类型的执行。
  • 你在说什么factorial函数?是你写的吗?
  • @tdelaney 我很确定它只是math.factorial,但仍然是一个好问题
  • 我认为这并不重要。我只是以阶乘为例,我想在其中区分浮点数和整数。实际用途是分析我在没有 API 的情况下抓取的 English Soccer 数据,因此有点混乱。我可以用另一种方式来做,但是因为我有想法并且不知道解决方案,所以我想我会问。这个问题更具理论性......
  • @JoranBeasley math.factorial 不会使用 5.0 引发 ValueError。我希望将 OP 引入一个与他的问题有关的示例。

标签: python int type-conversion


【解决方案1】:

此解决方案基于int("1.235") 将引发值错误这一事实,因为字符串将其必须 转换为literal int。这要求my_value 是一个字符串!因为int(1.235) 只会将浮点数截断为int

my_value = raw_input("Enter Value")

try:
  my_value = int(my_value)
except ValueError:
  try:
     float(my_value)
     print "Its a float not an int!"
     raise ValueError("Expected Int, got Float!")
  except ValueError:
     print "Its a string not a float or int"
     raise TypeError("Expected Int, got String!")
else:
  print "OK its an int"

【讨论】:

  • 你应该删除raise 否则它仍然会引发错误
  • 我以为他会想在其他地方抓住它,如果不是这种情况,那么是的,应该取消加薪
  • 请注意,就像在您的示例中一样,必须确保 my_value 最初是一个字符串。否则这仍然会通过浮点数。
  • raw_input 保证返回一个字符串......但是适当地注明了
  • @JoranBeasley 如果 OP 只想要一个 valueError 如果不是 int 那么你不需要第二次尝试,除了语句
【解决方案2】:

如果要类型安全地检查变量是否为 int,可以使用isinstance()

def factorial(var):
    if not isinstance(var, int):
        raise ValueError('var must be an int')
    # do stuff

这显然也会为任何字符串引发ValueError(所以"5" 不起作用,如果这是你想要的)。

【讨论】:

  • 我认为这是一个合理的解决方案,因为它建议isinstance(比type(x) 好得多)......所以+1......但我认为这不能完全解决OP 遇到的问题(isinstance 的 +1 都是一样的)
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多