在列表理解中调用非纯函数

时间:2018-10-18 12:11:09

标签: python list-comprehension side-effects pure-function

我有以下代码(简体):

def send_issue(issue):
    message = bot.send_issue(issue)
    return message

def send_issues(issues):
    return [send_issue(issue) for issue in issues]

如您所见,send_issuessend_issue是非纯函数。在列表解析中调用非纯函数是否被认为是一种好习惯(和Pythonic)?我要这样做的原因是这样很方便。这样做的原因是,当您看到列表理解时,您希望此代码仅生成列表,仅此而已,但事实并非如此。

UPD: 我实际上想创建并返回与此question相反的列表。

1 个答案:

答案 0 :(得分:4)

这里的问题是-您是否真的需要创建列表?

如果可以的话,但不是最佳设计。
优良作法是,函数仅做一件事情,特别是如果它具有I / O之类的副作用。
就您而言,该函数正在创建并发送消息。
要解决此问题,您可以创建一个发送消息的函数和一个生成消息的函数。

最好将其写为。

msgs = [bot.get_message(issue) for issue in issues]
for msg in msgs:
     bot.send(msg)

这更清楚,并且在保持副作用隔离的同时扩大了API的使用范围。

如果您不想创建另一个函数,则至少可以使用map,因为它说-“将该函数映射到每个元素”。

map(lambda issue: bot.send_issue(issue), issues) # returns a list

此外,不需要功能send_issue,因为它只包装了bot.send_issue。 添加此类功能只会使代码嘈杂,这不是一个好习惯。