def function1(..):
def inside(..):
content
return ...
def function2(..):
在function2中我需要使用' inside'。功能'内部'可以在function1的范围之外定义,并在所需的函数中使用。但如果我想这样做,怎么办呢?
我是新手程序员。所以一个简单的解释将不胜感激。
答案 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