【问题标题】:Difference between an item and an attribute - Jinja, Python项目和属性之间的区别 - Jinja,Python
【发布时间】:2020-01-04 10:34:15
【问题描述】:

我正在阅读有关templates in Jinja 的信息,尤其是有关变量的信息。我想请你解释一下关于访问传递给 Jinja 语法对象的值的这句话:

实施

为方便起见,Jinja2 中的 foo.bar 做了以下操作 Python层的东西:

  • 检查 foo 上名为 bar 的 属性 (getattr(foo, 'bar'))

  • 如果没有,检查 foo 中的 item 'bar' (foo.__getitem__('bar'))

  • 如果没有,则返回一个未定义的对象。

foo['bar'] 的工作方式大体相同,只是顺序略有不同:

  • 检查 foo 中的 item 'bar'。 (foo.__getitem__('bar'))

  • 如果没有,检查 foo 上名为 bar 的 属性。 (getattr(foo, 'bar'))

  • 如果没有,则返回一个未定义的对象。

如果一个对象具有相同的项和属性,这很重要 姓名。此外,attr() 过滤器只查找属性。

item和attribute有什么区别?

PS - 如果相关:我从事字典工作。我刚刚读到Jinja 可以使用键作为属性(dict.key)来访问值,但是在阅读了关于进程顺序的这一部分后我感到困惑。比较“键值”对使理解上述部分更具挑战性。

【问题讨论】:

    标签: python attributes jinja2 items


    【解决方案1】:

    在python类中instances属性;字典包含项目。 在dict 中,项目是键和值的组合

    a = object()
    a.attribute = 'value'
    b = dict()
    b['key'] = 'value'
    b.items()
    

    【讨论】:

    • Jinja 将字典视为类实例,因此我们可以访问它们的属性。首先,Jinja 检查对象是否是一个...对象并具有一个属性 - 一个键。如果我们使用 Python 层和 dic['key'] 语法,一开始我们会查找字典的项目。我描述的案例是 Python 和 Jinja 的优先级问题,无论它们是处理项目还是属性。我说的对吗?
    【解决方案2】:

    属性描述类的对象,而项目是字典中的键值对。

    访问这些的方式也与其优先级规则相匹配: 1.对象的属性用'.'访问操作员。 2. 使用getitem或'[]'操作符访问字典的键值对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 2011-06-22
      • 2012-08-27
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多