Пока поле является просматриваемым, Вам не нужно подтвердить поле. Пока Вы делаете некоторую проверку формы, чтобы быть уверенными, что это находится, по крайней мере, в допустимом формате для адреса электронной почты, позволяет пользователю управлять остальной частью проблем.
То, что вы почти наверняка ищете, - это использовать параметр key = для sorted (), который предоставляет функцию, которая возвращает произвольный ключ сортировки для каждого элемента. Эта функция может проверять тип своего аргумента и выполнять различные действия. Например:
import types
class obj(object):
def __init__(self, arg):
self.name = arg
def extract_name(obj):
if type(obj) is types.DictType:
return obj['name']
else:
return obj.__dict__['name']
d = { 'name': 'Jill'}
print sorted([obj('Jack'), d], key=extract_name)
Дополнительную информацию можно найти в Python wiki
Предложение RichieHindle об использовании isinstance является хорошим. И пока я занимался этим, я подумал, что было бы неплохо поддерживать произвольные имена элементов вместо жесткого кодирования 'name':
def extract_elem_v2(elem_name):
def key_extractor(obj):
dct = obj if isinstance(obj, dict) else obj.__dict__
return dct[elem_name]
return key_extractor
Что вы можете использовать так:
print sorted(list_of_stuff, key=extract_elem_v2('name'))
sort_me.sort(key=attr_or_itemgetter('name'))
Where attr_or_itemgetter()
:
class attr_or_itemgetter(object):
def __init__(self, name):
self.name = name
def __call__(self, obj):
try: return getattr(obj, name)
except AttributeError:
return obj[name]
NOTE: It intentionally doesn't check for dictionary type, therefore attr_or_itemgetter('items')
applied to a dictionary will return dict.items
method.