كيف يمكنني استدعاء القالب Defs بأسماء معروفة فقط في وقت التشغيل في لغة قالب Python Mako؟
سؤال
أحاول إيجاد طريقة لاستدعاء قوالب DEF التي تحددها البيانات المتاحة في السياق.
يحرر: مثيل أبسط من نفس السؤال.
من الممكن أن تنبعث قيمة كائن في السياق:
# in python
ctx = Context(buffer, website='stackoverflow.com')
# in mako
<%def name="body()">
I visit ${website} all the time.
</%def>
ينتج عنه:
I visit stackoverflow.com all the time.
أرغب في السماح بتخصيص الإخراج، بناء على البيانات.
# in python
ctx = Context(buffer, website='stackoverflow.com', format='text')
# in mako
<%def name="body()">
I visit ${(format + '_link')(website)} all the time. <-- Made up syntax.
</%def>
<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>
<%def name='text_link(w)'>
${w}
</%def>
تغيير format
سمة في السياق يجب أن تغير الإخراج من
I visit stackoverflow.com all the time.
ل
I visit <a href='http://stackoverflow.com'>stackoverflow.com</a> all the time.
ال صنع بناء الجملة لقد استخدمت في body
def
من الواضح أن خطأ. ما الذي أحتاجه لتحديد قالب ديناميكيا، ثم اتصل به؟
المحلول
يأخذ بعض اللعب مع ماكو local
مساحة الاسم، ولكن هنا مثال على العمل:
from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO
mytemplate = Template("""
<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>
<%def name='text_link(w)'>
${w}
</%def>
<%def name="body()">
I visit ${getattr(local, format + '_link')(website)} all the time.
</%def>
""")
buf = StringIO()
ctx = Context(buf, website='stackoverflow.com', format='html')
mytemplate.render_context(ctx)
print buf.getvalue()
كما هو مطلوب، وهذا ينبعث:
I visit
<a href='http://stackoverflow.com'>stackoverflow.com</a>
all the time.
نصائح أخرى
ماذا عن إذا قمت أولا بإنشاء القالب (من قالب آخر :)، ثم قم بتشغيل ذلك مع بياناتك؟
لا تنتمي إلى StackOverflow