Created
October 12, 2015 19:07
-
-
Save spectras/15ead9dbbc019d1cf84c to your computer and use it in GitHub Desktop.
Template function pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# See http://stackoverflow.com/questions/32885753/ | |
class BaseRequestProcessor(object): | |
# Template class. | |
# The request processor gets some query, parses it into a request, executes it | |
# then saves the result and writes some logging info. | |
def get_query(self): | |
raise NotImplementedError() | |
def make_request(self, query): | |
raise NotImplementedError() | |
def make_api_call(self, request): | |
raise NotImplementedError() | |
def process_response(self, response): | |
raise NotImplementedError() | |
def populate_database(self, details): | |
raise NotImplementedError() | |
def log_status(self, status): | |
pass | |
def __call__(self): | |
try: | |
query = self.get_query() | |
request = self.make_request(query) | |
response = self.make_api_call(request) | |
details = self.process_response(response) | |
status = self.populate_database(details) | |
except Exception: | |
import traceback | |
status = 'Error, traceback follows:\n' + traceback.format_exc() | |
self.log_status(status) | |
class ConsoleRequest(BaseRequestProcessor): | |
# Implements handling request directly from the console | |
def get_query(self): | |
return input('Your query: ') | |
def populate_database(self, details): | |
print(details) | |
return 'Success, I could populate user\'s brain' | |
def log_status(self, status): | |
print(status) | |
class StringQuery(BaseRequestProcessor): | |
# Converts request to a list of string / response to a string | |
def make_request(self, query): | |
return query.split(' ') | |
def process_response(self, response): | |
return 'The result was: {}'.format(response) | |
class MultiplierProcessor(BaseRequestProcessor): | |
# Given a list of arguments, multiply them | |
def make_api_call(self, request): | |
result = 1 | |
for argument in request: | |
result *= int(argument) | |
return result | |
class MyDemoProcessor(ConsoleRequest, StringQuery, MultiplierProcessor, BaseRequestProcessor): | |
pass | |
if __name__ == '__main__': | |
processor = MyDemoProcessor() | |
while True: | |
processor() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment