python函数对象的自定义print语句

时间:2010-12-08 00:40:46

标签: 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.

但是,如果我想对函数对象做同样的事情呢?例如,

>>> def f():
...     pass
... 
>>> g = f
>>> print g
<function f at 0x7f738d6da5f0>

而不是'&lt;函数f在0x7f738d6da5f0&gt;',我想以某种方式指定打印的内容。这样做的动机是我要在列表中存储一堆函数对象,并且我想迭代列表并打印人类可读的函数类型描述,而不会增加额外的复杂性,例如,函数对象和字符串的元组。

提前感谢您提供的任何帮助。

编辑:我改变了我的例子,以反映我想传达的内容,不幸的是,当我的意思是'f'时,我输入'f()'。我对函数对象的自定义标签感兴趣,而不是自定义返回(显然该怎么做)。很抱歉这造成了任何混乱。

5 个答案:

答案 0 :(得分:4)

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

选项1

您是说要更改功能对象的默认说明吗?

>>> def f1(): pass
...
>>> def f2(): pass
...
>>> L = [f1,f2]
>>> print L
[<function f1 at 0x00AA72F0>, <function f2 at 0x00AA73B0>]

如果要自定义上面列表中的功能说明,请使用decorator。下面的装饰器将每个函数装饰到一个对象中,该对象的作用类似于原始函数,但具有自定义表示:

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)

输出

[<function sum "a+b">, <function diff "a-b">]
8
2

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

输出

a+b 11
a-b 5

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

输出

a+b 11
a-b 5

答案 1 :(得分:3)

错误很少:

>>> def f():
...     pass
... 
>>> g = f()     <---- g is the return value of running f
>>> print g
None

在第一种情况下,当你调用print时,你正在调用f

的字符串表示
>>> f = F()
>>> print f    <----- f is an instance of class F and 
               <----- print f tries to provide a suitable string representation
               <----- by calling f.__str__

您应该使用doc字符串作为动机

>>> def f():
...     " some doc"
...     pass
... 
>>> 
>>> f.__doc__
' some doc'
>>> 

您要做的是覆盖方法包装器__str__

>>> def f():
...     "some documentation .."
...     pass
... 
>>> 
>>> f.__str__
<method-wrapper '__str__' of function object at 0x100430140>
>>> 

答案 2 :(得分:2)

您无法更改打印函数时发生的情况,但您可以使类的行为类似于函数:

class f(object):
    def __str__(self):
        return "I'm a function!"

    def __call__(self):
        print "who called?"


print f # I'm a function!
f() # who called?

答案 3 :(得分:0)

函数返回值。将打印分配给g变量的值。如果要打印某些内容,只需确保函数f,返回一个字符串。

>>> def f():
...     return "Print me"
... 
>>> g = f()
>>> print g
Print me

答案 4 :(得分:0)

>>> g = f # no ()! That *calls* the function.
>>> print g
<function f at 0x########>