【问题标题】:Using nested def for organizing code使用嵌套 def 组织代码
【发布时间】:2015-07-05 22:23:59
【问题描述】:

我一直嵌套def 语句作为对代码进行分组/组织的一种方式,但是在阅读了一些内容之后,我认为我在滥用它..

这样做是否符合犹太教规?

def generate_random_info():
    def random_name():
        return numpy.random.choice(['foo', 'bar'])

    def random_value():
        return numpy.random.rand()

    return {'name':random_name(), 'value':random_value()}

【问题讨论】:

  • 你为什么要这么做?将这些函数放在另一个函数中,而不是使它们成为全局函数或使它们成为类的方法,您可以获得什么?
  • 我同意 BrenBarn,我看不出这种格式有什么用
  • 这只是一种组织技术(就性能而言没有任何收获)。这些定义没有独立的含义,因此它们只能通过父 def 调用。这样做似乎更干净。

标签: python coding-style


【解决方案1】:

它本身没有任何问题。但是,当您使用这样的结构时,您应该考虑一件事:random_namerandom_value 是在您调用 generate_random_info() 时不断重新定义的函数。现在,对于那些特定的函数来说,这可能不是问题,尤其是当您不会经常调用它时,但您应该考虑到这是可以避免的开销。

因此,您可能应该将这些函数定义移到 generate_random_info 函数之外。或者,由于这些内部函数本身并没有太多作用,而您只需直接调用它们,就内联它们:

def generate_random_info():
    return {
        'name': numpy.random.choice(['foo', 'bar']),
        'value': numpy.random.rand()
    }

【讨论】:

  • 我同意这个例子可以很容易地简化为你所展示的,在实践中,定义中可能有更多的代码。关于重新定义的函数的出色说明。
【解决方案2】:

除非您打算在单个函数中重复使用相同的代码块并且仅在该函数中重复使用,否则我会避免仅仅为了这样做而创建这些函数。我不是代码如何在计算级别上工作的专家,但我认为创建一个函数比像现在这样简单地使用该行更密集,特别是如果你只打算使用该函数一次。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 2018-10-12
    • 2018-08-24
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2011-06-04
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多