1

下面的代码可以在 OpenERP 6.1 的产品模块中的 product.py 中找到

    _columns = {
        'qty_available': fields.function(_product_qty_available, type='float', string='Quantity On Hand'),
        'virtual_available': fields.function(_product_virtual_available, type='float', string='Quantity Available'),
...


    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'))
   _product_virtual_available = _get_product_available_func(('confirmed','waiting','assigned','done'), ('in', 'out'))

有人可以向我解释在一般情况下以及在这种特定情况下在 python 中的方法内部定义方法的目的吗?

4

5 回答 5

3

我个人使用嵌套函数,如果它们是一种仅在外部方法内部本地使用的辅助函数。当然,您可以将方法移动到模块级别并使它们更加“可见”。对我来说,它们提供了在某些情况下更好地封装代码的机会,其中嵌套函数对模块级别指定的代码不感兴趣。

于 2013-10-09T04:21:57.293 回答
1

使用内部方法的一个潜在好处是它允许您使用外部方法局部变量而不将它们作为参数传递。

def helper(feature, resultBuffer):
  resultBuffer.print(feature)
  resultBuffer.printLine()
  resultBuffer.flush()

def save(item, resultBuffer):

  helper(item.description, resultBuffer)
  helper(item.size, resultBuffer)
  helper(item.type, resultBuffer)

可以写成如下,可以说读起来更好

def save(item, resultBuffer):

  def helper(feature):
    resultBuffer.print(feature)
    resultBuffer.printLine()
    resultBuffer.flush()

  helper(item.description)
  helper(item.size)
  helper(item.type)

当返回内部函数(将其移动到外部范围)或将其传递给另一个函数时,它通常很有用。

嵌套函数可以访问定义它的环境。

具体到 product.py 代码,它是关于开发人员选择管理代码以保持简短易读的功能并定义更多可用作 API 的功能。

谢谢你

于 2013-10-09T04:38:26.860 回答
0

我希望嵌套功能的使用及其用途已在其他答案中得到解释。所以我不去。在 openerp 中,如果您只检查产品模块中的 product.py 文件,那么嵌套功能的用途会有点令人困惑。它实际上用于库存模块。如果你浏览一下库存中的 product.py 文件,你就能找到它的用途。

于 2013-10-10T15:48:54.987 回答
0

在给定的示例中,我无法告诉您。通常,您在函数中声明一个函数有两个原因:使用原始函数参数作为上下文返回一个新函数,或者快速封装仅在原始函数中重复的功能。

示例 1:

def partial_add(value):
    def value_plus(y):
        return value + y
    return value_plus

f = partial_add(5)
f(6)
> 11
f(f(5))
> 15

示例 2:

def print_weird(p1, p2, p3, item, constant, k):
    def related(v, u):
        return v.score(u, item) < constant*(k+1)/k
    if related(p1, p2) and related(p2, p3) and related(p3, p1):
        print "weird"
于 2013-10-09T04:38:09.637 回答
-2

用这个例子来解决你的问题 happyBirthdayEmily

def happyBirthdayEmily(): #program does nothing as written
    print("Happy Birthday to you!")
    print("Happy Birthday to you!")
    print("Happy Birthday, dear Emily.")
    print("Happy Birthday to you!")

生日3.py

'''Function definition and invocation.'''

def happyBirthdayEmily():
    print("Happy Birthday to you!")
    print("Happy Birthday to you!")
    print("Happy Birthday, dear Emily.")
    print("Happy Birthday to you!")

happyBirthdayEmily()
happyBirthdayEmily()

在birthday4.py 中我们添加了一个happyBirthdayAndre 函数,并同时调用它们

'''Function definitions and invocation.'''

def happyBirthdayEmily():
    print("Happy Birthday to you!")
    print("Happy Birthday to you!")
    print("Happy Birthday, dear Emily.")
    print("Happy Birthday to you!")

def happyBirthdayAndre():
    print("Happy Birthday to you!")
    print("Happy Birthday to you!")
    print("Happy Birthday, dear Andre.")
    print("Happy Birthday to you!")

happyBirthdayEmily()
happyBirthdayAndre()

如果我们希望程序在运行时自动执行任何操作,我们需要定义之外的一行!最后一行是唯一直接执行的,它调用了main中的代码,而main又调用了其他两个函数中的代码。

于 2013-10-09T04:24:48.607 回答