On Fri, Sep 29, 2006 at 09:00:16AM +0200, Daniel de la Cuesta wrote:
> path="animals"
> items=len(context.sections.path.contentValues())
> When I try to run the script I get an error saying that the variable "path" 
> is not present.
> If i do:
> items=len(context.sections.animals.contentValues())
> everything is ok,
> How can I refer to a variable into a path expression in a Python Based Script?

On the surface this isn't really a zope question, it's basic Python.
You're looking for the getattr() builtin function.  For example:

[EMAIL PROTECTED] ~ $ python
Python 2.4.3 (#1, Jul 27 2006, 13:07:44)
[GCC 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo:
...     bar = 1
>>> foo = Foo()
>>> foo.bar
>>> path = 'bar'
>>> foo.path
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: Foo instance has no attribute 'path'
>>> getattr(foo, path)

Of course, Zope 2 has to complicate things a bit :)
Zope's ObjectManagers, such as Folders, also allow you
to use dictionary syntax to access their children.
So you can do foo[path] as well.

There is a semantic difference, though, in Zope 2: 

* attribute access like getattr(foo, 'bar'),  or foo.bar, falls
  back to using acquisition to look for 'bar' in foo's parent

* Item access (like foo['bar']) does not use acquisition, so you'd get an
  immediate KeyError if foo does not contain the named object.

I recommend using item access in all cases except when you know
for sure that you want to use acquisition. Acquisition bugs can be big
time-wasters - e.g. accidentally acquiring a slightly different object
than the one you wanted to use, because the one you expected to find
happens to be missing, or a site admin renamed it, or some such.


Paul Winkler
Zope maillist  -  Zope@zope.org
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to