打印时有一个功能转换为其名称

时间:2016-03-16 17:08:56

标签: python python-2.7 data-conversion

我有一系列函数,但是当我打印数组时,我会得到一个非常难看的输出:

[<function f1 at 0x7f708c2bf1b8>, <function f2 at 0x7f708c2bf230>, <function f3 at 0x7f708c2bf2a8>]

是否有一种神奇的技巧让这些函数具有等效的字符串?这样的紧凑输出:

[<f1>, <f2>, <f3>]

或者:

['f1', 'f2', 'f3']

3 个答案:

答案 0 :(得分:4)

已经查看等效的字符串;该值由repr()生成(始终用于所有容器内容):

>>> def f1(): pass
...
>>> repr(f1)
'<function f1 at 0x10232d320>'

输出用于调试目的,不适用于最终用户演示;十六进制地址是该对象的id(),可帮助您区分其他类似命名的函数。如果要生成“用户友好”输出,请执行自己的格式设置。例如,您可以使用列表推导;每个函数对象都有一个__name__属性,您可以使用该属性:

['<{}>'.format(func.__name__) for func in list_of_functions]

这仍然是一个列表,因此每个值仍显示为调试值,但现在显示为字符串:

>>> list_of_functions = [f1, f2, f3]
>>> ['<{}>'.format(func.__name__) for func in list_of_functions]
['<f1>', '<f2>', '<f3>']

使用其他字符串技术根据需要进一步转换。添加逗号str.join()例如:

>>> ', '.join(['<{}>'.format(func.__name__) for func in list_of_functions])
'<f1>, <f2>, <f3>'

答案 1 :(得分:2)

如果要打印名称:

lst = [func1,func2,func3]
print([f.__name__ for f in lst])

带输出:

['func1', 'func2', 'func3']

答案 2 :(得分:1)

如果你需要比func.__name__更复杂的东西,你可以将它包装在课堂上并实施__repr__

class FuncProxy:
    def __init__(self, func):
        self.func = func

    def __repr__(self):
        return '<{self.func.__name__}>'.format(self=self)

    def __call__(self):
        return self.func()



def some_func(): pass

l = [some_func, some_func, some_func]
l = [FuncProxy(i) for i in l]

print(l)  # [<some_func>, <some_func>, <some_func>]