Почему python, созданный как str (None), возвращает "None" вместо пустой строки?

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

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

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

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

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

Ответ 1

Проверка того, содержит ли строка символы в нем, проверяя 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', то я считаю, что это необходимо для трехзначной логики. 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'

Теперь, если вы действительно хотите получить авторитетный ответ, спросите Guido.


Если вы действительно хотите, чтобы str(None) дал вам '', прочитайте этот другой вопрос: Python: самый идиоматический способ конвертировать None в пустую строку?

Ответ 2

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

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

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