gpt4 book ai didi

python - 是否有技术原因无法用 Python 重写像 RSpec 这样的 Ruby DSL?

转载 作者:IT老高 更新时间:2023-10-28 20:41:09 26 4
gpt4 key购买 nike

下面的部分更详细,但基本上有人说 Ruby 编写的 DSL RSpec无法用 Python 重写。真的吗?如果是这样,为什么?

我想更好地了解 Ruby 和 Python 之间的技术差异。

更新:我为什么要问这个问题?

Running away from RSpec讨论中有一些关于“不可能”重新创建 RSpec 的声明在 Python 中。我试图让这个问题更广泛一些,希望能更多地了解 Ruby 和 Python 之间的技术差异。事后看来,也许我应该把问题的范围缩小到只问是否真的不可能重新创建 RSpec在 Python 中,如果是,为什么。

以下只是 Running away from RSpec 中的一些引用讨论。

最初的问题

For the past few weeks I have been thinking a lot about RSpec and why there is no clear, definite answer when someone asks:

"I'm looking for a Python equivalent of RSpec. Where can I find such a thing?"

可能最常见(并且可以理解)的答案是 Python 语法 不允许这样的事情,而在 Ruby 中这是可能的。

对初始问题的第一 react

Not syntax exactly. Rspec monkeypatches every object inside of its scope, inserting the methods "should" and "should_not". You can do something in python, but you can't monkeypatch the built-in types.

另一个回应

As you suggest, it's impossible. Mote and PySpec are just fancy ways to name your tests: weak implementations of one tiny corner of RSpec. Mote uses horrible settrace magic; PySpec adds a bunch of domain-irrelevant noise. Neither even supports arbitrary context strings. RSpec is more terse, more expressive, removes the noise, and is an entirely reasonable thing to build in Ruby.

That last point is important: it's not just that RSpec is possible in Ruby; it's actually idiomatic.

最佳答案

如果我必须指出创建 Python RSpec 的一个很大困难,那就是 Python 中缺乏用于创建匿名函数(如 JavaScript)或 block (如 Ruby)的良好语法。 Python 程序员的唯一选择是使用 lambdas,这根本不是一种选择,因为 lambdas 只接受一个表达式。 RSpec 中使用的 do ... end block 必须在调用 describeit 之前编写为函数,如下例所示:

def should_do_stuff():
# ...
it("should do stuff", should_do_stuff)

没那么性感吧?

创建 should 方法有一些困难,但我敢打赌这将是一个较小的问题。实际上,甚至不需要使用这种不寻常的语法——您可以使用 Jasmine 获得类似的结果(可能更好,取决于您的口味)。语法,可以轻松实现。

也就是说,我觉得 Python 语法更侧重于有效地表示常用的程序组件,例如类、函数、变量等。它不太适合扩展。一方面,我认为一个好的 Python 程序是一个我可以看到对象、函数和变量的程序,并且我理解这些元素中的每一个元素的作用。 Ruby 程序员 OTOH 似乎在寻求一种更像散文的风格,为新问题定义一种新语言。这也是一种很好的做事方式,但不是 Pythonic 方式。 Python 擅长表示算法,而不是散文。

有时这是一个严格的限制。例如,如何使用 BDD?好吧,在 Python 中突破这些限制的通常方法是有效地编写自己的 DSL,但它应该真的是另一种语言。这就是Pyccuracy是,例如:BDD 的另一种语言。更主流的例子是doctest . (实际上,如果我要写一些 BDD Python 库,我会基于 doctest 来写。) Python DSL 的另一个例子是 Twill .另一个例子是reStructuredText , 用于 Sphinx .

总结:恕我直言,Python 中 DSL 的最大障碍是缺乏用于创建匿名函数的灵活语法。这不是一个错误*:无论如何,Python 不喜欢对其语法进行大量探索——它被认为会使 Python 世界中的代码变得不那么清晰。如果你想在 Python 中使用新的语法,建议你编写自己的语言,或者至少我是这么认为的。

* 或者也许是——我不得不承认我想念匿名函数。但是,我认识到,考虑到 Python 语义缩进,它们很难优雅地实现。

关于python - 是否有技术原因无法用 Python 重写像 RSpec 这样的 Ruby DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7079855/

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