有一个函数在打印时转换成它的名字
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>]
我有一个函数数组,但是当我打印这个数组时,我得到了一个非常难看的输出:
[<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>]