我有一个Django的forms,我正在validation在正常的Django视图。 我想弄清楚如何提取纯粹的错误(没有HTML格式)。 以下是我目前使用的代码。 return json_response({ 'success' : False, 'errors' : form.errors }) 有了这个,我从Django得到臭名昭着的代理对象错误。 强制将每个错误转换为Unicode也不会__unicode__ ,因为每个错误的__unicode__方法都将被有效地称为HTML化。 有任何想法吗? 编辑: 对于那些感兴趣的,这是json_response的定义: def json_response(x): import json return HttpResponse(json.dumps(x, sort_keys=True, indent=2), content_type='application/json; charset=UTF-8')
在parsing器组合器库的文件Parsers.scala(Scala 2.9.1)中,我似乎遇到了一个不太为人所知的名为“lazy arguments”的Scala特性。 这是一个例子: def ~ [U](q: => Parser[U]): Parser[~[T, U]] = { lazy val p = q // lazy argument (for(a <- this; b <- p) yield new ~(a,b)).named("~") } 很显然,这里有一些事情将名称参数赋值给懒惰的val p 。 到目前为止,我还没有能够解决这个问题,为什么它是有用的。 谁能帮忙?
我很好奇如下的无限列表的运行时性能: fibs = 1 : 1 : zipWith (+) fibs (tail fibs) 这将创build斐波纳契序列的无限列表。 我的问题是,如果我做到以下几点: takeWhile (<5) fibs fibs评估列表中的每个术语多less次? 看起来,因为takeWhile检查列表中每个项目的谓词函数, fibs列表将会多次评估每个项目。 前两项是免费的。 当takeWhile想在第三个元素上评估(<5)时,我们会得到: 1 : 1 : zipWith (+) [(1, 1), (1)] => 1 : 1 : 3 现在,一旦想要在第四个元素上评估(<5) : fibs的recursion性质将再次构build列表如下: 1 : 1 : zipWith (+) [(1, 2), (2, 3)] => 1 : 1 : […]
Haskell有一个名为seq的神奇函数,它接受任何types的参数并将其减less为弱头范式 (WHNF)。 我已经读了几个消息来源(不是我现在能记得他们是谁……),声称“多态性seq是坏的”。 他们以什么方式“坏”? 类似地,还有rnf函数,它将参数减less到Normal Form (NF)。 但这是一个类方法; 它不适用于任意types。 对我来说,似乎是“显而易见的”,可以改变语言规范,将其作为内置原语提供,类似于seq 。 这大概会比只有seq更“糟糕”。 这是怎样的? 最后,有人build议给seq , rnf , par和类似于id函数的types,而不是const函数,因为它现在是一个改进。 怎么会这样?
我很难理解Clojure中rest和rest的区别。 官方网站关于懒惰的页面表明,偏好应该是用rest ,但是这并不能真正解释两者之间的差别。 任何人都可以提供一些见解吗?
我正在学习Haskell,并遇到以下代码: fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 这在parsing方面有点麻烦,就其工作原理而言。 这是非常整洁,我明白,没有什么是必要的,但我想了解,当我写的时候,Haskell如何设法“填补”fibs: take 50 fibs 任何帮助? 谢谢!
我在Clojure中尝试了以下方法,期望返回一个非惰性序列的类: (.getClass (doall (take 3 (repeatedly rand)))) 但是,这仍然返回clojure.lang.LazySeq 。 我的猜测是, doall确实评估整个序列,但返回原始序列,因为它对memoization仍然有用。 那么从懒惰创build一个非懒惰序列的惯用手段是什么?
我注意到Scala提供了lazy vals 。 但我不明白他们做什么。 scala> val x = 15 x: Int = 15 scala> lazy val y = 13 y: Int = <lazy> scala> x res0: Int = 15 scala> y res1: Int = 13 REPL表明y是一个lazy val ,但它与正常的val不同呢?
我正在阅读哈德利·威克汉姆(Hadley Wickhams)的关于Github的书,特别是关于懒惰评价的这一部分 。 在那里他给出了懒惰评估的后果的例子,在add/adders函数的部分。 让我引用这一点: 用lapply或循环创build闭包时,这个[懒惰的评估]是很重要的: add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10) 当你第一次调用其中一个加法器函数时,x是懒惰的评估。 此时,循环完成,x的最终值为10.因此,所有的加法器函数都会将10加到它们的input上,可能不是你想要的! 手动强制评估可以解决问题: add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10) 我似乎没有明白这一点,而且那里的解释很less。 有人可以详细说明这个特定的例子,并解释发生了什么? 我特别困惑的句子“在这一点上,循环完成,x的最终值是10”。 什么循环? 什么终极价值在哪里? 一定是简单的东西我想念,但我只是没有看到它。 非常感谢。