def sort_choices(choices, reverse=False, v1_funcs=None, v2_funcs=None):
"""
:param choices: (('a', 'hello'), ('b', 'world'), )
:param reverse: True or False
:param v1_funcs: if string, ['lower', 'upper', ...]
:param v2_funcs: if string, ['lower', 'upper', ...]
:return: tuple, new_choices
"""
if v1_funcs is None:
v1_funcs = []
if v2_funcs is None:
v2_funcs = []
new_choices = []
for v1, v2 in sorted(choices, key=lambda item: item[0], reverse=reverse):
for name in v1_funcs:
func = getattr(v1, name, None)
v1 = func() if func else v1
for name in v2_funcs:
func = getattr(v2, name, None)
v2 = func() if func else v2
new_choices.append((v1, v2))
return tuple(new_choices)