<txp:article status="sticky" limit=1 /> ->  Textpattern Warning: Die Werte für Attribute müssen in Hochkommata eingeschlossen werden  on line 916
textpattern/lib/txplib_misc.php:916 trigger_error()
textpattern/publish.php:1090 splat()
textpattern/publish.php:1012 processTags()
textpattern/publish.php:496 parse()
index.php:33 textpattern()
Peterpedia-Flash: Mirroring
Übersicht Peterpedia lesen What's up Peterpedia? Administration Suche

Mirroring · Apr 10, 10:32 von stargaming

Dank Armin Ronacher (der mich auf den entscheidenden Tipp gebracht hat, Informationen einfach in einem Funktionsattribut zu speichern), ist folgendes Codeschnipselchen entstanden:

python:
  1. class Mirroring(type):
  2.     def __new__(meta, name, bases, clsdict):
  3.         for key, value in clsdict.items():
  4.             if hasattr(value, 'func_code') and hasattr(value, '_mirroring'):
  5.                 for mirror in value._mirroring:
  6.                     for alias in mirror[0]:
  7.                         if alias not in clsdict:
  8.                             clsdict[alias] = lambda *a, **k: value(*a, **k)
  9.                             clsdict[alias].__name__ = alias
  10.                             if mirror[1]:
  11.                                 clsdict[alias].doc = mirror1
  12.                             else:
  13.                                 clsdict[alias].__doc__ = \
  14.                                     getattr(value, '__doc__', None)
  15.         return type.__new__(meta, name, bases, clsdict)
  16.  
  17. def mirror(*names, **doc):
  18.     def wrapped(f):
  19.         if not hasattr(f, '_mirroring'):
  20.             f._mirroring = []
  21.         f._mirroring.append((names, doc.get('doc', None)))
  22.         return f
  23.     return wrapped

Benutzt wird es in etwa so:

python:
  1. class A(object):
  2.   __metaclass__ = Mirroring
  3.   @mirror("bar", doc="abkuerzung fuer foo")
  4.   def foo(self):
  5.     "irgendeine wichtige methode"
  6.     print "hi!"
  7. a = A()
  8. a.foo() # hi!
  9. a.bar() # hi!
  10. print a.foo.__doc__ # irgendeine wichtige methode
  11. print a.bar.__doc__ # abkuerzung fuer foo

Mirroring muss als Metaklasse gesetzt werden, um das Injizieren der Aliase zu ermöglichen. mirror nimmt als Argumente arbiträr viele positionale Namen auf die gespiegelt wird und eine Schlüsselwortargument doc (andere werden verschluckt), welches die Dokumentation ergibt.

Nützlich ist das zum Beispiel in cmd.Cmd, wo jeder Befehl der Kommandozeile mit einer Methode do_Befehl registriert wird.

python:
  1. __metaclass__ = Mirroring
  2. class Cmd(cmd.Cmd):
  3.   @mirror('do_q', doc='shorthand for quit')
  4.   def do_quit(self):
  5.     exit()

Artikel bearbeiten