Ich hatte einige Probleme mit __getattr__
nicht aufgerufen wird, habe ich eine neue Stilklassenversion erstellt:
class Struct(object):
'''The recursive class for building and representing objects with.'''
class NoneStruct(object):
def __getattribute__(*args):
return Struct.NoneStruct()
def __eq__(self, obj):
return obj == None
def __init__(self, obj):
for k, v in obj.iteritems():
if isinstance(v, dict):
setattr(self, k, Struct(v))
else:
setattr(self, k, v)
def __getattribute__(*args):
try:
return object.__getattribute__(*args)
except:
return Struct.NoneStruct()
def __repr__(self):
return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for
(k, v) in self.__dict__.iteritems()))
Diese Version enthält außerdem folgende Elemente NoneStruct
die zurückgegeben wird, wenn ein Attribut aufgerufen wird, das nicht gesetzt ist. Dies ermöglicht die Prüfung von None, um festzustellen, ob ein Attribut vorhanden ist. Sehr nützlich, wenn die genaue Diktat-Eingabe nicht bekannt ist (Einstellungen usw.).
bla = Struct({'a':{'b':1}})
print(bla.a.b)
>> 1
print(bla.a.c == None)
>> True
6 Stimmen
Ich habe vor kurzem versucht, etwas Ähnliches zu tun, aber ein wiederkehrender Wörterbuchschlüssel ("from" - ein Python-Schlüsselwort) hat mich daran gehindert, es zu tun. Denn sobald man versuchte, mit "x.from" auf dieses Attribut zuzugreifen, erhielt man einen Syntaxfehler.
3 Stimmen
Das ist in der Tat ein Problem, aber ich kann auf "from" verzichten, um das Leben einfacher zu machen, wenn ich auf große Diktatkonstrukte zugreife:) die Eingabe von x['a']['d'][1]['foo'] ist wirklich lästig, also gilt x.a.d[1].foo. wenn Sie from benötigen, können Sie über getattr(x, 'from') darauf zugreifen oder stattdessen _from als Attribut verwenden.
7 Stimmen
from_
statt_from
laut PEP 8 .1 Stimmen
Sie können verwenden
getattr(x, 'from')
statt der Umbenennung des Attributs.4 Stimmen
Die meisten dieser "Lösungen" scheinen nicht zu funktionieren (selbst die akzeptierte, erlaubt keine verschachtelten
d1.b.c
), ist es meiner Meinung nach klar, dass Sie etwas aus einer Bibliothek verwenden sollten, z. B. namedtuple aus Sammlungen , como diese Antwort suggeriert, ...2 Stimmen
Bunch - Verwenden Sie ein Python-Dict wie ein Objekt: thechangelog.com/bunch-lets-use-python-dict-like-object