我有一个方法,我已经打破了较小的嵌套函数来打破代码库:
def foo(x,y):
def do_this(x,y):
pass
def do_that(x,y):
pass
do_this(x,y)
do_that(x,y)
return
Run Code Online (Sandbox Code Playgroud)
有没有办法单独运行其中一个嵌套函数.例如:
foo.do_this(x,y)
Run Code Online (Sandbox Code Playgroud)
编辑:
我试图在我使用pyramid_breaker构建的Web服务器上设置缓存
def getThis(request):
def invalidate_data(getData,'long_term',search_term):
region_invalidate(getData,'long_term',search_term)
@cached_region('long_term')
def getData(search_term):
return response
search_term = request.matchdict['searchterm']
return getData(search_term)
Run Code Online (Sandbox Code Playgroud)
这是我的理解可能不准确:
现在我有这个的原因是装饰器用来创建缓存键的命名空间是从函数和争论中产生的.因此,您不能将装饰器放在getThis上,因为请求变量是唯一的,并且缓存是无用的.所以我创建了具有可重复args(search_term)的内部函数.
但是,要使缓存无效(即刷新),失效函数需要知道"getData"函数的范围,因此也需要嵌套.因此我需要调用嵌套函数.你们精彩的人已经说清楚它不可能,所以有人能够解释我如何用不同的结构做到这一点吗?
Lau*_*low 25
我假设do_this并且do_that实际上依赖于某些参数foo,因为否则你可以将它们移出foo并直接调用它们.
我建议把整个事情重新整理成一个班级.像这样的东西:
class Foo(object):
def __init__(self, x, y):
self.x = x
self.y = y
def do_this(self):
pass
def do_that(self):
pass
def __call__(self):
self.do_this()
self.do_that()
foo = Foo(x, y)
foo()
foo.do_this()
Run Code Online (Sandbox Code Playgroud)
Jen*_*man 13
这些以前的答案告诉你,你不能这样做,当然是错的.这是python,你几乎可以使用魔法代码魔法做任何事情.
我们可以从foo的函数代码中取出第一个常量,这将是do_this函数.然后我们可以使用此代码来创建一个新函数.
有关new和https://docs.python.org/2/library/inspect.html的更多信息,请参阅https://docs.python.org/2/library/new.html,了解有关如何进入内部的更多信息码.
警告:这不是因为你可以这样做,你应该这样做,重新思考你的功能结构的方式是要走的路,但如果你想要一个快速和肮脏的黑客,将来可能会破坏,你去:
import new
myfoo = new.function(foo.func_code.co_consts[1],{})
myfoo(x,y) # hooray we have a new function that does what I want
Run Code Online (Sandbox Code Playgroud)
更新:在python3中,您可以使用types模块foo.__code__:
import types
myfoo = types.FunctionType(foo.__code__.co_consts[1], {})
myfoo() # behaves like it is do_this()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: do_this() missing 2 required positional arguments: 'x' and 'y'
Run Code Online (Sandbox Code Playgroud)