在一个包含更多函数的函数的简单情况下,这是正确的做法吗,我看到一些脚本是以这种方式编写的,但是PEP 8允许吗?会引起问题吗?
var a = 5
答案 0 :(得分:1)
这取决于当前的情况。有时,您需要定义一个仅在另一个函数的上下文中才有意义的函数,并且/或者您希望根据外部函数的输入动态地构建该函数。
最常见的用例是定义装饰器,这些装饰器将另一个函数作为参数并通常返回一个新函数。
示例:
import datetime
def with_logging(func):
def func_with_logging(*args, **kwargs):
print('invoking {} at {}'.format(func.__name__, datetime.datetime.now()))
return func(*args, **kwargs)
return func_with_logging
@with_logging # <- @ syntax is short for my_add = with_logging(my_add)
def my_add(a, b):
return a + b
演示:
>>> my_add(3, 4)
invoking my_add at 2019-01-03 16:27:40.958468
7
答案 1 :(得分:1)
请记住,每次my_functon
被调用时都会定义此类嵌套函数,第一次定义my_function
时不会定义一次。这样会增加很多开销,可以通过将其移出my_function
来避免。
由于函数将在arg
上关闭,因此如果您选择保留它们,则无需将arg
作为显式参数传递:
def my_function(arg):
def nested():
#my helper code here
def nested2(arg2):
#more code
return nested(), nested2(0)
答案 2 :(得分:1)
仅当嵌套函数需要嵌套时才有意义(请参见装饰器)。另外,从技术上讲,这是合法的,但次优的(嵌套函数是在每个封闭的调用上创建的),通常被认为是不好的做法(参见python zen#4:“扁平比嵌套更好”。)