On Sat, Sep 26, 2009 at 1:44 PM, Chris <[email protected]> wrote:
>
> Hi,
> Looking for a little advice on how to solve this.
> Here is the problem:  I store an object in environ and this object has
> a special __getattr__ which always returns an object.  However, this
> object is *not* callable.
>
> On a redirect, WebOb iterates over environ checking for __html__ via
> hasattr (which calls __getattr__).  My object in the environ returns
> an object for __html__, but again it is not callable, so an Exception
> is thrown.
>
> The object store in environ is a thirdparty MongoDB database instance.
>
> So, is this a bug with WebOb, that is, should webob check that
> __html__ is  callable?
> # in webob html_escape
> html = getattr(s, '__html__', None)
> if html and callable(html):
>   return html()
>
> Or should I fix this in the PyMongo Database class?  Either way I have
> to change or subclass a 3rd party lib.
>
> I'm leaning towards fixing this in webob, because I have other objects
> that have special __getattr__ methods.  Any advice is appreciated.

.__html__() is a convention used for smart escaping.  String-like
objects should return self to indicate that they're preformatted and
should not be escaped further. Other objects can define .__html__() to
indicate their preferred HTML format.  This convention is used by
literal() in webhelpers.html, and by the render functions that ship
with Pylons (render_mako, etc).  I didn't know WebOb itself also did
it.

Previous implementations of smart escaping (Quixote, Genshi) required
preformatted objects to be a certain class.  This made it impossible
for third-party libraries to mark their objects preformatted, because
they'd have to depend on the package with the special class, which
they'd refuse to do or wouldn't know about.  Worse, they would be tied
to one specific template library rather than supporting all of them.
The .__html__ strategy allows third-party packages to define their own
string subclass with an .__html__ method rather than having to depend
on a special class in a foreign package.

So in this case, is the object yours or somebody else's?  If it's
yours, define an .__html__ method that returns unicode.  If it's
somebody else's, well, what does it think .__html__ is supposed to be?
 Or is it just returning something for all .__getattr__ calls
regardless of value?

callable() has been deprecated by Guido and is not in Python 3.  He
says rather than using it, just call the d**n thing and see if you get
an exception or not.

-- 
Mike Orr <[email protected]>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to