Glyph Lefkowitz <glyph@twistedmatrix.com>
On Fri, 10 Mar 2000, Phil Harris wrote:
As someone earlier today on the list said, "if it's in quotes it's python" (or something similar).
Basically Python rules apply when using any expressions in zope dtml-var and other tags.
I still think it's an inconsistent syntax. It should be possible (by overriding __coerce__, I think? I haven't had time to look this up yet) to make the == operator do something different. AUTHENTICATED_USER is often used as a string (at least what I've seen of it ...)
When in doubt, read the fine manual. The _actual_ syntax you are using is:: <dtml-var name="AUTHENTICATED_USER"> which can be abbreviated (and is, by almost every Zopista) as: <dtml-var AUTHENTICATED_USER> The "name" form of the var tag is the "preferred" one, for the types of applications DTML is really designed for: simple scripting of objects built in Python. It does several "automagic" things with the name: - If it is callable, calls it, passing the current object, the current namespace, and the REQUEST; it then replaces the object with the result of the call. - If it has a string coercion (__str__) method, calls that and replaces the object with the result. This behavior is the Right Thing (TM) for simple scripting; but it _isn't_ Pythonic (the automagic stuff smells more Perlish, really). The "in quotes" version is really:: <dtml-var expr="AUTHENTICATED_USER"> but can also be spelt (and mostly is):: <dtml-var "AUTHENTICATED_USER"> The "expr" form of the var tag evaluates the Python expression (in this case, to the object AUTHENTICATED_USER). For fairly obvious security reasons, the evaluation takes place inside a restricted namespace, without the usual builtins; the "safe" builtins are made available as members of the "_" namespace.
Also, "if it's in quotes it's in python", why do I need to do _.str()? why does dir() not work? It seems like some pretty horribly munged sort of python...
I would expect an object to behave consistently wherever it was used - so if it renders/returns/evaluates to 'zope' inside a dtml-var I would expect it equally to render/return/evaluate to 'zope' inside a dtml-if.
If it doesn't then surely we have an inconsistent syntax. How do we know how any object is going to behave inside a dtml tag ?
The simplest disambiguation possible is to cease using the shortcut forms, and always spell what you really want: <dtml-var name="AUTHENTICATED_USER"> <!-- DWIM: give me text!!! --> or <dtml-var expr="AUTHENTICATED_USER.getUserName()"> <!-- DWIS,NWYTIM --> Hope this helps! Tres. -- ========================================================= Tres Seaver tseaver@palladion.com 713-523-6582 Palladion Software http://www.palladion.com