Почему библиотеки Boost возвращают вещи, “конвертируемые 'bool'” вместо того, чтобы просто возвратить 'bool's?

Да, вы можете использовать .loc и условие, чтобы нарезать df, а затем вернуть индекс, используя .iloc.

import pandas as pd
df = pd.DataFrame({'time':pd.date_range(start='2018-01-01 00:00:00',end='2018-12-31 00:00:00', freq='H')}, index=None).reset_index(drop=True)

# then use conditions and .iloc to get the first instance
df.loc[df['time']>'2018-10-30 01:00:00'].iloc[[0,]].index[0]

# if you specify a coarser condition, for instance without time,
# it will also return the first instance
df.loc[df['time']>'2018-10-30'].iloc[[0,]].index[0]
6
задан Head Geek 4 November 2008 в 19:59
поделиться

3 ответа

“конвертируемый к bool” просто означает что-либо, что может значительно использоваться в булевом контексте (например, в if условие). Это имеет смысл в неявных преобразованиях. Вообразите объект, который Вы хотите использовать в булевом контексте, например. std::fstream:

ifstream ifs("filename");
while (ifs >> token)
    cout "token " << token << " read." << endl;

Здесь, ifs конвертируемо к булевской переменной. Ну, на самом деле это не. Скорее это конвертируемо к чему-то, что, в свою очередь, конвертируемо к bool. Это должно предотвратить такие операторы:

int b = ifs;

Обоснование состоит в том, что такой оператор по всей вероятности не предназначается, и компилятор должен поэтому предотвратить его. Путем возврата “кабриолета bool”, а не a bool, это достигается, потому что два пользовательских неявных преобразования не могут быть объединены в цепочку в одном выражении.

В этом контексте Вы могли бы хотеть искать безопасную bool идиому. Chris уже сослался на одну возможную реализацию, с помощью void* как тип возврата. Обычно, this указатель затем используется для представления true. Это - то, что привыкает STL. Однако это, к сожалению, все еще испорчено. Несколько альтернатив были предложены (аккуратно обернутый в статье, которую я связал выше), и насколько я знаю, были также включены в C++ 0x для рассмотрения. Я не знаю о текущем статусе этих предложений, все же.

25
ответ дан 8 December 2019 в 02:30
поделиться

bools promotable к ints и может участвовать в арифметических операциях. Это - часто не желаемый результат, когда значение должно просто использоваться для тестирования истины.

convertible-to-bool обычно что-то как a void*, где нулевой указатель является ложью, и что-либо еще верно, и все же не может использоваться для арифметических операций.

11
ответ дан 8 December 2019 в 02:30
поделиться

Возможно, для производительности? В C/C++ можно сделать, если оператор на числах (0 ложь, что-либо еще верно). Преобразование в строгий bool является дополнительной операцией, которая во многих случаях не требовалась бы.

Я на самом деле не использовал повышение, таким образом, это - просто предположение, но оно походит на разумный мне.

0
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: