2013-07-17 5 views
10

На некоторых других языках, я знаю, интуитивный результат преобразования null в строку должен быть пустой строкой. Почему Python предназначен для того, чтобы «None» был своего рода специальной строкой? И это может привести к дополнительной работе при проверке возвращаемого значения функцииПочему python, созданный как str (None), возвращает «None» вместо пустой строки?

result = foo() # foo will return None if failure 
if result is not None and len(str(result)) > 0: 
    # ... deal with result 
    pass 

, если строка (None) возвращает пустую строку, код может быть короче:

if len(str(result)) > 0: 
    # ... deal with result 
    pass 

Похоже, Python пытается быть многословным, чтобы сделать файлы журналов более понятными?

+5

Это не отвечает на ваш вопрос, но это обойти вашу проблему. 'bool (None) == False', но _also_' bool ('') == False'. Поэтому на самом деле вам просто нужно проверить «если результат: # pass», поскольку «' »и« None »оба оценивают False. Я попытаюсь найти некоторые аргументы в пользу выбора 'str (None) == 'None'', но я не думаю, что это повлияет на ваш код, если вы просто проверяете, была ли возвращена правильная строка. – pswaminathan

+0

Это только дополнительная работа, потому что условное выражение, которое вы определили, неудобно: «обрабатывать результат только если это не None или его строковое представление не пусто».Используйте более обычный способ проверки (например, предложенный @pswaminathan), и проблема уходит. – vanza

+0

Если 'foo' возвращает' None' в случае отказа, вам нужно проверить 'None'. В вашем примере все, чье строковое представление пуст, по-видимому, обрабатывается так же, как «Нет», но нет особых причин, почему это должно быть поведение по умолчанию. Вопрос в том, почему вы используете «длину str (x)» как диагностику для чего-либо? – BrenBarn

ответ

11

Проверка наличия в строке символов с помощью проверки len(str(result)) определенно не является pythonic (см. http://www.python.org/dev/peps/pep-0008/).

result = foo() # foo will return None if failure 
if result: 
    # deal with result. 
    pass 

None и '' принуждать к булевой False.


Если вы действительно спрашиваете, почему str(None) делает возвращение 'None', то я считаю, что это потому, что это необходимо для three-valued logic. True, False и None могут использоваться вместе, чтобы определить, является ли логическое выражение True, False или не может быть определено. Функция идентификации является самой простой для представления.

True -> 'True' 
False -> 'False' 
None -> 'None' 

Следующая было бы очень странно, если бы str(None) был '':

>>> or_statement = lambda a, b: "%s or %s = %s" % (a, b, a or b) 
>>> or_statement(True, False) 
'True or False = True' 
>>> or_statement(True, None) 
'True or None = True' 
>>> or_statement(None, None) 
'None or None = None' 

Теперь, если вы действительно хотите для авторитетного ответа, спросите Гвидо.


Если вы действительно хотите иметь str(None) дать вам '' пожалуйста, прочитайте этот другой вопрос: Python: most idiomatic way to convert None to empty string?

+2

Если вам нужна полная реализация трехзначной логики, которая использует True, False и None, тогда проверьте модуль [Python Tribool] (http://www.grantjenks.com/docs/tribool/) – GrantJ

+0

Расширение на @GrantJ ' s, 'or_statement()', как написано, не является хорошим примером tri-state, потому что он имеет другой результат в зависимости от порядка аргумента: 'or_statement (None, False)' должен быть неразрешимым, т.е. 'None', но возвращает' False' потому что 'или' является простым оператором быстрого доступа, который проваливается после булевого принуждения' None' к 'False'. – Metaxis

4

В основном, потому что пустая строка не является представлением None. None - это особое значение, отличное от пустой строки или чего-то еще. Как описано в the docs, str предполагается

Возвращает строку, содержащую славно для печати представление объекта.

В принципе, str должен возвращать что-то пригодное для печати и удобочитаемое человеком. Пустая строка не будет читаемым представлением None.

+1

По этой логике 'str (None)' и 'str ('None')' также не должны быть равными. –

+0

@Mark Как это говорит о том, что 'str' должно иметь какое-либо отношение к равенству? Это просто ценность, которую вы можете распечатать. Используйте 'repr', если вам нужно различать тип/значение как строку. – DanielB

+0

@ DanielB, я уже выразил это мнение в комментарии к самому вопросу. –

Смежные вопросы