J'écris mon propre conteneur, qui doit donner accès à un dictionnaire à l'intérieur par des appels d'attribut. L'utilisation typique du conteneur serait comme ceci:
dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo
Je sais qu'il peut être stupide d'écrire quelque chose comme ça, mais c'est la fonctionnalité que je dois fournir. Je pensais à mettre en œuvre cela de la manière suivante:
def __getattribute__(self, item):
try:
return object.__getattribute__(item)
except AttributeError:
try:
return self.dict[item]
except KeyError:
print "The object doesn't have such attribute"
Je ne sais pas si les blocs try / except imbriqués sont une bonne pratique, donc une autre façon serait d'utiliser hasattr()et has_key():
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
if self.dict.has_key(item):
return self.dict[item]
else:
raise AttributeError("some customised error")
Ou pour en utiliser un et essayer un bloc catch comme ceci:
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
try:
return self.dict[item]
except KeyError:
raise AttributeError("some customised error")
Quelle option est la plus pythonique et élégante?
if 'foo' in dict_container:. Amen.