python - inspect对于FunctionType生成的函数不起作用

时间:2015-01-29 14:41:01

标签: python python-2.7 code-generation inspect

这是我的代码,我想要的是能够动态生成一些函数并将其打印到文件中。

import types
import inspect

def create_function(name, args):

    def y(a,b,c): 
        print "working!"

    new_varnames = ("d","e","f")

    y_code = types.CodeType(args, \
    y.func_code.co_nlocals, \
    y.func_code.co_stacksize, \
    y.func_code.co_flags, \
    y.func_code.co_code, \
    y.func_code.co_consts, \
    y.func_code.co_names, \
    new_varnames, \
    y.func_code.co_filename, \
    name, \
    y.func_code.co_firstlineno, \
    y.func_code.co_lnotab)


    return types.FunctionType(y_code, y.func_globals, name)

这是输出

>>> myfunc = create_function('myfunc', 3)
>>> myfunc(d=1,e=2,f=3)
working!
>>> print inspect.getsource(myfunc)
    def y(a,b,c): 
        print "working!"

我有点失望,我想反而:

def myfunc(d,e,f):
    print "working!"

怎么可能?

1 个答案:

答案 0 :(得分:1)

Python函数对象不包含其源代码。它们只包含字节代码,加上文件名和起始行号(如果它们是从文件加载的。)

您在创建CodeType()对象时复制了该元数据:

y.func_code.co_filename,
# ...
y.func_code.co_firstlineno,
然后,Python使用该信息从原始文件加载源;用于追溯和inspect.getsource()。由于您复制了原始y功能元数据,inspect.getsource()找到了原始源文件,并为您提供了y的源定义。

您必须生成 new 文件,将其写入磁盘,并调整代码对象的co_filenameco_firstlineno属性,如果您想要生成不同的输出。在实践中,没有人为此烦恼。