我有一系列函数,但是当我打印数组时,我会得到一个非常难看的输出:
[<function f1 at 0x7f708c2bf1b8>, <function f2 at 0x7f708c2bf230>, <function f3 at 0x7f708c2bf2a8>]
是否有一种神奇的技巧让这些函数具有等效的字符串?这样的紧凑输出:
[<f1>, <f2>, <f3>]
或者:
['f1', 'f2', 'f3']
答案 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>]