传奇从原始线程延续。
所以,我有一个东西可以在Python代码中创建宏:
如果我以列表的形式进行操作,.var 将会被正常调用。
我错过了什么,如何规避这种情况?单个命名元组被转义,但是列表没有。我可以将单个命名元组作为列表并弹出第一个元素,但这似乎不太干净。欢迎提出改进意见。
编辑:
简单的解决方案是将所有内容缩小到传入的列表中,消除单个和字典选项,只传入一个包含1个元素的列表。但我仍然想弄清楚到底发生了什么。
编辑2:
更深入的探索显示,我输出命名元组的方式生成了我看到的结果,即 -
导致
我猜namedtuples只被读取一次,或者......欢迎提供更详细的解释。
所以,我有一个东西可以在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)
我把namedtuple作为列表或字典单独传递。当传递列表时,它可以正常工作(尚未完全测试为字典),但是当传递单个namedtuple时无法正常工作。到目前为止,无论如何,namedtuple都会被转义为Unicode。
因此,给定:
test_macro = InternalMacro('test', '{{ t }} <div id="divvy">{{ t.var }}</div>', 'is_tuple')
test_macro.return_callable(Anamedtuple)
返回:
u'Anamedtuple(var="A VAR VALUE") <div id="divvy"></div>'
注意:
u'Anamedtuple(var="A VAR VALUE")' <div id="divvy">A VAR VALUE</div>
如果我以列表的形式进行操作,.var 将会被正常调用。
我错过了什么,如何规避这种情况?单个命名元组被转义,但是列表没有。我可以将单个命名元组作为列表并弹出第一个元素,但这似乎不太干净。欢迎提出改进意见。
编辑:
简单的解决方案是将所有内容缩小到传入的列表中,消除单个和字典选项,只传入一个包含1个元素的列表。但我仍然想弄清楚到底发生了什么。
编辑2:
更深入的探索显示,我输出命名元组的方式生成了我看到的结果,即 -
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>'
我猜namedtuples只被读取一次,或者......欢迎提供更详细的解释。