在分配给 OpenERP 7 中的变量之前从另一个函数中减去对函数的一个调用时出现类型错误

Type error when subtracting one call to a function from another before assigning to a variable in OpenERP 7

我在 OpenERP 7 中工作(托管在 Windows 8 服务器上)。我正在尝试进行我认为简单的更改,以调整 _product_qty_available 变量,以便它调用 _get_product_available_func 方法两次,以减少传出。我修改后的代码是:

def _get_product_available_func(states, what):
    def _product_available(self, cr, uid, ids, name, arg, context=None):
        return {}.fromkeys(ids, 0.0)
    return _product_available

_product_qty_available = _get_product_available_func(('done',), ('in', 'out')) - _get_product_available_func(('confirmed','waiting','assigned'), ('out',))
_product_virtual_available = _get_product_available_func(('confirmed','waiting','assigned','done'), ('in', 'out'))
_product_outgoing_qty = _get_product_available_func(('confirmed','waiting','assigned'), ('out',))
_product_incoming_qty = _get_product_available_func(('confirmed','waiting','assigned'), ('in',))
_product_real_qty = _get_product_available_func(('done',), ('in', 'out'))

当我进行此更改并出现以下错误时,我的 OpenERP 服务器无法启动:

"TypeError: unsupported operand type(s) for -: 'function' and 'function'

我确信这是一个 python 问题,而不是 openerp 问题,但我无法确定解决方案。

问题在于:

_get_product_available_func(('done',), ('in', 'out'))

显然 return 是一个函数。所以你需要调用它来得到结果:

_get_product_available_func(('done',), ('in', 'out'))()

注意末尾的额外括号。如果您需要将参数传递给函数,请将它们放在那里(如果您需要参数但不提供任何参数,Python 将引发异常)。

如果你需要return一个函数:

_product_qty_available = lambda a1,a2:
    _get_product_available_func(('done',), ('in', 'out'))(a1,a2) -
    _get_product_available_func(('confirmed','waiting','assigned'), ('out',))(a1,a2)

这只是一个例子,如果每个函数都有两个参数。这个想法是使用 lambda 制作一个匿名函数,它可以用两个参数 (a1,a2) 调用,然后调用你的其他函数。