我知道如果我写一个课程,我可以确定如下的自定义打印功能。
>>> 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()'。我对函数对象的自定义标签感兴趣,而不是自定义返回(显然该怎么做)。很抱歉这造成了任何混乱。
答案 0 :(得分:4)
其他人建议使用doc字符串,但doc字符串应该更能描述函数的作用。如果您想要一个描述该功能的简短属性,可以选择以下选项之一:
您是说要更改功能对象的默认说明吗?
>>> 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
或者,您可以在函数中存储属性并根据需要显示它们:
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
您也可以使用装饰器执行选项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########>