Implement logic on object.attribute and object.attribute()

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Nov 24 08:45:07 EST 2013


On Sun, 24 Nov 2013 05:04:16 -0800, Devin Jeanpierre wrote:

> On Sun, Nov 24, 2013 at 4:52 AM, Marc Aymerich <glicerinu at gmail.com>
> wrote:
>> Hi,
>> I'm playing with python internals to make objects behave like this:
>>
>> if I access to "object.attribute" I want to return the result of an
>> HTTP GET request. However if i call "object.attribute()" I want an HTTP
>> POST request to be executed.
> 
> Uh oh. What you want is impossible. You cannot call an attribute without
> first accessing it. :(

Not quite impossible. All you need is an object that behaves like a 
string, except it has a __call__ method. Here's a sketch of a solution, 
completely untested.


class CallableString(str):
    # Like a string, but callable.
    def function(self):
        raise NotImplementedError(
                "this must be overridden on the instance"
                )
    def __call__(self):
        return self.function()


class Magic_HTTP_Thing:
    @property
    def attribute(self):
        result = CallableStr(self.do_get())
        result.function = lambda: self.do_put()
    def do_get(self):
        # Do a HTTP GET request.
        return "Get stuff"
    def do_put(self):
        # Do a HTTP PUT request.
        return "Put stuff"


Possible or not, it doesn't seem like a reasonable API to me.


-- 
Steven



More information about the Python-list mailing list