Должен ли я вернуть пустой символ вместо "Нет"?
У меня есть метод, который в настоящее время возвращает None
или dict
.
result,error = o.apply('grammar')
В настоящее время вызывающий абонент должен проверить наличие двух ключей, чтобы решить, какой объект был возвращен.
if 'imperial' in result:
# yay
elif 'west' in result:
# yahoo
else:
# something wrong?
Потому что результат может быть None
, я думаю о возврате пустой dict вместо этого, поэтому вызывающему нет необходимости проверять это. Как вы думаете?
Для сравнения, в модуле re
результат вызова match
может привести к None
.
p = re.compile('\w+')
m = p.match( 'whatever' )
Но в этом случае m
является экземпляром объекта. В моем случае я возвращаю dict, который должен быть пустым или иметь некоторые записи.
Ответы
Ответ 1
Да, я думаю, что возвращать пустой dict (или, если применимо, пустой список) предпочтительнее вернуть None, поскольку это позволяет избежать дополнительной проверки кода клиента.
EDIT:
Добавление образца кода для разработки:
def result_none(choice):
mydict = {}
if choice == 'a':
mydict['x'] = 100
mydict['y'] = 1000
return mydict
else:
return None
def result_dict(choice):
mydict = {}
if choice == 'a':
mydict['x'] = 100
mydict['y'] = 1000
return mydict
test_dict = result_dict('b')
if test_dict.get('x'):
print 'Got x'
else:
print 'No x'
test_none = result_none('b')
if test_none.get('x'):
print 'Got x'
else:
print 'No x'
В приведенном выше коде проверка test_none.get(x)
выдает AttributeError как
Метод result_none может возвращать None. Чтобы избежать этого, я должен добавить
дополнительную проверку и может переписать эту строку как:
if test_none is not None and test_none.get('x')
, который совсем не нужен
если метод возвращал пустой dict. Как показывает пример, проверка test_dict.get('x')
отлично работает, так как метод result_dict
возвращает пустой dict.
Ответ 2
Я не совсем уверен в контексте этого кода, но я бы сказал, что возвращение None предполагает, что была какая-то ошибка, и операция не может быть завершена. Возвращение пустого словаря предполагает успех, но ничто не соответствовало критериям добавления в словарь.
Я исхожу из совершенно другого фона (С++ Game Development), поэтому возьмите это за то, что стоит:
Однако, по соображениям производительности, было бы неплохо вернуть None и сохранить любые накладные расходы, хотя и минимальные, могут быть связаны с созданием пустого словаря. Я нахожу, что, как правило, если вы используете язык сценариев, вас не беспокоит производительность этого кода. Если бы вы были, вы, вероятно, не писали бы эту функцию на указанном языке, если это не требуется по какой-то неизбежной причине.
Ответ 3
После долгих размышлений, я думаю, что возвращение пустого dict
может быть более Pythonic. Хорошим правилом может быть всегда возврат пустого контейнера, если вы напишете функцию/метод, который возвращает контейнер. Несколько примеров такого поведения:
"".split() == []
filter(lambda a:False, [1,2]) == []
range(1, -1) == []
re.findall('x', '') = []
Напротив, если вы пытаетесь получить один объект, у вас нет выбора, кроме как вернуть None
, я полагаю. Поэтому я полагаю, что None
похож на пустой контейнер для одиночных объектов! Спасибо KennyTM за то, что он мне сказал: D
Ответ 4
Как говорили другие, пустой dict - это ложь, поэтому там нет проблем. Но идея возвращения пустого диктата оставляет мне неприятный вкус. Я не могу не чувствовать, что возвращение пустого дикта может скрыть ошибки, которые обнаружил бы возврат None
. Тем не менее, это просто чувство кишки.