Почему мы можем бросить 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
,