在python中调用函数内部的函数

时间:2014-06-20 06:18:48

标签: python

def function1(..):
    def inside(..):
        content
    return ...

def function2(..):

在function2中我需要使用' inside'。功能'内部'可以在function1的范围之外定义,并在所需的函数中使用。但如果我想这样做,怎么办呢?

我是新手程序员。所以一个简单的解释将不胜感激。

6 个答案:

答案 0 :(得分:2)

我可以看到这种情况的一个原因是,如果您希望function1能够配置 inside,那么function2的输出会根据具体情况而变化你之前如何打电话给function1。您可以通过将函数存储在外部作用域中并在function1中更新它来完成此操作:

>>> commonFunction = None
>>> def function1 (someParam):
        def inside (x):
            return '{} {}'.format(someParam, x)
        global commonFunction
        commonFunction = inside

>>> def function2 (y):
        print('Foo', commonFunction(y))

>>> function1('bar')
>>> function2('baz')
Foo bar baz
>>> function1('Hello')
>>> function2('World')
Foo Hello World

但是,由于这涉及使用global,我会建议反对它。只需在inside中返回function1并明确地将commonFunction替换为function2即可。您可能还想考虑将函数传递给commonFunction = function1('bar') function2('baz', commonFunction) ,以明确它依赖于不在其自身控制范围内的另一个函数。例如:

{{1}}

答案 1 :(得分:0)

有什么理由让这样的事情不起作用吗?

def function1():
    inside()

def function2():
    inside()

def inside():
    pass

答案 2 :(得分:0)

好。它无法完成。通过在inside中定义函数function1,可以将其范围限制为function1。如果您想在function2中使用它,为什么首先在inside内定义function1

答案 3 :(得分:0)

解决方法是使用func_code和模块types

import types

co = function1.func_code
modified_consts = list(co.co_consts)
# [None, <code object inside at 0000000001D47EB0, file "E:\Proyectos\Eclipse\Python\Test\__init__.py", line 2>, 'from function1']

# Search an element which is from type 'CodeType'
inside = None
for e in modified_consts:
    if isinstance(e, types.CodeType):
        inside = types.FunctionType(e, function1.func_globals)
        break

inside()

答案 4 :(得分:0)

这有workarounds,但一般来说应该避免这种情况。以上是您刚刚提供的原因之一。 “正确”的方式是使用类。

class My_class():
    def function1(self):
        self.inside()
    def inside(self):
        print "Hi!"
def function2():
    My_class.inside()

答案 5 :(得分:0)

这不是你想要做的事情。然而,一种解决方案是让function1返回其内部函数。

def function1():
    def inside():
        print 'hei'
    return inside

def function2():
    function1()() # Note the double parentheses as we're calling the return value