2014-06-20 34 views
0
def function1(..): 
    def inside(..): 
     content 
    return ... 

def function2(..): 

在函数2内部,我需要使用函数'inside'。 “内部”函数可以在函数1的范围之外定义,并在需要的函数中使用。但是如果我想这样做,那怎么办呢?调用python中的函数内部函数

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

+0

为什么要这么做?由于函数“inside”的范围是function1,所以您将无法从函数2访问它。 – user2109788

+0

如果需要这样的功能,您应该考虑使用类。 – arbulgazar

回答

0

有什么理由说这样的东西不行吗?

def function1(): 
    inside() 

def function2(): 
    inside() 

def inside(): 
    pass 
0

好吧。它不能做到。通过定义function1中的功能inside,您将其范围限制为function1。如果你想在function2中使用它,为什么首先在function1里面定义inside

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() 
0

workarounds此但总的来说这应该是可以避免的。而你刚刚提供的原因之一。 “正确”的方式是使用类。

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

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

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

def function2(): 
    function1()() # Note the double parentheses as we're calling the return value 
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并明确地将commonFunction替换为它就会更清楚。您也可以考虑将函数传递给function2以明确它是否依赖于不在其自己控制范围内的另一个函数。例如:

commonFunction = function1('bar') 
function2('baz', commonFunction)