代码之家  ›  专栏  ›  技术社区  ›  jMyles

Python语法推理(为什么不支持。django模板语法的方式?)

  •  1
  • jMyles  · 技术社区  · 13 年前

    我的空手道指导员喜欢说:“一个街区就是一把锁,一个投掷就是一个打击。”他的意思是:当我们谈到一种技术的形式时,虽然它看起来像一个街区,但一点创意和测试表明,它也可以被看作是某种关节锁,或某种投掷,或某种打击。

    这就是django模板语法使用点(“.”)字符的方式。它首先将其视为字典查找,但也将按此顺序将其视为类属性、方法或列表索引。我们的假设似乎是,不管怎样,我们都在寻找知识。不管用什么方法来存储这些知识,我们都会以这样的方式来处理它,以便将其放入模板中。

    为什么python不这样做呢?如果有个案子我 可以 已经分配了一个字典术语spam['eggs'],但是要确定spam有一个属性eggs,为什么不让我直接编写spam.eggs并按照django模板的方式进行分类呢?

    否则,我必须排除一个AttributeError并添加另外三行代码。

    我对驱动这种设置的哲学特别感兴趣。它被认为是强类型的一部分吗?

    5 回复  |  直到 12 年前
        1
  •  6
  •   aaronasterling    13 年前

    只是我的正确观点是正确的。我不能说为什么圭多这样做,但我可以说为什么我很高兴他这样做。

    1. 我可以查看代码 马上知道 如果某个表达式正在访问类dict对象中的“b”键 a ,对象的“b”属性 ,调用的方法或 b 索引到序列中 .

    2. Python不必每次进行属性查找时都尝试以上所有选项 . 想象一下,如果每次一个索引到一个列表中,Python都必须先尝试其他三个选项。列表密集型程序会拖。蟒蛇已经够慢了!

    3. 意思是当我写代码的时候, 我必须知道我在做什么。 我不能把东西扔来扔去,希望我能从某个地方得到信息。我必须知道我想查找一个键,访问一个属性,索引一个列表或调用一个方法。我喜欢那样因为 帮助我清晰地思考 关于我写的代码。我知道标识符引用的是什么,以及我希望这些引用的对象支持哪些属性和方法。

    当然,吉多·范·罗森可能只是为我所知道的一切(他可能没有)抛了一枚硬币,所以如果你真的想知道的话,你必须亲自问他。

    至于你对这些事情的评论 try 块,这可能意味着您没有编写非常健壮的代码。通常,您希望代码期望从dict类对象、list类对象或常规对象中获取一些信息。你应该知道它会怎么做,并让其他任何事情引起一个例外。

    例外情况是,可以使用 property 装饰和更一般的描述。只有当方法不带参数时,这才是好的。

        2
  •  7
  •   SingleNegationElimination    13 年前

    django模板和python是两种不相关的语言。他们也有不同的目标受众。

    在django模板中,目标受众是设计师,他们不想学习4种不同的方法来做大致相同的事情(字典查找)。因此,django模板中有一种语法,可以用几种可能的方式执行查找。

    python有很多不同的受众。开发人员实际上使用了许多不同的方法来做类似的事情,并且每个方法都有不同的含义。当一个人失败时,它应该 失败 ,因为这正是开发人员所要做的。

        3
  •  1
  •   user522826    13 年前
    • 访问的不同方法 属性做不同的事情。如果 这两行有一个函数 代码的 a = foo, a = foo() 做两件事 完全不同的事情。没有 引用和调用的不同语法 功能没有办法 python知道变量 应该是foo或 运行foo的结果。()语法消除了歧义。
    • 列表和字典是两种截然不同的数据结构。在给定的情况下,决定哪一个合适的方法之一是如何访问其内容(键与索引)。两种语言都有单独的语法,这强化了这样一个概念:这两种语言不一样,两种语言都不一样 总是 适当的。

    在模板语言中忽略这些区别是有意义的,编写html的人不在乎,模板语言没有函数指针,所以它知道您不需要函数指针。然而,编写驱动模板的python的程序员确实关心这些区别。

        4
  •  1
  •   Chinmay Kanchi    13 年前

    除了已经发布的要点之外,请考虑这一点。Python使用特殊的成员变量和函数来提供关于对象的元数据。解释器和程序员都很重视这些。例如,两者 dict s和 list 有一个 __len__ 成员函数。现在,如果 迪克特 的数据是通过使用 . 算符,如果 迪克特 有一把钥匙叫 __蓝__ . 你 能够 特别是这些,但是很多物体都有 __dict__ 属性,它是成员名称和值的映射。如果该对象碰巧是一个容器,它还定义了 __蓝__ 属性,你将以一个彻底的混乱结束。

    像这样的问题最终会把Python变成一堆特殊情况,程序员必须时刻注意这些情况。这将有损于许多人最初使用Python的原因,即它优雅的简单性。

    现在,考虑到新用户经常隐藏内置(如果soq中的代码有任何问题的话)并且拥有这样的东西开始看起来像是一个非常糟糕的主意,因为它会使问题恶化很多倍。

        5
  •  1
  •   Ryan Ginstrom    13 年前

    除了上面的响应之外,由于对象成员的限制,通常合并字典查找和对象查找是不实际的。

    如果你的钥匙有空格怎么办?如果是int,或者 frozenset 等等。?点表示法不能解释这些差异,所以虽然它是模板语言的一个可接受的折衷方案,但对于像Python这样的通用编程语言来说是不可接受的。