【问题标题】:Local variable in Python list displayPython列表显示中的局部变量
【发布时间】:2015-02-11 04:34:06
【问题描述】:

我希望在 Python 列表或字典显示表达式中使用本地绑定,以便我可以在多个地方使用复杂表达式的结果(例如,if 子句和结果成员表达式)。像这样:

traders = {a:b
           for g in groups
           for a in account.group_accounts(g)
           for b in [account.accounts[a].balance().get_amount()]
           if my_condition(b)}

但要实现它,我必须制作一个单例列表,这既丑陋又不清楚。我真的想说

           where b = account.accounts[a].balance().get_amount()

但是 Python 显示语法不允许这样的事情。为此目的最好的语法是什么?

【问题讨论】:

  • 用普通的可读循环重写这个烂摊子怎么样?
  • account 是一个类的实例吗?
  • 虽然您可能会找到一些使用具有副作用的函数来完成类似工作的 hacky 方法,但您真的不应该这样做。 Python 有一些函数式结构,但它不是函数式语言。如果你想让这样的代码可读,你必须以命令式的方式编写它,即普通的 for 循环。
  • 我不懂这些cmets。这是字典显示表达式中的一个简单可读的循环(实际上,其中两个是嵌套的)。我想要的是推荐在for b in ... 行中表达b 绑定的最佳方式。

标签: python syntax coding-style list-comprehension


【解决方案1】:

实施

accounts[a].balance().get_amount()

你可以这样做

class Balance(object):
    def __init__(self, money):
        self.money = money
    def get_amount(self):
        return self.money

class Accounts(object):
    def __init__(self):
        self.accounts = list()
    def add(self, *args, **kwargs):
        new_account = Account(*args, **kwargs)
        self.accounts.append(new_account)
        return new_account
    def __getitem__(self, item):
        return self.accounts[item]

class Account(object):
    accounts = []
    def __init__(self, name, money):
        self.name = name
        self.balance = Balance(money)

accounts = Accounts()
accounts.add(name="1", money=42)
accounts.add(name="2", money=24)
accounts.add(name="3", money=33)

print accounts[0].balance.get_amount()

将打印

42

Python 实现了许多编程范例,不仅是命令式的,因此您应该关注具有相同语法的库,如 pandas 和 sqlalchemy。

【讨论】:

  • 是的,我知道我能做到。事实上,我在其他模块中有几百行代码在做类似的事情。这不是这个问题的目的。我想要的是使用 inside_a_list_or_dictionary_display_expression 的样式推荐,代替上面示例中的 for b in ... 行。
【解决方案2】:

据我所知,您原始帖子中的单例列表是在将代码保持在单个表达式中的同时做您想做的事情的最简洁方法。

python-ideas 邮件列表中不时出现在理解中添加一些用于绑定变量的语法的建议。 Here's one from Lie Ryan 在 2009 年,here's one from Mathias Panzenböck 在 2011 年。通常的反对意见是不必要的复杂性:

缺乏本地分配是一个特点。它阻止人们尝试 编写过于复杂的单行语句。 (Carl M. Johnson)

和可读性的损失:

[y for x in xs given f(x) if p(x) else g(x) as y] — 只是我,还是其他人觉得这个“子句字符串”(不管实际的关键字是什么)不太可读? (Georg Brandl)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多