【问题标题】:StringTemplate-4: Cannot render expr propertyStringTemplate-4:无法呈现 expr 属性
【发布时间】:2012-09-30 09:54:10
【问题描述】:

根据StringTemplate 4 wiki,我应该能够显示 expr 属性,但我不能。我将 StringTemplate4 与 jython 一起使用。

这是我的模板文件 test.st:

test(persons, person) ::= <<
<table>
    <tr><th>Name</th><th>Age</th></tr>
    <tr><td>$person.name$</td><td>$person.age$</td></tr>
    $persons:{p|<tr><td>$p.name$</td><td>$p.age$</td></tr>}$
</table>

这是我的 jython 代码。当我尝试渲染模板时,未显示名称和年龄值。

>>> import org.stringtemplate.v4 as st
>>> 
>>> class Person:
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
... 
>>> group = st.STGroupDir('~/template', '$', '$')
>>> tmpl = group.getInstanceOf('test')
>>> 
>>> tmpl.add('persons', [Person('jim', 25), Person('sam', 46)])
/test()
>>> tmpl.add('person', Person('bob', 55))
/test()
>>> 
>>> print tmpl.render()
<table>
    <tr><th>Name</th><th>Age</th></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr><tr><td></td><td></td></tr>
</table>

在解释器中,我可以很好地访问 tmpl 中的属性。

>>> tmpl.attributes
{person=<__main__.Person instance at 0x54>, persons=[<__main__.Person instance at 0x55>, <__main__.Person instance at 0x56>]}
>>> p = tmpl.getAttribute('person')       
>>> print p.name, p.age
bob 55
>>> for p in tmpl.getAttribute('persons'):
...     print p.name, p.age
... 
jim 25
sam 46

知道为什么这不起作用吗?难道我做错了什么?我还尝试为 Person 类创建 getName() 和 getAge() 方法,但没有运气。如果我创建一个数据聚合,我就可以很好地访问属性。

【问题讨论】:

    标签: jython template-engine stringtemplate stringtemplate-4


    【解决方案1】:

    在 Java 中,这是因为这些属性不是公开的。 Jython 如何处理对字段的访问?

    【讨论】:

    • 那些类变量是公开的。在 Jython 中,私有变量前面带有两个前导下划线(例如:__varname)。这是一个解释:link
    • 啊。我猜如果你在 Interpreter.getObjectProperty() 方法中停止它,调试器会告诉我们。它将进入对象以尝试使用反射将事物取出。恐怕我根本不了解 jython,所以我不确定不匹配是什么。如果您弄清楚约定是什么,我们总是可以添加一些东西来检测 jython 对象。谢谢!
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2013-12-30
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多