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

Ich möchte haben:Wie ändere ich die Darstellung einer Python-Funktion?

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

Wie kann ich das tun? Putting __repr__ innerhalb hehe Funktion funktioniert nicht.

EDIT:

Falls Sie Jungs fragen sich, warum ich dies tun wollen:

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

Ich mag einfach nicht so, wie es hier zeigt.

+3

Warum möchten Sie tun seine? –

+1

Ich beantwortete Ihre Frage in meiner Frage. – vajrasky

Antwort

9

Normalerweise, wenn Sie etwas über das ändern B. Funktionssignatur, Funktionsverhalten oder Funktionsattribute, sollten Sie einen Dekorator in Betracht ziehen. Also hier ist, wie Sie vielleicht realisieren, was Sie wollen:

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

Beachten Sie, dass Sie nur Klasse basiert Dekorateur verwenden können, da Sie __repr__ Methode außer Kraft setzen müssen, die Sie nicht mit einer Funktion Objekt tun kann.

+0

"Dekorateur" scheint wie ein schlechter Name (d. H. Zu allgemein!) Für Ihren Dekorateur. –

+0

Fühlen Sie sich frei, meine Antwort zu bearbeiten). –

2

Nicht direkt die Antwort auf Ihre Frage, aber vielleicht möchten Sie wirklich einen 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 
9

Nein, Sie können die Darstellung eines Funktionsobjekts nicht ändern; wenn Sie Dokumentation hinzufügen wollte, würden Sie einen docstring hinzufügen:

def foo(): 
    """Frob the bar baz""" 

und Zugriff auf das mit help(foo) oder print foo.__doc__.

Sie können eine aufrufbare Objekt mit einem benutzerdefinierten erstellen __repr__, die wie eine Funktion wirkt:

class MyCallable(object): 
    def __call__(self): 
     return "spam" 
    def __repr__(self): 
     return 'hehe function created by awesome programmer' 

Demo:

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

Funktionsobjekte können nicht unterklassifiziert werden. Also muss man wie ich eine eigene Klasse erstellen. – User

2

Hier ist eine etwas flexiblere Version von dem, was in Alexander Schukow 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) 

Ausgang:

defaultdict(<function f created by awesome programmer>, {}) 

Seit representation() gibt einen Dekorateur, wenn Sie den gleichen Textvorschlag auf mehreren Funktionen wollten konnte man Tun Sie etwas wie das:

myrepr = representation('<function %s created by awesome programmer>') 

@myrepr 
def f(): 
    ... 

@myrepr 
def g(): 
    ... 

etc 
Verwandte Themen