>>> def hehe():
... return "spam"
...
>>> repr(hehe)
'<function hehe at 0x7fe5624e29b0>'
我希望:
>>> repr(hehe)
'hehe function created by awesome programmer'
我该怎么做?将__repr__
放在hehe
函数中不起作用。
修改
如果你们想知道我为什么要这样做:
>>> defaultdict(hehe)
defaultdict(<function hehe at 0x7f0e0e252280>, {})
我只是不喜欢它在这里显示的方式。
答案 0 :(得分:10)
不,你不能改变一个功能对象的表示;如果您想添加文档,则需要添加文档字符串:
def foo():
"""Frob the bar baz"""
并使用help(foo)
或print foo.__doc__
访问该内容。
你可以使用自定义__repr__
创建一个可调用对象,其行为就像一个函数:
class MyCallable(object):
def __call__(self):
return "spam"
def __repr__(self):
return 'hehe function created by awesome programmer'
演示:
>>> class MyCallable(object):
... def __call__(self):
... return "spam"
... def __repr__(self):
... return 'hehe function created by awesome programmer'
...
>>> hehe = MyCallable()
>>> hehe
hehe function created by awesome programmer
>>> hehe()
'spam'
答案 1 :(得分:9)
通常,当你想要改变一些关于函数的东西,比如函数签名,函数行为或函数属性时,你应该考虑使用装饰器。所以这是你如何实现你想要的:
class change_repr(object):
def __init__(self, functor):
self.functor = functor
# lets copy some key attributes from the original function
self.__name__ = functor.__name__
self.__doc__ = functor.__doc__
def __call__(self, *args, **kwargs):
return self.functor(*args, **kwargs)
def __repr__(self):
return '<function %s created by ...>' % self.functor.__name__
@change_repr
def f():
return 'spam'
print f() # spam
print repr(f) # <function hehe created by ...>
请注意,您只能使用基于类的装饰器,因为您需要覆盖__repr__
方法,而您无法使用函数对象。
答案 2 :(得分:2)
不直接回答你的问题,但也许你真的想要一个docstring?
>>> def hehe():
... '''hehe function created by awesome programmer'''
... return 'spam'
...
>>> help(hehe)
Help on function hehe in module __main__:
hehe()
hehe function created by awesome programmer
答案 3 :(得分:2)
这是亚历山大·朱可夫answer中的一个稍微灵活的版本:
def representation(repr_text):
class Decorator(object):
def __init__(self, functor):
self.functor = functor
def __call__(self, *args, **kwargs):
return self.functor(*args, **kwargs)
def __repr__(self):
return (repr_text % self.functor.__name__ if '%' in repr_text
else repr_text)
return Decorator
from collections import defaultdict
@representation('<function %s created by awesome programmer>')
def f():
return list
dd = defaultdict(f)
print repr(dd)
输出:
defaultdict(<function f created by awesome programmer>, {})
由于representation()
返回一个装饰器,如果你想在几个函数上使用相同的样板,你可以这样做:
myrepr = representation('<function %s created by awesome programmer>')
@myrepr
def f():
...
@myrepr
def g():
...
etc