在Python中打印捕获的对象列表

时间:2017-03-08 00:28:49

标签: python

如何获取注入方法的依赖项列表,但看不见?

指向一些阅读也会很棒:)

示例:

external_object = "abc"
def func(data, params) 
    print(external_object)
    ...

def get_list_of_dependencies(func):
   # TODO

依赖项的获取列表将打印出外部对象。我试图这样做的原因是因为我试图记住函数func,但由于这些外部依赖注入到函数中,我创建的哈希并不完全有用。

谢谢!

2 个答案:

答案 0 :(得分:2)

我相信您可以通过检查附加到__code__对象的function对象来实现您的目标。例如:

在名为funcs.py的文件中:

external_object = "external object"
def f():
    print(external_object)
    nested = "nested"
    def g():
        print(nested)
    return g

现在,在翻译会话中:

键入" help"," copyright"," credit"或"许可证"了解更多信息。

>>> import funcs
>>> funcs.f.__code__.co_names
('print', 'external_object')
>>>

或者如果你想要局部变量:

>>> funcs.f.__code__.co_cellvars
('nested',)

您还可以访问其他内容,例如自由变量。请注意,nestedg

的闭包中的自由变量
>>> g = funcs.f()
external object
>>> g.__code__.co_names
('print',)
>>> g.__code__.co_freevars
('nested',)
>>>

详细了解可用属性here。我注意到,依靠这一点并不是一个好主意,因为正如文档中所警告的那样,

  

他们的定义可能会随着解释器的未来版本而改变,   但是为了完整起见,这里提到了它们。

答案 1 :(得分:0)

函数的代码对象(在__code__属性中找到)包含几个属性,这些属性给出代码对象本身使用的值和名称,例如: co_constsco_names