np array as optional arguments
我有一个函数可以接受两个可选的
1 2 3 4 | def f(some_stuff, this=None, that=None): ...do something... if this and that: perform_the_task() |
如果没有传递任何可选参数,则可以按预期工作。如果我通过了一个
1 | ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() |
是否有更紧凑的方法来检查是否通过了额外的参数?我想我可以安全地假设,如果它们通过,那么它们将是
首先,您可以假设它们是正确的类型(特别是如果您是唯一使用代码的人)。只需将其添加到文档中即可。参数类型检查python(接受的答案甚至在解释duck输入时叹息)
您得到的异常是常见的,并且已经结束了,就像valueerror:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()。
在你的情况下,
1 | if this is not None and that is not None |
会实现你想要的。问题不是"和",而是数组
1 2 | if np.array([True, False]): foo() |
从numpy的角度来看是不明确的,因为数组的某些值是真的,但不是所有值…那么它应该返回什么呢?。此行为与列表的行为明显不一致(我相信您当前的代码遵循这样的建议方式,检查列表是否为空)。
如果你想一个JavaESK重载你的函数,取决于有多少参数被传递,你就没有足够的思考。您当然可以将该条件之后的任何内容发送给另一个函数,以"简洁"地处理它。以下也可以
1 2 3 4 5 6 7 8 | def f(some_stuff, this=None, that=None): ...do something... perform_the_task(this,that) def perform_the_task(this,that): if this is None or that is None: return raise NotImplementedException |
正如你在侧边栏看到的,这个
问题的核心是numpy数组可以返回多个真值,而许多python操作只需要一个真值。
我来举例说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | In [140]: this=None In [141]: if this:print 'yes' In [142]: if this is None: print 'yes' yes In [143]: this=np.array([1,2,3]) In [144]: if this: print 'yes' ... ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() In [145]: if this is None: print 'yes' In [146]: this and this ... ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() In [147]: [1,2,3] is None Out[147]: False In [148]: this is None Out[148]: False In [149]: [1,2,3]==3 # one value Out[149]: False In [150]: this == 3 # multiple values Out[150]: array([False, False, True], dtype=bool) |
像
1 2 3 4 5 6 7 8 9 | In [151]: not [1,2,3] Out[151]: False In [152]: not None Out[152]: True In [153]: not this ... ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() |
在你的函数中,如果你不给
1 2 3 4 | def f(some_stuff, this=None, that=None): ...do something... if this is not None and that is not None: perform_the_task() |