La construction getattr(obj, 'attr1.attr2', None)
ne fonctionne pas. Quelles sont les meilleures pratiques pour remplacer cette construction ? Diviser cette construction en deux déclarations getattr ?
Réponses
Trop de publicités?Vous pouvez utiliser operator.attrgetter()
afin d'obtenir plusieurs attributs à la fois :
from operator import attrgetter
my_attrs = attrgetter(attr1, attr2)(obj)
aleclara95
Points
1
Comme indiqué dans cette réponse la solution la plus simple serait d'utiliser l'option operator.attrgetter (plus d'informations dans cette page de documentation sur python ).
Si, pour une raison quelconque, cette solution ne vous satisfait pas, vous pouvez utiliser cet extrait de code :
def multi_getattr(obj, attr, default = None):
"""
Get a named attribute from an object; multi_getattr(x, 'a.b.c.d') is
equivalent to x.a.b.c.d. When a default argument is given, it is
returned when any attribute in the chain doesn't exist; without
it, an exception is raised when a missing attribute is encountered.
"""
attributes = attr.split(".")
for i in attributes:
try:
obj = getattr(obj, i)
except AttributeError:
if default:
return default
else:
raise
return obj
# Example usage
obj = [1,2,3]
attr = "append.__doc__.capitalize.__doc__"
multi_getattr(obj, attr) #Will return the docstring for the
#capitalize method of the builtin string
#object
de cette page ce qui fonctionne. Je l'ai testé et utilisé.