gpt4 book ai didi

clojure - :pre 中 Clojure.Spec 验证的有意义的错误消息

转载 作者:行者123 更新时间:2023-12-03 13:31:40 25 4
gpt4 key购买 nike

我利用最后几天深入挖掘 clojure.spec 在 Clojure 和 ClojureScript 中。

到目前为止,我发现它最有用,在 :pre 中使用规范作为保护。和 :post在依赖特定格式数据的公共(public)功能中。

(defn person-name [person]
{:pre [(s/valid? ::person person)]
:post [(s/valid? string? %)]}
(str (::first-name person) " " (::last-name person)))

这种方法的问题是,我得到一个 java.lang.AssertionError: Assert failed: (s/valid? ::person person)没有任何关于 的信息究竟是什么不符合规范 .

有谁有想法 如何获得更好的错误信息:pre:post守卫?

我知道 conformexplain* ,但这对那些 :pre 没有帮助或 :post守卫。

最佳答案

当您不想使用 s/assert 时,这很有用。 , 或无法启用 s/check-assserts .改进 MicSokoli 的回答:
:pre只是关心返回的值都是真的,所以我们可以转换返回值"Success!\n"true (为了严格)和throw如果输出不成功,说明和输入数据会出错。

(defn validate [spec input]
(let [explanation (s/explain-str spec input)]
(if (= explanation "Success!\n")
true
(throw (ex-info explanation {:input input}))))

这个的一个变体可能是这个,但它会运行规范两次:
(defn validate [spec input]
(if (s/valid? spec input)
true
(throw (ex-info (s/explain spec input) {:input input}))))

用法:
(defn person-name [person]
{:pre [(validate ::person person)]}
(str (::first-name person) " " (::last-name person)))

关于clojure - :pre 中 Clojure.Spec 验证的有意义的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885542/

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