74 votes

Quelle est la meilleure façon de vérifier l'existence d'un attribut ?

Quelle est la meilleure façon de vérifier l'existence d'un attribut ?

Jarret Hardie a fourni cette réponse :

 if hasattr(a, 'property'):
    a.property

Je vois que cela peut aussi être fait de cette façon:

 if 'property' in a.__dict__:
    a.property

Une approche est-elle généralement utilisée plus que d'autres ?

0voto

Mikuz Points 742

Très vieille question mais elle a vraiment besoin d'une bonne réponse. Même pour un programme court, je dirais d'utiliser une fonction personnalisée !

Voici un exemple. Ce n'est pas parfait pour toutes les applications, mais c'est pour la mienne, pour analyser les réponses d'innombrables API et utiliser Django. C'est facile à régler pour les besoins de chacun.

 from django.core.exceptions import ObjectDoesNotExist
from functools import reduce

class MultipleObjectsReturned(Exception):
    pass

def get_attr(obj, attr, default, asString=False, silent=True):
    """
    Gets any attribute of obj.
    Recursively get attributes by separating attribute names with the .-character.        
    Calls the last attribute if it's a function.

    Usage: get_attr(obj, 'x.y.z', None)
    """
    try:
        attr = reduce(getattr, attr.split("."), obj)
        if hasattr(attr, '__call__'):
            attr = attr()
        if attr is None:
            return default
        if isinstance(attr, list):
            if len(attr) > 1:
                logger.debug("Found multiple attributes: " + str(attr))
                raise MultipleObjectsReturned("Expected a single attribute")
            else:
                return str(attr[0]) if asString else attr[0]
        else:
            return str(attr) if asString else attr
    except AttributeError:
        if not silent:
            raise
        return default
    except ObjectDoesNotExist:
        if not silent:
            raise
        return default

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X