2016-09-29 1 views
1

Je suis en train de faire un changement incompatible vers un point final api dans une application différente que j'appelle d'une application cliente (où ce code vit). Je dois le supporter pendant un certain temps en gérant à la fois le cas précédent (où les données vivaient au niveau "grand livre") et le nouveau cas (où les données vivaient dans le grand livre "profil")Qu'est-ce qu'une façon pythonique de sélectionner des données à partir de l'un des deux emplacements?

Le code ci-dessous travaille à la saisir de ces deux endroits, mais j'ai un sentiment lancinant il doit y avoir une plus pythonique façon de le faire. des idées?

class Profile(object): 

    @property 
     def account_owner(self): 
      owner_data_from_ledger = self.account.ledger.data.get('owner', None) 
      owner_data_from_profile = self.data.get('owner', None) 

      owner_data = owner_data_from_ledger if owner_data_from_ledger else owner_data_from_profile 

      if owner_data: 
       return Human(owner_data) 
      return None 
+1

Que cherchez-vous à améliorer dans votre code? Qu'est-ce qui vous donne envie de le changer? – MooingRawr

+0

@MooingRawr Je ne pense pas qu'il y ait quelque chose de "faux" avec ça, je voudrais juste que ce soit plus beau si c'est possible :) – snorkelzebra

+0

Je crois que votre code est beau comme il est. C'est lisible, ce qui est la chose la plus importante après le travail, la beauté est dans les yeux du spectateur. – MooingRawr

Répondre

0

au lieu de

owner_data = owner_data_from_ledger if owner_data_from_ledger else owner_data_from_profile 

vous pouvez écrire ce qui est équivalent :

owner_data = owner_data_from_ledger or owner_data_from_profile 

raccourcissent Sinon la chose:

owner_data_ = self.account.ledger.data.get('owner', 
        self.data.get('owner', None)) 

Vous pouvez également laisser le None à la fin ci-dessus puisque c'est la valeur par défaut de cet argument.

+0

La chose avec 'or' est que si' owner_data_from_ledger' est 0, il retournera à la valeur par défaut. Maintenant, ce n'est pas un problème si 0 n'est pas attendu. Tout ce que je dis est, alors que 'or' est un grand tour, il doit être utilisé avec précaution, puisque' [],(), {}, '', None, 0' vont tous le déclencher. – MooingRawr

+0

@MooingRawr oui, mais c'est exactement ce que fait le code actuel aussi. –

+0

Juste assez, juste pensé peut-être devrait le mentionner juste en cas d'Incase dans le futur l'un de ceux qui pourraient déclencher des problèmes. – MooingRawr