Re: [Python-de] UserDict.UserDict vs. dict
Christopher Arndt wrote:
Am 16.02.2014 17:34, schrieb Michael Ströder:
kann mich mal jemand erhellen, was der feine Unterschied ist, wenn ich eine Klasse von UserDict.UserDict oder dict ableite und die in der Python Format String Syntax verwende?
In Ergänzung zu Peters Antwort:
- UserDict ist noch ein Überbleibsel aus der Zeit vor Python 2.0, in der man in Python nicht von den eingebauten Typen ableiten konnte.
- UserDict ist daher auch keine "new style"-Klasse.
- In Python 3 funktioniert die dict-Subklasse wie von dir erwartet.
- Die Referenz-Dokumentation sagt zur **-Syntax nur:
"If the syntax **expression appears in the function call, expression must evaluate to a mapping, the contents of which are treated as additional keyword arguments."
http://docs.python.org/3/reference/expressions.html#index-37
Das lässt einigen Spielraum für die Interpretation offen ("evaluate to"), insbesondere da die Dokumentation zu __getitem__ nur von Auswirkungen auf den Zugriff auf Sequence/Mapping-Elemente über den []-Operator spricht.
http://docs.python.org/3/reference/datamodel.html#object.__getitem__
Erst mal vielen Dank für Eure detaillierten Antworten. Vielleicht noch ein wenig Kontext: Ich unterstütze bei dieser Anwendung nur Python 2.7.x und das lässt sich für diese Anwendung auch wirklich nicht mit überschaubarem Aufwand ändern. Experimente und Doku von Python 3.x bringen mir daher erst mal nicht so viel. Die Verwendung von new-style classes ist für mich auch zweitrangig, allerdings würde ich gerne die über die Jahre angesammelten dict-like-Klassen etwas entstauben. ;-) Ich versuche gerade die ganzen verwendeten Template-Strings und -Dateien auf Python Format String Syntax umzustellen, schlicht weil's besser lesbar ist. Beispiel: Statt '%(cn)s <%(mail)s>' würde ich gerne '{cn} <{mail}>' verwenden. Stellt sich schon mal die Frage, wie ich herausbekomme, wie ich in '{cn} <{mail}>' die verwendeten Keys ermittle. Für die alte String-Form benutze ich den untenstehenden GrabKeys-Hack. Aber das bekomme ich nicht für die neue String-Syntax hin und ich vermute, das hängt ebenfalls mit dem (**d) und __getitem__() zusammen. Habt Ihr noch Tipps für mich? Ciao, Michael. -------------------------------------------------------------- class GrabKeys: """ Class for grabbing the string-formatting keys out of a string """ def __init__(self,s): self.keys = set([]) s % self def __call__(self): return self.keys def __getitem__(self, name): self.keys.add(name) return 0 # 0 is apparently compatible with all % format characters
Michael Ströder wrote:
Ich versuche gerade die ganzen verwendeten Template-Strings und -Dateien auf Python Format String Syntax umzustellen, schlicht weil's besser lesbar ist.
Beispiel:
Statt
'%(cn)s <%(mail)s>'
würde ich gerne
'{cn} <{mail}>'
verwenden.
Stellt sich schon mal die Frage, wie ich herausbekomme, wie ich in '{cn} <{mail}>' die verwendeten Keys ermittle. Für die alte String-Form benutze ich den untenstehenden GrabKeys-Hack. Aber das bekomme ich nicht für die neue String-Syntax hin und ich vermute, das hängt ebenfalls mit dem (**d) und __getitem__() zusammen.
Habt Ihr noch Tipps für mich?
Ciao, Michael.
-------------------------------------------------------------- class GrabKeys: """ Class for grabbing the string-formatting keys out of a string """
def __init__(self,s): self.keys = set([]) s % self
def __call__(self): return self.keys
def __getitem__(self, name): self.keys.add(name) return 0 # 0 is apparently compatible with all % format characters
Leider ist für die offensichtliche Lösung Python 3.2 erforderlich:
class Grab: ... def __init__(self): self.keys = set() ... def __getitem__(self, key): self.keys.add(key) ... g = Grab() "{alpha} {beta}".format_map(g) 'None None' g.keys {'alpha', 'beta'}
Du wirst die Format-Strings wohl selbst parsen müssen. PS: Meine Suche nach "format_map in Python 2 " förderte https://gist.github.com/zed/1384338 zutage. Darauf wär ich so nicht gekommen ;)
participants (2)
-
Michael Ströder
-
Peter Otten