【问题标题】:Purpose of nested functions(function in function) in pythonpython中嵌套函数(函数中的函数)的目的
【发布时间】:2013-10-09 04:19:26
【问题描述】:

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 中定义方法的目的吗?

【问题讨论】:

  • 在这个具体的例子中,不清楚为什么一个函数中有一个函数。但一个常见的原因是工厂函数。看看这个问题中的例子,明白我的意思:stackoverflow.com/questions/901892/…

标签: python function methods openerp


【解决方案1】:

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

【讨论】:

  • 还有,闭包。您无法使用非本地函数获得闭包。
  • @user2799617 为什么要使用函数?您是否在主函数中多次调用嵌套函数?嵌套函数不会使 main 函数的可读性降低/麻烦吗?函数不应该执行一项任务吗?函数中是否存在可取的大小限制(行数)。您能在 PEP8 标准中举一些例子吗?
【解决方案2】:

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

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 的功能。

谢谢

【讨论】:

  • 你能花点时间详细解释一下product.py代码中的这些行吗..
【解决方案3】:

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

示例 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"

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      使用此示例解决您的问题 生日快乐艾米丽

      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!")
      

      birthday3.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又调用了其他两个函数中的代码。

      【讨论】:

      • 这不是问题所在。
      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 2018-12-13
      • 2012-12-16
      • 1970-01-01
      • 2019-12-04
      • 2018-05-10
      相关资源
      最近更新 更多