我偶尔在python中使用(lambda x:<code>)(<some input>)
来保存我的命名空间(在全局命名空间或其他地方)清洁度。 lambda解决方案的一个问题是,就其可能包含的内容而言,它是一个非常有限的结构。
注意:这是javascript编程习惯
这是保留命名空间的推荐方法吗?如果是这样,有没有更好的方法来实现自动执行功能?
答案 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