【发布时间】:2015-06-27 16:39:12
【问题描述】:
在我的 python 程序中,我有很多函数实际上是更复杂函数的包装器(更复杂的函数需要更多参数,因此简单函数会计算额外的参数并将它们与原始参数一起传递给复杂函数职能)。我不希望从外部范围看到更复杂的功能。但是,我的理解是,如果每次调用外部函数时都在函数内部定义一个函数,那么它会重新定义内部函数,这是一种浪费。如何隐藏我的内在功能而不一遍又一遍地重新定义它们?解释器必须有某种方法来解析我的文件并只执行一次定义,但仍将它们保留在内部范围内。
【问题讨论】:
-
为什么不使用
__all__和/或命名约定(按约定私有的前导下划线)来控制包中import可用的名称,而不是嵌套职能?然后你只定义一次,它们不是直接可用的并且你的结构变得更简单。 -
把函数移出即可。如果必须,将其移至另一个模块。您没有必须将您的函数放在嵌套范围内。请注意,“性能影响”并不比任何其他对象创建更重要;您不会抱怨在函数中创建字符串或列表,但成本大致相同。
-
@jonrsharpe 需要明确的是,如果我有
def a(): \n \t def b(): \n \t print foo,它不会在我每次调用a时重新定义b? -
所有 Python 所做的只是 a) 加载已编译的代码对象,b) 创建一个带有正确元数据和附加闭包的函数对象。这几乎不贵。
-
@RenéG:不,给定函数的代码不会改变。您没有生成该代码,它被编译一次。如果您使用
if..else进行分支,那么要么有多个代码对象可供选择,要么if...else分支是编译代码的一部分。