[Zope-dev] Re: SVN:
Zope/branches/ajung-zpt-end-game/lib/python/Products/PageTemplates/tests/testExpressions.py
Fix a test that was testing wrong behaviour: primitive types
Tres Seaver
tseaver at palladion.com
Mon May 22 16:35:39 EDT 2006
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Philipp von Weitershausen wrote:
> Tres Seaver wrote:
>
>>Philipp von Weitershausen wrote:
>>
>>>>Log message for revision 68244:
>>>> Fix a test that was testing wrong behaviour: primitive types
>>>> werent' called if they were the result of a path expression, while
>>>> all other callables were called. This tests now tests the correct
>>>> behaviour (which happens to be already implemented by the Zope 3
>>>> TALES engine)
>>
>>>>+ assert ec.evaluate('x | python:int') == 0
>>
>>Wait a minute -- that isn't a path expression there!
>
>
> Yes it is. This line could explicitly written as:
>
> assert ec.evaluate('path: x | python:int') == 0
>
> The python: expression is just part of the path expression.
>
>
>>The '|' is not supposed to change the rules for evaluation of the
>>subexpressions!
>
>
> It doesn't change the rules for the evaluation of the subexpressions
> themselves. But it might easily change the rules of what happens to the
> result of the expression afterwards.
>
>
>>If
>>'int' or the like were somehow avaialbe at module scope, or via
>>'options' or another top-level name, then they should be called *when
>>they are the last item in a path expression*.
>>
>>The test was actually correct beofore: because tne PathExpression, 'x',
>>raises, the PythonExpression, 'int', is evalutated. The result of a
>>subexpression is not suppoeed to be called,
>
>
> No, not the result of a subexpression, but the result of the overall
> path expression. That's how it works in both Zope 2 and Zope 3. Zope 2
> just special-cases primitive types.
If a subexpression returns a callable, you're telling me that you think
the "top-level" expression is supposed to call it? That's nuts! The
spec[1] says:
> When a TALES path expression is evaluated, it attempts to traverse
> each path, from left to right, until it succeeds or runs out of
> paths. To traverse a path, it first fetches the object stored in the
> variable. For each path segment, it traverses from the current object
> to the subobject named by the path segment.
>
> Once a path has been successfully traversed, the resulting object is
> the value of the expression. If it is a callable object, such as a
> method or class, it is called. The semantics of traversal (and what it
> means to be callable) are implementation-dependent.
>
> If a traversal step fails, evaluation immediately proceeds to the
> next path. If there are no further paths, an error results.
Calling the callable happens *before* attempting alternate expressions,
not after. That is partly because the *call* might be what triggers
the alternation.
[1]
http://www.zope.org/Wikis/DevSite/Projects/ZPT/TALES%20Specification%201.3
Tres.
- --
===================================================================
Tres Seaver +1 202-558-7113 tseaver at palladion.com
Palladion Software "Excellence by Design" http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFEciCT+gerLs4ltQ4RAhesAKDHpp1+XJRukZfRgp/wBrDyBA3/HACfRj4P
k20UEFCRTzu++Bcyp015JDE=
=nmpz
-----END PGP SIGNATURE-----
--
===================================================================
Tres Seaver +1 202-558-7113 tseaver at palladion.com
Palladion Software "Excellence by Design" http://palladion.com
More information about the Zope-Dev
mailing list