2

我有以下代码(简化):

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:我实际上想创建并返回与这个问题相反的列表。

4

1 回答 1

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. 添加此类功能只会使代码变得嘈杂,这不是一个好习惯。

于 2018-10-18T12:27:05.133 回答