Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python语法推理(为什么不退回到django模板语法的方式呢?)_Python_Types_Syntax_Django Templates - Fatal编程技术网

Python语法推理(为什么不退回到django模板语法的方式呢?)

Python语法推理(为什么不退回到django模板语法的方式呢?),python,types,syntax,django-templates,Python,Types,Syntax,Django Templates,我的空手道教练喜欢说,拦路就是锁,投掷就是打击。他的意思是:当我们谈到一种形式的技术时,尽管它看起来像一个积木,但一点创造力和检查表明,它也可以被看作是某种关节锁,或某种投掷,或某种打击 django模板语法使用点的方式也是如此。性格它首先将其视为字典查找,但也将其视为类属性、方法或列表索引-按顺序。这种假设似乎是,不管怎样,我们都在寻找一种知识。无论使用何种方法来存储这些知识,我们都将以这样一种方式来处理它,以便将其放入模板中 为什么python不做同样的事情?如果有这样一种情况,我可能在字典

我的空手道教练喜欢说,拦路就是锁,投掷就是打击。他的意思是:当我们谈到一种形式的技术时,尽管它看起来像一个积木,但一点创造力和检查表明,它也可以被看作是某种关节锁,或某种投掷,或某种打击

django模板语法使用点的方式也是如此。性格它首先将其视为字典查找,但也将其视为类属性、方法或列表索引-按顺序。这种假设似乎是,不管怎样,我们都在寻找一种知识。无论使用何种方法来存储这些知识,我们都将以这样一种方式来处理它,以便将其放入模板中

为什么python不做同样的事情?如果有这样一种情况,我可能在字典中指定了一个术语spam['eggs',但我确实知道spam有一个属性eggs,为什么不让我编写spam.eggs并像django模板那样对其进行排序呢

否则,我必须除去AttributeError并添加三行额外的代码


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

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

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


python拥有完全不同的受众。开发人员实际上使用了许多不同的方法来做相似的事情,并且每个方法都有不同的含义。当一个失败了,它就应该失败,因为这是开发者想要它做的

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

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


python拥有完全不同的受众。开发人员实际上使用了许多不同的方法来做相似的事情,并且每个方法都有不同的含义。当一个失败了,它就应该失败,因为这是开发者想要它做的

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

我可以查看代码,立即知道是否有表达式正在访问类似dict的对象a中的“b”键、对象a上的“b”属性、调用的方法或序列a中的b索引

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

这意味着当我写代码时,我必须知道我在做什么。我不能只是把东西扔来扔去,希望我能以某种方式从某个地方得到信息。我必须知道我想要查找一个键、访问一个属性、索引一个列表或调用一个方法。我喜欢这种方式,因为它帮助我清楚地思考我正在编写的代码。我知道标识符引用的是什么,我希望这些引用的对象支持哪些属性和方法

当然,Guido Van Rossum可能只是掷了一枚硬币,我知道他可能没有,所以如果你真的想知道的话,你必须亲自问他

至于您关于必须用try块围绕这些内容的评论,这可能意味着您没有编写非常健壮的代码。通常,您希望代码期望从类似dict的对象、类似列表的对象或常规对象中获取一些信息。您应该知道它将以何种方式进行操作,并让其他任何方式引发异常


例外情况是,可以使用属性装饰器和更一般的描述符合并属性访问和方法调用。只有当方法不接受参数时,这才是好的。

仅我的正确意见确实是正确的。我不能说圭多为什么这样做,但我可以说为什么我很高兴他这样做

我可以查看代码,立即知道是否有表达式正在访问类似dict的对象a中的“b”键、对象a上的“b”属性、调用的方法或序列a中的b索引

Python不必在每次进行属性查找时都尝试上述所有选项。想象一下,如果每次将一个索引到列表中,Python都必须首先尝试其他三个选项。列表密集型程序会拖拉。Python是慢的enou 啊

这意味着当我写代码时,我必须知道我在做什么。我不能只是把东西扔来扔去,希望我能以某种方式从某个地方得到信息。我必须知道我想要查找一个键、访问一个属性、索引一个列表或调用一个方法。我喜欢这种方式,因为它帮助我清楚地思考我正在编写的代码。我知道标识符引用的是什么,我希望这些引用的对象支持哪些属性和方法

当然,Guido Van Rossum可能只是掷了一枚硬币,我知道他可能没有,所以如果你真的想知道的话,你必须亲自问他

至于您关于必须用try块围绕这些内容的评论,这可能意味着您没有编写非常健壮的代码。通常,您希望代码期望从类似dict的对象、类似列表的对象或常规对象中获取一些信息。您应该知道它将以何种方式进行操作,并让其他任何方式引发异常

例外情况是,可以使用属性装饰器和更一般的描述符合并属性访问和方法调用。只有当方法不接受参数时,这才是好的

不同的访问方法 属性做不同的事情。如果 这两行有一个函数foo 密码 a=foo, a=foo 做两个 非常不同的事情。没有 引用和调用的不同语法 这是不可能的 要知道python中的变量 应该是对foo或 运行foo的结果。语法消除了歧义。 列表和字典是两种截然不同的数据结构。在给定的情况下,决定哪一种方法合适的因素之一是如何通过键和索引访问其内容。对这两种语言都使用单独的语法强化了这样一种观念,即这两种语言并不相同,而且两者都不总是合适的。 在模板语言中忽略这些区别是有意义的,编写html的人不在乎,模板语言没有函数指针,所以它知道您不需要函数指针。然而,编写驱动模板的python的程序员确实关心这些区别

不同的访问方法 属性做不同的事情。如果 这两行有一个函数foo 密码 a=foo, a=foo 做两个 非常不同的事情。没有 引用和调用的不同语法 这是不可能的 要知道python中的变量 应该是对foo或 运行foo的结果。语法消除了歧义。 列表和字典是两种截然不同的数据结构。在给定的情况下,决定哪一种方法合适的因素之一是如何通过键和索引访问其内容。对这两种语言都使用单独的语法强化了这样一种观念,即这两种语言并不相同,而且两者都不总是合适的。
在模板语言中忽略这些区别是有意义的,编写html的人不在乎,模板语言没有函数指针,所以它知道您不需要函数指针。编写Python驱动模板的程序员确实关心这些区别。

除了已经发布的点之外,请考虑这一点。Python使用特殊的成员变量和函数来提供有关对象的元数据。解释器和程序员都大量使用这些工具。例如,dicts和list都有一个_len__成员函数。现在,如果dict的数据是通过使用。运算符,如果dict有一个名为_len__的键,则可能出现歧义。您可以使用这些特殊情况,但许多对象都有一个_dict___)属性,它是成员名称和值的映射。如果该对象恰好是一个容器,它也定义了一个_len________属性,那么最终将是一团乱麻

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


现在,如果新的用户在这个问题中的代码是任何指示,并且这样的东西开始看起来像是一个非常糟糕的想法,因为它会使问题加重很多倍。Python使用特殊的成员变量和函数来提供有关对象的元数据。解释器和程序员都大量使用这些工具。例如,dicts和list都有一个_len__成员函数。现在,如果dict的数据是通过使用。运算符,如果dict有一个名为_len__的键,则可能出现歧义。您可以使用这些特殊情况,但许多对象都有一个_dict___)属性,它是成员名称和值的映射。如果该对象恰好是一个容器,它还定义了一个_ulen_uu属性,那么 你最终会陷入一片混乱

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


现在,考虑到新的用户经常在这个问题中的代码是任何指示的情况下影子内置的,这样的东西开始看起来像是一个非常糟糕的想法,因为它会使问题加重很多倍。由于对对象成员的限制,通常合并字典查找和对象查找是不实际的


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

除了上面的回答,由于对对象成员的限制,通常合并字典查找和对象查找是不实际的



如果您的密钥有空格怎么办?如果是int或frozenset等怎么办。?点表示法无法解释这些差异,因此,虽然它是模板语言可以接受的折衷,但对于Python这样的通用编程语言来说,它是不可接受的。

因为Guido van Rossum不想这样做。因为Guido van Rossum不想这样做。回答得好!我喜欢你的三点。第一个似乎有一个弱点,但它是这样的:如果我,作为一个开发人员,想写代码,更容易或更难阅读,有没有办法为我这样做短缺。在这种情况下,我可能会选择取消三行代码,尽管这会使代码稍微更难阅读。“你的第三点很迷幻,说得很好。”贾斯汀。您总是可以编写不可读的代码。但归根结底还是要权衡取舍。如果较难阅读的代码合法地更快或更健壮,那么您将从中获益。读者至少应该能够从一段代码中解析出运行代码所需的对象属性。许多新手认为不可读或不明确的惯用Python也是事实,例如,if not list_uu而不是if lenlist_uu==0:在学习Python之后,实际上是完全可读和明确的。或者,也许,意识到在许多情况下Python只是英语你的例子是一个很好的例子,我认为这是一个正确的答案,因为我认为它提供了这个语法元素在更大的python哲学中的位置的最佳和最全面的印象。很好的答案!我喜欢你的三点。第一个似乎有一个弱点,但它是这样的:如果我,作为一个开发人员,想写代码,更容易或更难阅读,有没有办法为我这样做短缺。在这种情况下,我可能会选择取消三行代码,尽管这会使代码稍微更难阅读。“你的第三点很迷幻,说得很好。”贾斯汀。您总是可以编写不可读的代码。但归根结底还是要权衡取舍。如果较难阅读的代码合法地更快或更健壮,那么您将从中获益。读者至少应该能够从一段代码中解析出运行代码所需的对象属性。许多新手认为不可读或不明确的惯用Python也是事实,例如,if not list_uu而不是if lenlist_uu==0:在学习Python之后,实际上是完全可读和明确的。或者,也许,意识到在许多情况下Python只是英语你的例子是一个很好的例子,我认为这是一个正确的答案,因为我认为它给人的印象是这个语法元素在更大的python哲学中的位置是最好和最全面的。这也是一个很好的答案!你的最后一句话是诗!:-这也是一个很好的答案!你的最后一句话是诗!:-我在这里主要是扮演魔鬼代言人的角色——那么为什么不也有一个锁呢?一个是块,一个是掷,一个是击。保留点作为属性查找,但让它成为一般关系的跟随者。我猜。约定必须决定当您执行spam^Oggs和spam^Oggs是一个函数时,它们可以始终假定您希望运行该函数并返回结果,但如果函数带有参数,该怎么办?你仍然会得到spam.eggs或spam.eggs“炒”这两行,所以我不确定spam^egs语法到底能给你带来什么,在某个时候你实际上必须知道你在使用什么以及你想用它做什么。好吧,以泛型关系为例。如果您与几个不同的模型有泛型关系,并且大多数模型都有name属性,但少数模型没有,那么您可以创建一个name方法,该方法不带任何参数,并通过任何逻辑派生名称
这是相关的。然后,您可以普遍使用spam.eggs^name。现在,你至少需要一个if,也许还需要一次尝试。我在这里主要扮演魔鬼代言人的角色——那么为什么不也有一个锁呢?是一个block,是一个throw,是一个blow操作符。保留点作为属性查找,但让它成为一般关系的跟随者。我猜。约定必须决定当您执行spam^Oggs和spam^Oggs是一个函数时,它们可以始终假定您希望运行该函数并返回结果,但如果函数带有参数,该怎么办?你仍然会得到spam.eggs或spam.eggs“炒”这两行,所以我不确定spam^egs语法到底能给你带来什么,在某个时候你实际上必须知道你在使用什么以及你想用它做什么。好吧,以泛型关系为例。如果您与几个不同的模型有一个泛型关系,并且大多数模型都有name属性,但少数模型没有,那么您可以创建一个name方法,该方法不带任何参数,并通过任何相关逻辑派生名称。然后,您可以普遍使用spam.eggs^name。现在,你至少需要一个if,也许还需要一次尝试。