【问题标题】:Checking range of function argument in python在python中检查函数参数的范围
【发布时间】:2017-05-29 16:51:09
【问题描述】:

如何处理数值上有效但物理上超出范围的函数?

原因,如果离开物理上正确的范围,我希望我的程序告诉我并停止。

我考虑过使用 ValueError 异常来处理这个错误。

例子:

def return_approximation(T):
  #return T only if it is inbetween 0 < T < 100
  return T

【问题讨论】:

  • 如果 T 小于零或大于 100,则引发自定义异常?
  • 那么我们能提供什么帮助呢?
  • by physically out of rangenumerically valid 是什么意思。提供一些例子,也更具体。
  • 这是assert-statement 的用例

标签: python function exception arguments


【解决方案1】:

您应该引发一个名为 ValueError 的异常。

if 0 < T < 100:
    raise ValueError('T must be in the exclusive range (0,100)')

【讨论】:

    【解决方案2】:

    如果返回值符合您的条件,则可以简单地将其限制为 T,否则 return None,如下所示:

    >>> def f(T):
            return T if 0 < T < 100 else None
    
    >>> f(100)
    >>> f(99)
    99
    >>> f(0)
    >>> f(1)
    1
    

    编辑:有例外的解决方案:

    >>> def f(T):
            if 0 < T < 100:
                return T
            else:
                raise ValueError
    
    
    >>> f(100)
    Traceback (most recent call last):
      File "<pyshell#475>", line 1, in <module>
        f(100)
      File "<pyshell#474>", line 5, in f
        raise ValueError
    ValueError
    >>> f(99)
    99
    >>> f(0)
    Traceback (most recent call last):
      File "<pyshell#477>", line 1, in <module>
        f(0)
      File "<pyshell#474>", line 5, in f
        raise ValueError
    ValueError
    >>> f(1)
    1
    

    您甚至可以输出自己的信息以更清晰:

    >>> def f(T):
            if 0 < T < 100:
                return T
            else:
                raise Exception('T is out of Range')
    
    >>> f(100)
    Traceback (most recent call last):
      File "<pyshell#484>", line 1, in <module>
        f(100)
      File "<pyshell#483>", line 5, in f
        raise Exception('T is out of Range')
    Exception: T is out of Range
    

    【讨论】:

    • 您能否详细说明在这种情况下使用 None 。例如程序的预期行为。
    • 返回 None 以表示特殊含义的函数很容易出错,因为 None 和其他值(例如,零、空字符串)在条件表达式中的计算结果都为 False。 因此,它可能不太容易记录并引发异常。但在这种特殊情况下,似乎 None 不会造成任何问题。
    • @tarashypka,正确,但这取决于应用程序,它可以用作决定下一步的返回条件,我不清楚 OP 要求是返回一些东西来测试还是提出一个例外,但我也打算在上面添加一些东西。
    • @marou,第一个函数,如果 T 介于 0 和 100 之间,则返回 T 的值,否则返回 None,第二个函数,如果 T 不在之间,最终将引发异常0 和 100。
    【解决方案3】:

    我不确定你所说的 physically 是什么意思。

    一般来说,如果超出范围的错误是由外部数据引起的,你应该抛出一个异常;如果错误来自您自己的数据,您可以使用assert 中止当前执行。

    【讨论】:

    • 我想区分物理上正确的函数输入(在函数的上下文中)和数字正确的输入(不会产生错误)。
    • @marou:那么@mkiever 所描述的assert 是要走的路。
    【解决方案4】:

    Python 有 assert-statement 用于这种参数限制。

    def return_approximation(T):
        assert 0 < T < 100, "Argument 'T' out of range"
        return T
    

    【讨论】:

    • 带有 synatx:assert Expression[, Arguments] 的 assert 语句在 Expression 失败时引发 AssertionError 并使用带有 AssertionError 的 Argument。正确设置后,可以使用python -O my_prog.py 切换断言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2011-01-25
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多