我有以下代码(简化):
def send_issue(issue):
message = bot.send_issue(issue)
return message
def send_issues(issues):
return [send_issue(issue) for issue in issues]
如您所见,send_issues
和 send_issue
是非纯函数。这是否被认为是在列表推导式中调用非纯函数的良好实践(和Pythonic)?我想这样做的原因是这样很方便。反对这一点的原因是,当您看到列表理解时,您期望此代码仅生成列表而仅此而已,但事实并非如此。
更新: 我实际上想创建并返回与此相反的列表 question .
最佳答案
这里的问题是 - 您真的需要创建列表吗?
如果是这样,那还可以,但不是最好的设计。
一个函数只做一件事是一种很好的做法,特别是当它有像 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
。
添加此类函数只会使代码变得嘈杂,这不是一个好的做法。
关于python - 在列表理解中调用非纯函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52873712/