Re: [Zope-dev] Re: ComputedAttribute

2001-01-11 Thread Steve Alexander

Martijn Pieters wrote:

 
 But because _v_* variables don't get pickled, another thread will never
 see them. If you want non-persisting (volatile) variables shared between
 threads, you'll have to devise your own mechanism for assuring the
 thread-safety of those variables.

Or, instead of devising your own mechanism, you can borrow someone else's:

   http://www.handshake.de/~dieter/pyprojects/zope/SharedResource.html


Thanks Dieter!

--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Chris Withers

Martijn Pieters wrote:
 
 Erm. The ExtensionClass.stx documentation hints at a ComputedAttribute
 class (but as an example of how you could use an ExtensionClass). The
 current C implementation of ComputedAttribute is not, as far as I can see,
 documented.

Now I think I know the answer to this one, but I'll ask just to be sure:

class MyClass(Persistent Acquisition.Explicit):

 def _set_your_attribute (self,value):
self._v_your_attribute = value

 def _get_your_attribute (self):
 return self._v_your_attribute

 your_attribute = ComputedAttribute(_get_your_attribute)

...with this class, your_attribute isn't going to play in Persistence,
is it? (so I can update it lots without worrying about ZODB size
growing... :-)

Hmm... more questions:

If I do:

x = MyClass()
x.your_attribute = 1

...what happens?

Where do you import the ComputedAttribute module from?

cheers,

Chris

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Martijn Pieters

On Wed, Jan 10, 2001 at 04:13:49PM +, Chris Withers wrote:
 Martijn Pieters wrote:
  
  Erm. The ExtensionClass.stx documentation hints at a ComputedAttribute
  class (but as an example of how you could use an ExtensionClass). The
  current C implementation of ComputedAttribute is not, as far as I can see,
  documented.
 
 Now I think I know the answer to this one, but I'll ask just to be sure:
 
 class MyClass(Persistent Acquisition.Explicit):
 
  def _set_your_attribute (self,value):
   self._v_your_attribute = value
 
  def _get_your_attribute (self):
  return self._v_your_attribute
 
  your_attribute = ComputedAttribute(_get_your_attribute)
 
 ...with this class, your_attribute isn't going to play in Persistence,
 is it? (so I can update it lots without worrying about ZODB size
 growing... :-)

Yup, this allows you to alias your_attribute to _v_your_attribute without
creating an attribute that *will* persist in the process.

 Hmm... more questions:
 
 If I do:
 
 x = MyClass()
 x.your_attribute = 1
 
 ...what happens?

your_attribute is set to one instead of the ComputedAttribute instance and
concequently persisted. If you want _set_your_attribute to be called, you
need to override __setattr__:

def __setattr__(self, name, value):
setter = getattr(self, '_set_' + name, None)
if setter:
setter(value)
else:
raise AttributeError, "no such attribute: " + `name`

 Where do you import the ComputedAttribute module from?

from ComputedAttribute import ComputedAttribute

-- 
Martijn Pieters
| Software Engineer  mailto:[EMAIL PROTECTED]
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
-

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Chris Withers

Martijn Pieters wrote:
 
  ...with this class, your_attribute isn't going to play in Persistence,
  is it? (so I can update it lots without worrying about ZODB size
  growing... :-)
 
 Yup, this allows you to alias your_attribute to _v_your_attribute without
 creating an attribute that *will* persist in the process.

yay! :-)

 your_attribute is set to one instead of the ComputedAttribute instance and
 concequently persisted. 

d'Oh... of course...

 If you want _set_your_attribute to be called, you
 need to override __setattr__:
 
 def __setattr__(self, name, value):
 setter = getattr(self, '_set_' + name, None)
 if setter:
 setter(value)
 else:
 raise AttributeError, "no such attribute: " + `name`

Hmmm... how would you change this to call the __setattr__ that was there
before you overrode it, if a setter could not be found?

cheers for all the help, this thread might make quite god docs for
ComputedAttribute ;-)

Chris

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Martijn Pieters

On Wed, Jan 10, 2001 at 05:07:07PM +, Chris Withers wrote:
  If you want _set_your_attribute to be called, you
  need to override __setattr__:
  
  def __setattr__(self, name, value):
  setter = getattr(self, '_set_' + name, None)
  if setter:
  setter(value)
  else:
  raise AttributeError, "no such attribute: " + `name`
 
 Hmmm... how would you change this to call the __setattr__ that was there
 before you overrode it, if a setter could not be found?

The same way you call any overridden method, by calling it on the class
you inherit it from.

So:

  class Foo:
  def __setattr__(self, name, value):
  # Whatever
  pass

  class Bar(Foo):
  def __setattr__(self, name, value):
  Foo.__setattr__(self, name, value)
  # More whatever

-- 
Martijn Pieters
| Software Engineer  mailto:[EMAIL PROTECTED]
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
-

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Dieter Maurer

Chris Withers writes:
  Martijn Pieters wrote:
  Now I think I know the answer to this one, but I'll ask just to be sure:
  
  class MyClass(Persistent Acquisition.Explicit):
  
   def _set_your_attribute (self,value):
   self._v_your_attribute = value
  
   def _get_your_attribute (self):
   return self._v_your_attribute
  
   your_attribute = ComputedAttribute(_get_your_attribute)
  
  with this class, your_attribute isn't going to play in Persistence,
  is it? (so I can update it lots without worrying about ZODB size
  growing... :-)
But, as I understand it, it is only updated in the thread
that did the update. Your next request may get a different
thread and see a different value.


Dieter

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Chris Withers

 Chris Withers writes:

   with this class, your_attribute isn't going to play in Persistence,
   is it? (so I can update it lots without worrying about ZODB size
   growing... :-)

 But, as I understand it, it is only updated in the thread
 that did the update. Your next request may get a different
 thread and see a different value.

Huh?

If I change self._v_your_attribute it's only going to get updated in one
thread?
That's a bit sucky :-S

Doesn't matter in this _particular_ case 'cos this var gets set at the start
of every request, but I'm a bit concerned about its general use...

any help is good help :-)

Chris


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Martijn Pieters

On Wed, Jan 10, 2001 at 11:09:43PM +0100, Dieter Maurer wrote:
 Chris Withers writes:
   Now I think I know the answer to this one, but I'll ask just to be sure:
   
   class MyClass(Persistent Acquisition.Explicit):
   
def _set_your_attribute (self,value):
  self._v_your_attribute = value
   
def _get_your_attribute (self):
return self._v_your_attribute
   
your_attribute = ComputedAttribute(_get_your_attribute)
   
   with this class, your_attribute isn't going to play in Persistence,
   is it? (so I can update it lots without worrying about ZODB size
   growing... :-)
 But, as I understand it, it is only updated in the thread
 that did the update. Your next request may get a different
 thread and see a different value.

Indeed, only persistent variables are shared between threads (and globals
of course, which creates a need for some kind of protection).

-- 
Martijn Pieters
| Software Engineer  mailto:[EMAIL PROTECTED]
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
-

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




Re: [Zope-dev] Re: ComputedAttribute

2001-01-10 Thread Martijn Pieters

On Wed, Jan 10, 2001 at 11:37:55PM -, Chris Withers wrote:
  Chris Withers writes:
 
with this class, your_attribute isn't going to play in Persistence,
is it? (so I can update it lots without worrying about ZODB size
growing... :-)
 
  But, as I understand it, it is only updated in the thread
  that did the update. Your next request may get a different
  thread and see a different value.
 
 Huh?
 
 If I change self._v_your_attribute it's only going to get updated in one
 thread?
 That's a bit sucky :-S
 
 Doesn't matter in this _particular_ case 'cos this var gets set at the start
 of every request, but I'm a bit concerned about its general use...
 
 any help is good help :-)

The whole threading spiel in Zope works because of ZODB persistence; any
thread accessing an object whose variables have been changed has to retry
with a fresh copy from the ODB.

But because _v_* variables don't get pickled, another thread will never
see them. If you want non-persisting (volatile) variables shared between
threads, you'll have to devise your own mechanism for assuring the
thread-safety of those variables.

-- 
Martijn Pieters
| Software Engineer  mailto:[EMAIL PROTECTED]
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
-

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )




[Zope-dev] Re: ComputedAttribute

2001-01-05 Thread Martijn Pieters

On Fri, Jan 05, 2001 at 12:22:32PM +, Chris Withers wrote:
 Martijn Pieters wrote:
  
  You could use ComputedAttribute for that:
  
  class MyClass(Acquisition.Explicit):
  # The following attribute is acquired transparently
  def _acquired_your_attribute(self):
  return self.aq_acquire('your_attribute')
  your_attribute =ComputedAttribute(_acquired_your_attribute, 1)
  
  # index_html isn't
  index_html = None
 
 That looks cool :-)
 
 Where's it documented? what does the 1 mean?

Erm. The ExtensionClass.stx documentation hints at a ComputedAttribute
class (but as an example of how you could use an ExtensionClass). The
current C implementation of ComputedAttribute is not, as far as I can see,
documented.

As for the '1', the CVS log has the following to say on that:

  Added second "level" argument for computed attributes.  This makes it
  easier to create computed attributes that work with acquisition.
  Normally, computed attributes are called with unwrapped objects. Passing
  a level of 1, causes computed attributes to be called with one level of
  wrapping.  Note that the innermost (single) level of wrapping typically
  reflects a containment context with any extra access contexts stripped
  off.

As I understand it, it makes self.aq_acquire possible.

See also:

  http://cvs.zope.org/Zope2/lib/Components/ExtensionClass/ComputedAttribute.c

-- 
Martijn Pieters
| Software Engineer  mailto:[EMAIL PROTECTED]
| Digital Creations  http://www.digicool.com/
| Creators of Zope   http://www.zope.org/
-

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )