定义嵌套函数是pythonic吗?

时间:2019-01-03 15:17:44

标签: python python-3.x function pep8

在一个包含更多函数的函数的简单情况下,这是正确的做法吗,我看到一些脚本是以这种方式编写的,但是PEP 8允许吗?会引起问题吗?

var a = 5

3 个答案:

答案 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:“扁平比嵌套更好”。)