Ran*_*Guy 3 python functional-programming
我知道如果我写一个类,我可以定义一个自定义打印函数,如下所示。
>>> class F:
... def __str__(self):
... return 'This describes the data of F.'
...
>>> f = F()
>>> print f
This describes the data of F.
Run Code Online (Sandbox Code Playgroud)
但是,如果我想对函数对象做同样的事情怎么办?例如,
>>> def f():
... pass
...
>>> g = f
>>> print g
<function f at 0x7f738d6da5f0>
Run Code Online (Sandbox Code Playgroud)
我想以某种方式指定打印的内容,而不是 '<function f at 0x7f738d6da5f0>'。这样做的动机是我将在列表中存储一堆函数对象,并且我想遍历列表并打印人类可读的函数类型描述,而不会增加额外的复杂性,例如,函数对象和字符串的元组。
在此先感谢您提供的任何帮助。
编辑:我改变了我的例子来反映我想要传达的内容,不幸的是我在输入“f”时输入了“f()”。我对函数对象的自定义标签感兴趣,而不是自定义返回(这很明显如何做)。对于由此造成的任何混淆,我们深表歉意。
其他人建议使用 doc 字符串,但 doc 字符串可能应该更能描述函数的作用。如果您想要一个描述函数的简短属性,以下选项之一可能就是您正在寻找的:
您是说要更改函数对象的默认描述吗?
>>> def f1(): pass
...
>>> def f2(): pass
...
>>> L = [f1,f2]
>>> print L
[<function f1 at 0x00AA72F0>, <function f2 at 0x00AA73B0>]
Run Code Online (Sandbox Code Playgroud)
如果要自定义上面列表中功能的描述,请使用装饰器。下面的装饰器将装饰的每个函数包装成一个对象,该对象的行为类似于原始函数,但具有自定义表示:
def doc(s):
class __doc(object):
def __init__(self,f):
self.func = f
self.desc = s
def __call__(self,*args,**kwargs):
return self.func(*args,**kwargs)
def __repr__(self):
return '<function {0} "{1}">'.format(self.func.func_name,self.desc)
return __doc
@doc('a+b')
def sum(a,b):
return a + b
@doc('a-b')
def diff(a,b):
return a - b
L = [sum,diff]
print L
for f in L:
print f(5,3)
Run Code Online (Sandbox Code Playgroud)
[<function sum "a+b">, <function diff "a-b">]
8
2
Run Code Online (Sandbox Code Playgroud)
或者,您可以在函数中存储属性并根据需要显示它们:
def sum(a,b):
return a + b
sum.desc = 'a+b'
def diff(a,b):
return a-b
diff.desc = 'a-b'
L = [sum,diff]
for f in L:
print f.desc,f(8,3)
Run Code Online (Sandbox Code Playgroud)
a+b 11
a-b 5
Run Code Online (Sandbox Code Playgroud)
您也可以使用装饰器执行选项 2:
def doc(s):
def __doc(f):
f.desc = s
return f
return __doc
@doc('a+b')
def sum2(a,b):
return a + b
@doc('a-b')
def diff2(a,b):
return a - b
L = [sum2,diff2]
for f in L:
print f.desc,f(8,3)
Run Code Online (Sandbox Code Playgroud)
a+b 11
a-b 5
Run Code Online (Sandbox Code Playgroud)