扩展函数的返回字典

时间:2014-09-01 16:14:00

标签: python function dictionary

我有这个功能,我想扩展。该函数返回一个字典。

def _prepare_order_line_procurement(self, cr, uid, order, line):
    return {
        'name': line.name,
        'origin': order.name,
        'date_planned': date_planned,
    }

如何将键值对'incoterm': order.incoterm添加到返回词典中。该功能将成为此

def _prepare_order_line_procurement(self, cr, uid, order, line):
    return {
        'name': line.name,
        'origin': order.name,
        'date_planned': date_planned,
        'incoterm': order.incoterm,
    }

对于词典,你有函数update(),但我不知道如何应用它来扩展函数。 incoterm在这里是一个示例,对于其他功能,它可以是需要添加的其他键值对。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

目前还不清楚你要完成什么 - 但也许是这样的,它使用了所谓的function or method decorator,在这种情况下会修改函数返回的字典。

def add_incoterm(f):
    def decorated(self, cr, uid, order, line):
        result = f(self, cr, uid, order, line)  # call original function
        result.update(incoterm=order.incoterm)  # add key value pair to result
        return result  # return updated result
    return decorated

@add_incoterm
def _prepare_order_line_procurement(self, cr, uid, order, line):
    return {
        'name': line.name,
        'origin': order.name,
        'date_planned': date_planned,
    }

但是,如果您拥有该方法的源代码,那么修改其中的代码(包括附加数据)将更有意义(并且更有效)。

答案 1 :(得分:0)

我们假设你在这里要求简单的解决方案。装饰器的制作是为了不触及你的功能并扩展它的行为,但它可能很复杂。

def _prepare_order_line_procurement(self, cr, uid, order, line, **kwargs):
    reply = {
        'name': line.name,
        'origin': order.name,
        # Where did you get this thing? Maybe it should be provided in kwargs?
        'date_planned': date_planned, 
    }
    reply.update(**kwargs)
    return reply

在这种情况下看看你应该如何使用它,对数据进行采样以使函数可以运行。

# Some tests
_prepare_order_line_procurement(None, cr, uid, order, line) == \
      {'origin': 3, 'name': 4, 'date_planned': None}
_prepare_order_line_procurement(None, cr, uid, order, line, something='anything') == \
      {'origin': 3, 'something': 'anything', 'name': 4, 'date_planned': None}
_prepare_order_line_procurement(None, cr, uid, order, line, **{'something': 'anything', 'blah': 'blah'}) == \
    {'origin': 3, 'blah': 'blah', 'something': 'anything', 'name': 4, 'date_planned': None}