python函数对象的自定义打印语句

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()”。我对函数对象的自定义标签感兴趣,而不是自定义返回(这很明显如何做)。对于由此造成的任何混淆,我们深表歉意。

Mar*_*nen 7

其他人建议使用 doc 字符串,但 doc 字符串可能应该更能描述函数的作用。如果您想要一个描述函数的简短属性,以下选项之一可能就是您正在寻找的:

选项1

您是说要更改函数对象的默认描述吗?

>>> 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)

选项 2

或者,您可以在函数中存储属性并根据需要显示它们:

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)

选项 3

您也可以使用装饰器执行选项 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)