有一个函数在打印时转换成它的名字

Have a function converting to its name when printed

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

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

是否有一种魔术可以让这些函数具有等效的字符串?像这样的紧凑输出:

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

或者:

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

如果要打印姓名:

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

输出:

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

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

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

输出是为了调试目的,而不是为了最终用户演示;十六进制地址是该对象的 id() ,可帮助您区分其他类似命名的函数。如果您想生成 'user friendly' 输出,请执行您自己的格式设置。例如,您可以使用列表理解;每个函数对象都有一个 __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>'

如果您需要比 func.__name__ 更复杂的东西,您可以将其包装在 class 中并实现 __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>]