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

标签 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)?我想这样做的原因是这样很方便。反对这一点的原因是,当您看到列表理解时,您期望此代码仅生成列表而仅此而已,但事实并非如此。

更新: 我实际上想创建并返回与此相反的列表 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/

相关文章:

python - 计算字典中的单词

python - RopeVim 中的代码辅助......你如何使用它?

python - 将嵌套 for 循环转换为嵌套列表理解

c# - 如何防止 Visual Studio 2015 的调试器评估具有副作用的静态属性?

android - Jetpack Compose 中的副作用

python - 使用生成器表达式返回多个值

python - 按添加顺序为字典分配值

python - python if/else 中的列表理解

haskell - Haskell 中特定列表理解的解释

function - "Side-effecting lexical closure"vs Scala 中的函数