传奇继续,从original thread延伸。在
因此,我有一个在python代码中生成宏的方法:
from flask import get_template_attribute
from jinja2 import Template
class InternalMacro(object):
"""
Creates a macro given a name, internal macro text, and content to fill(as namedtuple(t.var), dict(k,v), list(i), or other)
"""
def __init__(self, name = None,
text = None,
content_is = None):
self.name = name
self.macro_name = "{}_template".format(self.name)
self.macro_var = "{}_macro".format(self.name)
self.text = text
self.content_is = content_is
self.macro_txt = self.format_text
@property
def is_tuple(self):
return "{{% macro {0}(t) %}}{1}{{% endmacro %}}".format(self.macro_var, self.text)
@property
def is_dict(self):
return "{{% macro {0}(items) %}}{{% for k,v in items.iteritems() %}}{1}{{% endfor %}}{{% endmacro %}}".format(self.macro_var, self.text)
@property
def is_list(self):
return "{{% macro {0}(items) %}}{{% for i in items %}}{1}{{% endfor %}}{{% endmacro %}}".format(self.macro_var, self.text)
@property
def format_text(self):
return getattr(self, self.content_is)
@property
def return_template(self):
return Template(self.macro_txt)
@property
def return_callable(self):
return get_template_attribute(self.return_template, self.macro_var)
我以列表或dicts的形式单独传递namedtuples。当传递一个list(还没有作为dict进行完全测试)时,这是有效的,但是在传递一个namedtuple时就不行了。不管怎样,到目前为止,namedtuple都被转义为unicode。在
鉴于:
^{pr2}$退货:
u'Anamedtuple(var="A VAR VALUE") <div id="divvy"></div>'
不是:
u'Anamedtuple(var="A VAR VALUE")' <div id="divvy">A VAR VALUE</div>
如果我以列表的形式执行此操作,通常会调用.var。在
我错过了什么?我该如何规避?单个namedtuple得到转义,但list没有。我可以把一个单子列为一个单子,然后就把第一个列出来,也许对我来说是不干净的。任何关于改善这一点的建议也很感激。在
编辑:
简单的解决方案是将所有内容都简化为传入列表,消除single和dict选项,只需传入一个1的列表。我还是想弄清楚到底发生了什么。在
编辑2:
更深入的研究表明,我输出namedtuple的方式产生了我看到的结果-
test_macro = InternalMacro('test', '{{ t }} <div id="divvy">{{ t.var }}</div>', 'is_tuple')
结果:
u'Anamedtuple(var="A VAR VALUE") <div id="divvy"></div>'
鉴于:
test_macro = InternalMacro('test', '<div id="divvy">{{ t.var }}</div>', 'is_tuple')
结果
'<div id="divvy">A VAR VALUE</div>'
我想这两个名字只会被读一次,或者……好吧,任何详细的解释都可以。在
可能不是你想要的但是。。。在
'Foo(var=123)<;div id="divvy">123</div>
^{pr2}$我在使用python2.7和flask0.10.1(已经有一段时间了)。在
举报是对一些没有明确定义的东西的期望。除非我忽略了,否则在InternalMarco的is-tuple()属性中,基本类型(int、str等)和类对象之间没有区别。对于is元组,所有内容都放在一个字符串中,然后打印到缓冲区。在
该行为与
for i in items
不同,后者刷新for循环体{i}
(假设是一个输入{1}
)的错误,并且不执行任何字符串追加。在env/Python27/lib/site-packages/jinja2/parser.py
是我认为发生这种情况的地方869线
相关问题 更多 >
编程相关推荐