11

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

注意:这是javascript编程的习惯

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

4

3 回答 3

7

对于只在特定函数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 方式,但我通常会这样做。

于 2012-08-21T06:43:13.917 回答
5

关于问题的后半部分

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

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

有了装饰器,就像

evalfn = lambda f: f()

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

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

Using decorator for self-excuting functions is a bit of overkill, compared to the let-call-del method shown below. However, it may worth a try if there are many self-execution functions, a self-executing function is getting too long, or you simply don't bother naming these self-executing functions.

def f():
    print('I execute immediately')
f()
del f
于 2020-04-11T07:27:06.187 回答
2

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

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

于 2012-08-21T06:42:22.000 回答