啊,但是异常信息应该给出提示:
from numba import jit
import numpy as np
@jit(['float64(float64, float64)', 'float64(float64, optional(float64))'])
def fun(a, b=3.):
return a + b
>>> fun(10.)
TypeError: No matching definition for argument type(s) float64, omitted(default=3.0)
这意味着optional 在这里是错误的选择。事实上optional represents None or "that type"。但是您需要一个可选参数,而不是可能是 float 和 None 的参数,例如:
>>> fun(10, None) # doesn't fail because of the signature!
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
我怀疑它只是“碰巧”为 optional(float) 工作,因为从 numbas 的角度来看,float 只是一个“任意 Python 对象”,所以使用 optional(float) 你可以传递 任何东西 在那里(这显然包括不给出论点)。对于optional(float64),它只能是None 或float64。该类别不够广泛,无法不提供论据。
如果你给出类型Omitted,它就可以工作:
from numba import jit
import numpy as np
@jit(['float64(float64, float64)', 'float64(float64, Omitted(float64))'])
def fun(a, b=3.):
return a + b
>>> fun(10.)
13.0
但是,Omitted 似乎实际上并未包含在文档中,并且它有一些“粗糙的边缘”。例如,它不能在 nopython 模式下使用该签名进行编译,即使它似乎没有签名也是可能的:
@njit(['float64(float64, float64)', 'float64(float64, Omitted(float64))'])
def fun(a, b=3):
return a + b
TypingError: Failed at nopython (nopython frontend)
Invalid usage of + with parameters (float64, class(float64))
-----------
@njit(['float64(float64, float64)', 'float64(float64, Omitted(3.))'])
def fun(a, b=3):
return a + b
>>> fun(10.)
TypeError: No matching definition for argument type(s) float64, omitted(default=3)
-----------
@njit
def fun(a, b=3):
return a + b
>>> fun(10.)
13.0