كيف يمكنني استدعاء القالب Defs بأسماء معروفة فقط في وقت التشغيل في لغة قالب Python Mako؟

StackOverflow https://stackoverflow.com/questions/923837

  •  06-09-2019
  •  | 
  •  

سؤال

أحاول إيجاد طريقة لاستدعاء قوالب 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.

نصائح أخرى

ماذا عن إذا قمت أولا بإنشاء القالب (من قالب آخر :)، ثم قم بتشغيل ذلك مع بياناتك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top