2016-09-29 11 views
1

Я делаю обратное несовместимое изменение в конечной точке api в другом приложении, которое я вызываю из клиентского приложения (где этот код живет). Мне нужно некоторое время поддерживать его как в предыдущем случае (где данные находились на уровне «книги»), так и в новом случае (где данные находились в регистре «Профиль»).Что такое pythonic способ выбора данных из одного из двух мест?

Код ниже работает, чтобы захватить его с любого места, но у меня есть мучительное чувство, что должно быть более вещий способ сделать это. Любые идеи?

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

Что вы хотите улучшить в своем коде? Что заставляет вас хотеть, чтобы он был изменен? – MooingRawr

+0

@MooingRawr Я не думаю, что с ним что-то «не так», я просто хотел бы, чтобы это было красивее, если это возможно :) – snorkelzebra

+0

Я считаю, что ваш код красив как есть. Это читаемо, что является самой важной вещью второй, чтобы работать, Красота - в глазах смотрящего. – MooingRawr

ответ

0

Вместо

owner_data = owner_data_from_ledger if owner_data_from_ledger else owner_data_from_profile 

вы можете написать это что эквивалентно :

owner_data = owner_data_from_ledger or owner_data_from_profile 

В качестве альтернативы укоротить все это:

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

Вы также можете оставить из None в конце выше, так как это значение по умолчанию этого аргумента.

+0

Вещь с 'или' заключается в том, что если' owner_data_from_ledger' равно 0, она будет перебрасываться по умолчанию. Теперь это не проблема, если 0 не ожидается. Все, о чем я говорю, в то время как 'or' - отличный трюк, его нужно использовать осторожно, поскольку' [],(), {}, '', None, 0' все это вызовет. – MooingRawr

+0

@MooingRawr да, но это именно то, что делает текущий код. –

+0

Достаточно справедливо, просто подумал, может быть, стоит упомянуть об этом просто в будущем, один из них может вызвать проблемы. – MooingRawr