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

jMy*_*les 1 python syntax types django-templates

我的空手道教练喜欢说,"一个锁是一个锁是一个打击是一个打击." 他的意思是这样的:当我们采用一种形式的技术时,虽然它看起来像一块,但是一点点的创造力和检查表明它也可以被视为某种联合锁定,或某种形式的投掷,或某种打击.

因此,django模板语法使用点(".")字符的方式.它首先将其视为字典查找,但它也会将其视为类属性,方法或列表索引 - 按此顺序.这种假设似乎是,无论如何,我们正在寻找一种知识.无论采用何种方法来存储这些知识,我们都会以这样的方式对待它,使其进入模板.

为什么python不做同样的事情?如果有一种情况我可能已经分配了一个字典术语垃圾邮件['eggs'],但确定垃圾邮件有一个属性鸡蛋,为什么不让我只写spam.eggs并按照django模板的方式进行排序?

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

我对推动这种设置的理念特别感兴趣.它被视为强打字的一部分吗?

Sin*_*ion 7

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

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

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


aar*_*ing 6

只是我的正确观点确实是正确的.我不能说为什么Guido这样做了,但我可以说为什么我很高兴他做到了.

  1. 我可以查看代码并立即知道某个表达式是否正在访问类似dict的对象中的'b'键,对象上a的'b'属性a,被调用的方法或b序列中的索引a.

  2. 每次有属性查找时,Python都不必尝试所有上述选项.想象一下,如果每次将索引编入一个列表,Python必须首先尝试其他三个选项.列表密集型程序会拖动.Python足够慢!

  3. 这意味着当我编写代码时,我必须知道我在做什么.我不能只是扔掉周围的物体,希望我能以某种方式获取信息.我必须知道我想查找密钥,访问属性,索引列表或调用方法.我喜欢这样,因为它有助于我清楚地思考我正在编写的代码.我知道标识符引用的内容以及我期望这些引用的对象支持的属性和方法.

当然,Guido Van Rossum可能只是为我所知道的所有东西翻了一个硬币(他可能没有)所以如果你真的想知道的话,你必须自己问问他.

至于你关于用try块来包围这些东西的评论,这可能意味着你没有编写非常健壮的代码.通常,您希望代码期望从类似dict的对象,类似列表的对象或常规对象中获取一些信息.您应该知道它将采用哪种方式,并让其他任何事情引发异常.

例外情况是,使用property装饰器和更一般的描述符来混合属性访问和方法调用是可以的.这只有在方法不接受参数的情况下才有用.