python - 检查数字 Python 代码中的参数

标签 python exception arguments assert

我发现自己一直在为数字运算编写相同的参数检查代码:

def myfun(a, b):
    if a < 0:
        raise ValueError('a cannot be < 0 (was a=%s)' % a)
    # more if.. raise exception stuff here ...
    return a + b

有没有更好的方法?我被告知不要对这些事情使用“断言”(尽管我没有看到问题,除了不知道导致错误的变量的值)。

编辑:需要澄清的是,参数通常只是数字,错误检查条件可能很复杂、非常重要,并且不一定会在以后导致异常,而只会导致错误的结果。 (不稳定的算法,无意义的解决方案等)

最佳答案

如果您使用 python -O 运行,

assert 会被优化掉(适度的优化,但有时很高兴拥有)。如果您有经常重复的模式,一个更好的选择可能是使用装饰器——消除重复的好方法。例如,假设您有无数个函数,必须按位置(而不是按关键字)使用参数调用,并且它们的第一个参数必须为正数;然后……:

def firstargpos(f):
  def wrapper(first, *args):
    if first < 0:
      raise ValueError(whateveryouwish)
    return f(first, *args)
  return wrapper

然后你说这样的话:

@firstargpos def myfun(a, b): ...

并且检查是在装饰器(或者更确切地说是它返回的包装闭包)中一劳永逸地执行的。所以,唯一棘手的部分是弄清楚你的函数需要什么检查以及如何最好地调用装饰器来表达这些(很难说,没有看到你定义的函数集和每个需要的检查集!-)。请记住,DRY(“Don't Repeat Yourself”)接近软件开发指导原则中的头把交椅,Python 有合理的支持让您实现 DRY 并避免样板、重复的代码!-)

关于python - 检查数字 Python 代码中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641591/

相关文章:

python - 启用 CORS Google Cloud Function (Python)

c# - 如何高效避免重复键异常

javascript - JSLint 测试版错误

java - 将对象作为参数传递与将数组作为参数传递有何不同?

python - 来自 unix utc 秒的 numpy datetime64

python - Into 和 From 接口(interface) : struggling with typing. 类型的协方差

python + celery : ignore task results on a per-invocation basis?

c# - 事后发现非法/损坏的容器对象状态抛出哪个异常?

python - 在 python 中,如何让我自己的异常类在 shell 中漂亮地打印出来?

arguments - Julia:如何使用关键字参数?