(Ce qui suit est liée python3 (si cette matière).)len (objet) ou hasattr (objet, __iter__)?
Ce code ce que j'ai écrit (simplifié):
class MyClass: def __init__(self): self.__some_var = [] @property def some_var(self): return self.__some__var @some_var.setter def some_var(self, new_value): if hasattr(new_value, '__iter__'): self.__some_var = new_value else: self.__some_var.append(new_value)
Je veux remplacer lors de la configuration si leur est plusieurs "valeurs" (c'est-à-dire si new_value est une itérable de, dans mon cas, des objets non-iterable) et ajoutant si leur est seulement une "valeur". Je suis préoccupé par la performance de hasattr donc je me demande si je ne devrais pas utiliser ce compositeur à la place:
@some_var.setter def some_var(self, *args): if len(args) > 1: self.__some_var = args else: self.__some_var.append(args)
Merci pour votre attention!
Une optimisation prématurée? Faites un simple benchmark et voyez si la différence est même mesurable. Si quoi que ce soit, je m'attends à 'hasattr' être plus rapide. – intgr
@thomas, dans votre première forme, êtes-vous ** sûr ** que vous voulez "remplacer" quand 'new_value' est, disons,' 'thomas" '? Les chaînes ont '__iter__', et sont des séquences, mais presque invariablement dans le code, nous voulons les traiter comme des scalaires à la place. (La seconde forme a une sémantique radicalement différente, bien sûr, donc elle sera toujours "remplacer", même lorsqu'elle est appelée avec une liste). –
En fait, leur un test juste avant l'affectation si l'élément values () de new_value a une méthode, vous pouvez juste passer un objet qui se comporte spécifiquement à cette fonction, ou bien déclencher une erreur. – thomas