【问题标题】:What is a pythonic way to select data from one of two locations?从两个位置之一选择数据的pythonic方法是什么?
【发布时间】:2017-02-08 07:38:46
【问题描述】:

我正在对从客户端应用程序(此代码所在的位置)调用的不同应用程序中的 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

【问题讨论】:

  • 您希望在代码中改进什么?是什么让你想要改变它?
  • @MooingRawr 我不认为它有什么“错误”,如果可能的话,我只是希望它更漂亮:)
  • 我相信你的代码很漂亮。可读性是仅次于工作的最重要的事情,美丽在旁观者的眼中。

标签: python styles readability


【解决方案1】:

代替

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,因为这是该参数的默认值。

【讨论】:

  • or 的问题是,如果owner_data_from_ledger 为 0,它将抛出默认值。现在,如果不期望 0,这不是问题。我想说的是,虽然or 是一个绝妙的技巧,但需要小心使用,因为[], (), {}, '', None, 0 都会触发它。
  • @MooingRawr 是的,但这正是当前代码所做的。
  • 很公平,只是想也许应该提一下,以防将来其中一个可能引发问题。
  • @mooingRawr 感谢您指出这一点,但我不希望这里有任何我不想忽略的虚假值。
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多