2013-11-20 2 views
11
>>> def hehe(): 
...  return "spam" 
... 
>>> repr(hehe) 
'<function hehe at 0x7fe5624e29b0>' 

私が持っていると思います:Python関数の表現を変更するにはどうすればよいですか?

>>> repr(hehe) 
'hehe function created by awesome programmer' 

私はそれをどのように行うのですか? __repr__heheの中に入れても機能しません。

編集:私はこれをしたい理由の場合

は皆さんが思っている:

>>> defaultdict(hehe) 
defaultdict(<function hehe at 0x7f0e0e252280>, {}) 

私はちょうどそれがここに示した方法が好きではありません。

+3

なぜあなたはしたいですか?彼の? –

+1

私はあなたの質問に私の質問で答えました。 – vajrasky

答えて

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__メソッドをオーバーライドする必要があるので、あなただけの、クラスベースのデコレータを使用することができます:だからここにあなたが欲しいものを実装するかもしれない方法です。ここで

+0

デコレータの「デコレータ」が悪い名前(あまりにも一般的です)のようです。 –

+0

私の答えを自由に編集できます)。 –

2

あなたの質問への答えは直接ではありませんが、実際にはドキュメントストリングが本当に必要でしょうか?

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

いいえ、関数オブジェクトの表現は変更できません。

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' 
+0

関数オブジェクトをサブクラス化することはできません。だから、あなたのように自分のクラスを作る必要があります。 – User

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 
関連する問題