代码之家  ›  专栏  ›  技术社区  ›  CroissantEngineer

简明的整体浮动检查

  •  1
  • CroissantEngineer  · 技术社区  · 4 年前

    我想改进我的编码。

    最近我在想一些我作为Python构造函数的一部分编写的代码。构造函数只允许整数或整数浮动。我想出了一些方法来检查这个,但是我想把它放在这里,看看是否有一个更简洁的方法来执行这个双重异常检查。

    方法1: 尝试,除了。

    try:
      if not float(x).is_integer:
        raise ValueError('X must be a whole number float')
    except:
      raise ValueError('X must be an int or a float'):
    

    方法2: 双if。

    if not isinstance(x, (int, float)):
        raise ValueError('X must be an int or whole number float.')
    
    elif not float(x).is_integer():
        raise ValueError('X must be a whole number float.')
    

    方法3: 不允许任何非整数。

    if not isinstance(x, int):
        raise ValueError('X must be an int.')
    

    我想看看最好的办法是什么。方法3将保存一些代码行,尽管它对代码添加了不必要的限制。方法1和方法2更加灵活,反映了检查的意图——为不接受输入的原因提供灵活性和透明度。

    有没有更简洁的方法来执行上述检查?

    提前谢谢!

    1 回复  |  直到 4 年前
        1
  •  2
  •   Chrispresso    4 年前

    or and 也就是说,如果其中一个条件“短路”了其他条件,他们不需要评估整个条件。

    int float :

    In [37]: class T:
        ...:     def __init__(self, val):
        ...:         if not (isinstance(val, (int, float)) and float(val).is_integer()):
        ...:             raise Exception(f'{val} must be a whole number float or integer')
        ...:
    
    In [38]: T(12)
    Out[38]: <__main__.T at 0x2605d2174f0>
    
    In [39]: T(14.)
    Out[39]: <__main__.T at 0x2605d1dda60>
    
    In [40]: T('hello')  # Raises exception
    

    isinstance 首先,如果因为传入字符串而无法传递,它将永远不会尝试将其转换为浮点。