我有一个可以接受两个可选np.array
作为参数的函数。如果两个都被传递,该函数应该执行一些任务。
def f(some_stuff, this=None, that=None):
...do something...
if this and that:
perform_the_task()
如果没有传递任何可选参数,这将按预期工作。如果我传递np.array
,那么我会得到错误
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
是否有更紧凑的方法来检查额外的args是否通过?我想我可以放心地假设如果它们被传递,那么它们将是np.array
。
答案 0 :(得分:5)
首先,可以假设它们是正确的类型(特别是如果您是唯一使用该代码的人)。只需将其添加到文档中即可。 Type checking of arguments Python(接受的答案甚至在他们解释鸭子打字时叹了口气)
您获得的例外情况很常见且完全是SO,例如ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。
在你的情况下,
if this is not None and that is not None
将完成你想要的。问题不在于"和",而在于数组的事实
if np.array([True, False]):
foo()
从numpy的角度来看,是模棱两可的,因为数组值的某些是真的,但不是全部......所以应该返回什么? 。此行为与列表的行为明显不一致(我相信您当前的代码遵循SO推荐的检查列表是无或空的方式)
如果您正在考虑使用Java-esk的方式来重载您的函数,具体取决于传递了多少参数,那么您就不会考虑太多。您当然可以将有条件的任何内容发送到另一个函数,以简明扼要地"处理它。以下也没关系
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
答案 1 :(得分:3)
正如您在侧边栏中看到的那样ValueError
之前出现过很多次。
问题的核心是numpy数组可以返回多个真值,而许多Python操作只需要一个。
我将说明:
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)
not
等逻辑操作通常会返回一个简单的True / False,但对于数组,它们会为数组的每个元素返回一个值。
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()
在您的函数中,如果您不提供f
个或多个参数,this
和that
将具有值None
。使用is None
或is not None
:
def f(some_stuff, this=None, that=None):
...do something...
if this is not None and that is not None:
perform_the_task()