[Zope-dev] Re: TALES idea: tuple unpacking
Shane Hathaway
shane@zope.com
Tue, 29 Jul 2003 16:43:21 -0400
[Paul Winkler]
>>>I guess I don't understand the goal. Are we trying to make it
>>>so that zpt authors don't have to know any python?
[Chris Withers]
>>For me, that would be ideal...
[Paul Winkler]
>>>I really think that's a mistake.
Guys, that line of thinking is a distraction. ZPT authors ought to
learn Python. The issue is deeper than that. I'll explain below.
[Paul Winkler]
> Assuming that TALES python expressions are banned/discouraged/whatever,
> [...]
Python expressions won't be banned. I will never consider them
discouraged for all cases, either. There will always be a need for
constructs like:
<div tal:condition="python: a == b">...</div>
<div tal:condition="python: (a and b) or c">...</div>
However, the following is quite bad:
<tal:x define="ss nocall:modules/Products/PythonScripts/standard">
<a tal:attributes="href python: ss.url_quote(some_url)" />
</tal:x>
This is un-Pythonic in numerous ways.
- You can't use the import statement. In fact, you can't use any
statements at all--only expressions.
- The nocall: prefix.
- The name 'modules' is present automatically along with many other
names that aren't in the Python builtins namespace.
- Importing using a path expression.
- Binding a variable to a value without an equal sign.
- You have to prefix Python expressions with "python:".
- You have to be careful not to use double quotes in expressions.
(Ampersands and less-than/greater-than signs are tricky too. Watch out
for pairs of hyphens!)
Zope 2's method of slightly simplifying this is to write a two-line
script and find it through implicit acquisition. The overhead of
invoking a script is somewhat large, but here's what the template would
look like anyway.
<a tal:attributes="href python: here.url_quote(some_url)" />
Zope 3 will not have implicit acquisition. In fact, no system but Zope
2 has implicit acquisition. That leaves us with no possible way to
write the above statement in non-implicit Python! No matter what you
do, you need some help from another kind of expression. Until recently,
here was the way to write it in Zope 3.
<tal:x define="url_quote nocall:here/++acquire++url_quote">
<a tal:attributes="href python: url_quote(some_url)" />
</tal:x>
That alternative is just as complicated and un-Pythonic as importing a
module in a template. I can't think of a better way to write this given
the limitations of Zope 2 ZPT, without the giant implicit acquisition
band-aid. Can you?
Zope 3's new alternative looks about like this:
<a tal:attributes="href here/format:url_quote" />
To me, that's a vast improvment, and it's only one example.
You know what was actually wrong with DTML? The lack of Python Scripts.
Without Python Scripts, everyone used DTML as a programming language.
Once Python Scripts came around, DTML became a reasonable templating
language again. If DTML used TALES expressions, it would be just as
clean as ZPT.
Shane