我偶尔(lambda x:<code>)(<some input>)
在 python 中使用,以保持我的命名空间(在全局命名空间或其他地方)的清洁度。lambda 解决方案的一个问题是,就其可能包含的内容而言,它是一种非常有限的构造。
注意:这是javascript编程的习惯
这是保留命名空间的推荐方法吗?如果是这样,是否有更好的方法来实现自执行功能?
我偶尔(lambda x:<code>)(<some input>)
在 python 中使用,以保持我的命名空间(在全局命名空间或其他地方)的清洁度。lambda 解决方案的一个问题是,就其可能包含的内容而言,它是一种非常有限的构造。
注意:这是javascript编程的习惯
这是保留命名空间的推荐方法吗?如果是这样,是否有更好的方法来实现自执行功能?
对于只在特定函数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 方式,但我通常会这样做。
关于问题的后半部分
有没有更好的方法来实现自执行功能?
标准方式(<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
你不这样做。它在 JavaScript 中很好,但在 Python 中,您既没有轻量级语法,也不需要它。如果您需要函数范围,请定义一个函数并调用它。但很多时候你不需要一个。您可能需要将代码拆分为多个函数以使其更易于理解,但无论如何,它的名称都会有所帮助,并且它可能在多个地方有用。
此外,不必担心向命名空间添加更多名称。Python 与 JavaScript 不同,具有适当的命名空间,因此您在模块范围内定义的助手默认情况下在其他文件中不可见(即,除非导入)。