1

我正在尝试编写一个可以定义函数的函数。

我试过这个:

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"
             pass
    pass

function_writer()
new_function()

但是,我的调试器抱怨 new_function 没有定义,所以这显然不是这样做的方法。

有谁知道如何做到这一点?

谢谢。

4

5 回答 5

5

您的代码失败的原因与以下代码抱怨未定义的原因完全相同:i

def integer_writer():
    i = 0

integer_writer()
i

i是函数中的局部变量,是函数integer_writernew_function的局部变量function_writer

您可以执行以下操作:

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"

    return new_function

new_function = function_writer()
new_function()

在这种情况下,似乎没有什么意义(就像定义一个总是返回的函数通常没有多大意义一样0),但是如果function_writer要接受一些参数,并且如果在函数中使用了这些参数,它会返回,那么你就做生意了。

于 2013-11-06T23:38:24.710 回答
3
def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"

    return new_function

fn_dynamic = function_writer()
fn_dynamic() #call new_function

也许你在找什么?(这几乎是装饰器所做的......除了他们修改传入的方法)

另一种解决方案(这不是一个好建议,但可以回答问题)

def function_writer():
    print "I am a function writer"      
    def new_function():
        print "I am a new function"
    globals()['new_function'] = new_function

function_writer()
new_function()

这种类型的功能通常在 python 中被避免,除非你有一个非常有说服力的理由为什么这绝对是你需要的......

于 2013-11-06T23:39:05.907 回答
1

如果要创建函数工厂,只需返回创建的函数即可!

def factory():
    def new_func():
        print 'Hello!'
  return new_func

f = factory()
f()
于 2013-11-06T23:39:45.093 回答
1

当然它会导致错误,因为new_function仅限于function_writer范围。

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"
        pass

    return new_function

a = function_writer()
#output: "I am a function writer"

a()
#output: "I am a new function"
于 2013-11-06T23:37:08.960 回答
1

这取决于你打算用它做什么。

  1. 您可以在函数内部调用它。

    如果内部函数需要访问外部函数的局部变量,可能就是这种情况。

  2. 您可以将其退回以便从外部调用。

    这是很常见的,例如在装饰器的情况下。

于 2013-11-06T23:37:53.587 回答