【问题标题】:Are there a function *argument* decorators like there are function decorators?是否有像函数装饰器一样的函数 *argument* 装饰器?
【发布时间】:2021-04-19 22:03:48
【问题描述】:

我在 python 中有一些函数,我需要验证某些参数是否为None,否则引发异常。目前我的解决方案是:

def notnone(arg):
  if arg == None:
    raise Exception()
  return arg

def example_function(..., a, ...):
  a = notnone(a)
  ...

在python中,有没有更优雅的解决方案?和装饰器一样优雅的功能?我在想像下面这样的事情(虽然我知道这行不通):

def example_function(..., @notnone a, ...):
  ...

【问题讨论】:

  • 不,Python 语法不支持参数上的装饰器。
  • 你最好的选择可能是类型注释。

标签: python design-patterns decorator


【解决方案1】:

要确保函数体内的某些内容不是 none,您可以使用:

assert a is not None, "a can't be None"

要确保某些东西不存在,您可以使用:

assert a is None, "a must be None"

如果条件不匹配,代码执行将停止。

还要注意位置参数永远不会是 None 除非你明确地传入 None (即在调用期间不能留空)。

如果您确切地知道变量将是什么类型,那么最好的语法选择就是类型注释。我不认为打字模块适用于此,因为它不提供is not 功能。

【讨论】:

  • 不要在生产代码中使用assert!如果 Python 在优化模式下运行,assert 语句将被忽略。
  • @KlausD:我不同意,asserts 在生产代码中很好。
  • @martineau 为什么?它在优化模式下被忽略。 ?
  • 不知道:因为人们通常希望在将脚本投入“生产”时删除调试代码(这通常意味着代码所在的模块是imported),所以使用assert意味着您不需要两个版本的代码。对于永久的非调试代码,您需要使用其他东西,类似于 OP 已经在做的事情。 assert 的文档显示了它的等价物,因此很容易编写自己的类似 assert 的函数,不会被删除。
  • 请参阅this answer 问题Best practice for using assert?,了解何时使用assert 以及何时不使用。
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 2014-07-21
  • 2010-10-27
  • 2019-05-26
  • 2011-10-04
  • 2011-06-06
  • 2011-06-25
相关资源
最近更新 更多