Почему мы можем бросить bool на str?

Мы знаем как bool() действует на различные объекты Python, такие как str, int, list,

Это вопрос об обратном.

Вы можете использовать bool для int как

>>> int(True)
1
>>> int(False)
0

что я думаю, что-то вроде, но с строкой мы получаем

>>> str(False)
'False'
>>> str(True)
'True'

что я не понимаю, так как во-первых, это, кажется, подразумевает некоторую связь между False а также 'False', который только кажется актуальным на уровне кода. Если то, что написано в коде, должно обрабатываться таким образом, как это работает...

>>> str(not True)
'False'

Во-вторых, не очевидно, что это для последовательности, так как

>>> bool(str(False))
True

Мой вопрос... есть ли причина, по которой нам разрешено bool в str в этом случае? list например не позволит это...

>>> list()
[]
>>> bool()
False
>>> bool(list())
False
>>> list(bool())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not iterable

4 ответа

Решение

Для отладки. Если вы не можете привести вещь к строке, вы не сможете ее распечатать. Если вы хотите напечатать структуру данных для отладки, вы должны иметь возможность привести каждый элемент к строке. Это то что str задокументировано, чтобы сделать...

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


Если то, что написано в коде, должно обрабатываться таким образом, как это работает...

>>> str(not True)
'False'

not True решает в False который затем передается str, Это похоже на то, как с foo(1 + 1)foo получает 2.


Во-вторых, не очевидно, что это для последовательности, так как

>>> bool(str(False))
True

Кастинг не гарантирован в оба конца. Примеры int(float(2.34)) или же int(unichr(97)),

Существует важное различие между преобразованием чего-либо в строку для людей, вот что str делает, и преобразовывает что-то в строку для сортировки, которая должна туда и обратно. Есть специализированные пакеты, такие как marshal или же json для сортировки.

Но кастинг это неправильный способ думать bool а также str в Python. Как указано выше, str возвращает печатное представление, а не машиночитаемое. bool для того, чтобы спросить "что такое правдивость этого выражения"? Из документов...

x преобразуется с использованием стандартной процедуры проверки правды.

"True" а также "False" оба правда. Если они добавили специальный случай только для bool это было бы очень противоречиво.

str() а также bool() это не "броски", а конструкторы (объекты типа). призвание str(x) для любого значения x построит новый str объект с его значением, инициализированным (как-то) из x, Не существует подразумеваемой связи между двумя объектами; str(x) может вернуть что-нибудь, пока это str объект.

По сути: перестаньте думать о Python как о "приведении", как о других языках, к которым вы привыкли. Конструкторы - это просто еще один вид вызова, и общее правило заключается в том, чтобы каждый тип делал что-то разумное с аргументом (аргументами), передаваемым конструктору. В случае str()он делегирует __str__ специальный метод, если присутствует, что означает, что bool объекты возвращают строки 'True' а также 'False' потому что это то, что bool типа решил сделать.

Ну в чем проблема str(True) являющийся 'True'? Это вполне ожидаемое.

Теперь, если вы преобразуете логическое значение в целое, очевидно, что результатом должно быть число.

И, естественно, not True оценивает False, То есть str(False), затем: 'False',

О bool() функция, она должна вернуться True для всего, что не пусто, ноль, нет или ложь.

Так что любая строка, которая не '' подходит для этого и возвращает True, Подробнее: https://docs.python.org/3/library/stdtypes.html

Существует очень ограниченный набор вещей, рассматриваемых False в Python:

  • Никто
  • Ложь
  • ноль любого числового типа, например, 0, 0L, 0.0, 0j.
  • любая пустая последовательность, например, '', (), [].
  • любое пустое отображение, например, {}.
  • экземпляры пользовательских классов, если класс определяет ненулевой() или метод len(), когда этот метод возвращает целочисленный ноль или значение bool False

Так что если вы делаете bool(something) он вернется только False для этих предметов. Все остальное в Python есть True включая строковые представления о ложных вещах: '0''False', 'None' и т.д., потому что сама строка True,

Другие вопросы по тегам