鉴于功能
def f():
x, y = 1, 2
def get():
print 'get'
def post():
print 'post'
是有我的方式来访问其本地的get()和post()函数的方式,我可以给他们打电话? 我在寻找,将工作像这样用函数f()所定义的函数:
>>> get, post = get_local_functions(f)
>>> get()
'get'
我可以访问代码对象为那些当地的功能,像这样
import inspect
for c in f.func_code.co_consts:
if inspect.iscode(c):
print c.co_name, c
这导致
get <code object get at 0x26e78 ...>
post <code object post at 0x269f8 ...>
但我无法弄清楚如何获得实际的可调用的函数对象。 是否可能?
谢谢你的帮助,
将。
您是八九不离十这样做的-只是缺少new
模块:
import inspect
import new
def f():
x, y = 1, 2
def get():
print 'get'
def post():
print 'post'
for c in f.func_code.co_consts:
if inspect.iscode(c):
f = new.function(c, globals())
print f # Here you have your function :].
但是,为什么赫克麻烦? 是不是更容易使用类? 实例化看起来像一个函数调用呢。
您可以返回功能,就像在Python中任何其他对象:
def f():
x, y = 1, 2
def get():
print 'get'
def post():
print 'post'
return (get, post)
get, post = f()
希望这可以帮助!
但是请注意,如果你想用你的“X”和“Y”变量的get()或交的(),你应该让他们的列表。
如果你做这样的事情:
def f():
x = [1]
def get():
print 'get', x[0]
x[0] -= 1
def post():
print 'post', x[0]
x[0] += 1
return (get, post)
get1, post1 = f()
get2, post2 = f()
GET1和POST1会引用非get2和POST2不同的“X”名单。
你可以使用exec来运行代码的对象。 例如,如果您为F如上定义,然后
exec(f.func_code.co_consts[3])
会给
get
作为输出。
内功能对象不函数f之前存在()被执行。 如果你想要得到他们,你就必须自己构建它们。 这绝对是不平凡的,因为他们可能是从功能的范围捕捉变量,无论如何都将需要在可能应该算是解释的实施细则对象闲逛关闭。
如果你想用更少的重复收集的功能,我建议以下方法之一:
一)只要把函数的类定义并返回到类的引用。 由名称访问的相关功能集合气味非常喜欢的一类。
b)中创建具有用于登记的功能和使用,作为一个装饰的方法的字典子类。
该代码,这将是这个样子:
class FunctionCollector(dict):
def register(self, func):
self[func.__name__] = func
def f():
funcs = FunctionCollector()
@funcs.register
def get():
return 'get'
@funcs.register
def put():
return 'put'
return funcs
C)闲逛在当地人()和滤除功能与inspect.isfunction。 (通常不是一个好主意)