def function1(..):
def inside(..):
content
return ...
def function2(..):
在函数2内部,我需要使用函数'inside'。 “内部”函数可以在函数1的范围之外定义,并在需要的函数中使用。但是如果我想这样做,那怎么办呢?调用python中的函数内部函数
我是一个新手程序员。所以一个简单的解释将不胜感激。
def function1(..):
def inside(..):
content
return ...
def function2(..):
在函数2内部,我需要使用函数'inside'。 “内部”函数可以在函数1的范围之外定义,并在需要的函数中使用。但是如果我想这样做,那怎么办呢?调用python中的函数内部函数
我是一个新手程序员。所以一个简单的解释将不胜感激。
有什么理由说这样的东西不行吗?
def function1():
inside()
def function2():
inside()
def inside():
pass
好吧。它不能做到。通过定义function1
中的功能inside
,您将其范围限制为function1
。如果你想在function2
中使用它,为什么首先在function1
里面定义inside
?
一种解决方法是使用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()
有workarounds此但总的来说这应该是可以避免的。而你刚刚提供的原因之一。 “正确”的方式是使用类。
class My_class():
def function1(self):
self.inside()
def inside(self):
print "Hi!"
def function2():
My_class.inside()
这不是你想要做的事情。然而一个解决方案是让function1返回它的内部函数。
def function1():
def inside():
print 'hei'
return inside
def function2():
function1()() # Note the double parentheses as we're calling the return value
一个原因,我可以看到这个被需要是,如果你想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)
为什么要这么做?由于函数“inside”的范围是function1,所以您将无法从函数2访问它。 – user2109788
如果需要这样的功能,您应该考虑使用类。 – arbulgazar