[Baypiggies] A properties and obj.__dict__ question

Dirk Bergstrom krid at otisbean.com
Fri Sep 9 06:01:38 CEST 2011


I think that String.format will solve this for you, based on this 
example from the python docs:

 >>> class Point(object):
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)

Found here:

http://docs.python.org/library/string.html#formatexamples

On 09/08/2011 08:51 PM, Glen Jarvis wrote:
> I have a question that is hard to ask without involving code. I reduced my
> project down to a tiny test case (as follows).
>
> As you see, the following code will work and access the variables within the
> class successfully. However, it's a cheat, using the internal attributes
> instead of the properties (as properties don't show in __dict__).
>
> The objective is to have a large string with different fields. The fields
> happen to all be members of my class.  So, I could hard code things like
> this:
>
> message = """
>      Name: %s
>      Address: %s
>      %s, %s  %s
>   """ % {obj.name, obj.address, obj.city, obj.state, obj.postal_code}
>
> But, as each of the items are properties of the class, I'd like to be more
> dynamic, like this:
>
> message = """
>      Name: %(obj.name)s
>      Address: %(obj.address)s
>      %(obj.city)s, %(obj.state)s  %(obj.postal_code)s
>   """ % obj
>
> I can do this with normal attributes, like the following:
>
> message = """
>      Name: %(name)s
>      Address: %(address)s
>      %(city)s, %(state)s  %(postal_code)s
>   """ % obj.__dict__
>
> However, these attributes in my case are properties and don't show in the
> __dict__.
>
> Here's a runnable piece of code to demonstrate:
>
>
> =-=-=-=-=-=-=-  Start of Working Code -=-=-=-=-=-=-=-=-=-
> class Piggie(object):
>      def __init__(self):
>          """A demo for a BayPIGgies question"""
>          self._name = None
>          self._address = None
>
>      @property
>      def name(self):
>          return self._name
>
>      @name.setter
>      def name(self, value):
>          if isinstance(value, basestring):
>              value = value.strip()
>          self._name = value
>
>      @property
>      def address(self):
>          return self._address
>
>      @address.setter
>      def address(self, value):
>          if isinstance(value, basestring):
>              value = value.strip()
>          self._address = value
>
>      def __unicode__(self):
>          if self.name is None:
>              return u"Nameless Person"
>          else:
>              return self.name
>      __str__ = __unicode__
>
>
> f = Piggie()
> f.name = 'Glen'
>
>
> message = """
>      Obviously, this is silly for only two fields like this.
>
>      But, it's a very reduced test case to demo a problem from a
>      much larger project.
>
>      Name: %(_name)s
>      Address:  %(_address)s
>   """ %  f.__dict__
>
> print message
> =-=-=-=-=-=-=-  Start of Working Code -=-=-=-=-=-=-=-=-=-
>
>
> This works, as the output below shows. However, only by accessing the
> internal attributes of the class directly, not using the property accessors.
> How can I do something like this, but with property accessors. Something
> like dir(f) or f.__property_dict__ that just has the properties.
>
> Run:
>
>
>      Obviously, this is silly for only two fields like this.
>
>      But, it's a very reduced test case to demo a problem from a
>      much larger project.
>
>      Name: Glen
>      Address:  None
>
>
>
> Run with the properties used:
>
> Traceback (most recent call last):
>    File "x.py", line 48, in<module>
>      """ %  f.__dict__
> KeyError: 'name'
>
>
> Thanks, for letting me share :)
>
>
>
> Glen
>
>
>
> _______________________________________________
> Baypiggies mailing list
> Baypiggies at python.org
> To change your subscription options or unsubscribe:
> http://mail.python.org/mailman/listinfo/baypiggies


-- 
        --------------------------------------
       Dirk Bergstrom           krid at otisbean.com
              http://otisbean.com/


More information about the Baypiggies mailing list