在Python反思一个给定函数的嵌套(本地)功能(Introspecting a given fun

2019-06-28 02:26发布

鉴于功能

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 ...>

但我无法弄清楚如何获得实际的可调用的函数对象。 是否可能?

谢谢你的帮助,

将。

Answer 1:

您是八九不离十这样做的-只是缺少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 :].

但是,为什么赫克麻烦? 是不是更容易使用类? 实例化看起来像一个函数调用呢。



Answer 2:

您可以返回功能,就像在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”名单。



Answer 3:

你可以使用exec来运行代码的对象。 例如,如果您为F如上定义,然后

exec(f.func_code.co_consts[3])

会给

get

作为输出。



Answer 4:

内功能对象不函数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。 (通常不是一个好主意)



文章来源: Introspecting a given function's nested (local) functions in Python