вернуть кортеж; в вашей вызывающей функции вы можете использовать неявную распаковку кортежей
top_limit, bottom_limit, another_value = the_query_function()
А внутри вызываемой функции просто:
return top_limit, bottom_limit, another_value
Довольно чисто и легко, без шаблона
Или вы можете использовать класс, как вы сказали, на самом деле зависит от сложности работы под рукой
РЕДАКТИРОВАТЬ: использование задания для однократного вызова задача не плохой стиль, если код выигрывает от использования класса