python中的自执行函数

时间:2012-08-21 06:22:40

标签: python python-2.7

我偶尔在python中使用(lambda x:<code>)(<some input>)来保存我的命名空间(在全局命名空间或其他地方)清洁度。 lambda解决方案的一个问题是,就其可能包含的内容而言,它是一个非常有限的结构。

注意:这是javascript编程习惯

这是保留命名空间的推荐方法吗?如果是这样,有没有更好的方法来实现自动执行功能?

3 个答案:

答案 0 :(得分:6)

对于仅在特定函数B中调用的函数A,可以在B中定义A,我认为命名空间不会被污染。如,

而不是:

def a_fn():
    //do something
def b_fn():
    //do something
def c_fn():
    b_fn()
    a_fn()

你可以:

def c_fn():
    def a_fn():
        //do something
    def b_fn():
        //do something
    b_fn()
    a_fn()

虽然我不确定它是否是pythonic方式,但我通常都喜欢这样。

答案 1 :(得分:2)

你没有这样做。它在JavaScript中很好,但在Python中,你既没有轻量级语法,也没有它的需要。如果需要函数作用域,请定义一个函数并调用它。但通常你不需要一个。您可能需要将代码分成多个函数以使其更易理解,但无论如何它的名称都有帮助,并且它可能在多个地方有用。

另外,不要担心在名称空间中添加更多名称。与JavaScript不同,Python具有适当的命名空间,因此默认情况下,您在模块范围定义的帮助程序在其他文件中不可见(即除非导入)。

答案 2 :(得分:2)

关于问题的后半部分

有没有更好的方法来实现自执行功能?

在Python中无法使用标准方法(<function-expression>)(),因为在不破坏Python基本语法的情况下,无法将多行块放入括号中。尽管如此,Python确实意识到需要使用函数定义作为表达式,并提供了decorators (PEP318)作为替代。如果有人想阅读更多,PEP318对此问题进行了广泛的讨论。

使用装饰器,就像

evalfn = lambda f: f()

@evalfn
def _():
    print('I execute immediately')

尽管在语法上有很大的不同,但我们将看到它确实是相同的:函数定义是匿名的,并用作表达式。

与下面显示的let-call-del方法相比,将装饰器用于自执行功能有点过大。但是,如果有许多自执行功能,自执行功能变得太长,或者您根本不用理会这些自执行功能的名称,则可能值得一试。

def f():
    print('I execute immediately')
f()
del f