Skip to content

Instantly share code, notes, and snippets.

@cmsimike
Forked from durden/callable.py
Created April 11, 2012 07:39
Show Gist options
  • Save cmsimike/2357630 to your computer and use it in GitHub Desktop.
Save cmsimike/2357630 to your computer and use it in GitHub Desktop.
Clever way to use Python __call__ and __getattr__ to create web APIs that can map directly (dynamically) to actual API
class MyCallable(object):
def __init__(self, urlparts, callable):
self.urlparts = urlparts
self.callable = callable
def __call__(self, **kwargs):
print kwargs
print self.urlparts
def __getattr__(self, name):
# Return a callable object of this same type so that you can just keep
# chaining together calls and just adding that missing attribute to the
# arguments
return self.callable(self.urlparts + '/' + name, self.callable)
class Service(MyCallable):
pass
x = Service('https://api.example.com', MyCallable)
x.path.path1()
x.path.path1.path2(obj='thing')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment