python中的自执行函数

Sna*_*fee 8 python python-2.7

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

注意:这是javascript编程的习惯

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

Hua*_*Gao 11

关于问题的后半部分

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

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

有了装饰器,就会像

evalfn = lambda f: f()

@evalfn
def _():
    print('I execute immediately')
Run Code Online (Sandbox Code Playgroud)

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

与下面所示的 let-call-del 方法相比,使用装饰器来实现自执行函数有点矫枉过正。但是,如果有很多自执行函数、自执行函数变得太长,或者您根本不费心命名这些自执行函数,则可能值得一试。

def f():
    print('I execute immediately')
f()
del f
Run Code Online (Sandbox Code Playgroud)


Joh*_*ang 6

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

代替 :

def a_fn():
    //do something
def b_fn():
    //do something
def c_fn():
    b_fn()
    a_fn()
Run Code Online (Sandbox Code Playgroud)

您可以:

def c_fn():
    def a_fn():
        //do something
    def b_fn():
        //do something
    b_fn()
    a_fn()
Run Code Online (Sandbox Code Playgroud)

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