gpt4 book ai didi

python - toolz.thread_first() 和 toolz.thread_last() 的目的是什么?

转载 作者:行者123 更新时间:2023-11-30 22:45:12 28 4
gpt4 key购买 nike

参见toolz.thread_first()toolz.thread_last() .

在我看来,它们使代码变得更加糟糕。考虑一下

x = f(x)
x = g(x)
x = h(x)

对比

x = thread_last(x,
f,
g,
h)

第一个例子是

  1. 更具可读性且易于理解,
  2. 不依赖外部 Python 库,
  3. 更容易调试,因为多个语句每个都有自己的行,并且
  4. 更加冗长,但幅度不大。

即使您想通过 x 传递 x ,比如使用 x = thread_first(x, *funcs) 的可变大小的函数列表,这也可能是通过定期迭代来完成——这又更冗长,但无论如何这种情况并不经常出现。

为什么有人想要使用thread_first()thread_last()?对我来说,这基本上是一种非常糟糕的风格。 原则上,实现一种通过函数传递参数列表的方法可以通过并行化来提高速度 - 但在我看来,这些实现实际上并没有发生这种情况。

最佳答案

虽然这主要是基于意见,但有很多好处:

命名事物很困难(或者他们是这么说的)thread_*pipe 允许您跳过中间分配。无需发明数十个中间名称,甚至更糟糕的是生活在 x、y、z 变量的 hell 中。

关注数据流和数据结构可实现简洁的声明式风格。大部分代码可以表示为简单的数据结构,并使用标准数据结构方法进行转换。可以说,它使您的代码更易于理解:

thread_first(
url,
requests.get,
requests.models.Response.json,
operator.itemgetter("result"))

并编写/重用代码:

request_pipeline = [authorize, fetch, validate]
api_response = [render_json]
html_response = [render_html]

thread_first(request, *request_pipeline + api_response)
thread_first(request, *request_pipeline + html_response)

将焦点转移到引用透明度它自然会强制执行小型的、引用透明的函数,并且作为副作用(双关语)使您的代码更易于调试。

它与惰性代码配合得很好(toolz.maptoolz.filter),这使得它非常适合数据处理,可能无限,数据结构。

最后您必须记住,这些函数并不是单独存在的。它们旨在与 toolz 的其他部分(尤其是函数组合和柯里化(Currying))、内置模块(如 operator)一起使用,并与第 3 方工具一起使用(就像multipledispatch)。只有这样他们才能发挥其全部力量。

但是toolz 中实现的许多想法在严格的函数式语言(Clojure 和 Elixir)中要自然得多,正如您提到的,对于 Python 开发人员来说可能感觉不自然。

关于python - toolz.thread_first() 和 toolz.thread_last() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258664/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com