py/objfloat: Allow float() to parse anything with the buffer protocol.

This generalises and simplifies the code and follows CPython behaviour.
This commit is contained in:
Damien George 2017-11-21 15:01:38 +11:00
parent 8667a5f053
commit a07fc5b640
2 changed files with 10 additions and 6 deletions

View File

@ -137,12 +137,11 @@ STATIC mp_obj_t float_make_new(const mp_obj_type_t *type_in, size_t n_args, size
return mp_obj_new_float(0);
case 1:
default:
if (MP_OBJ_IS_STR(args[0])) {
// a string, parse it
size_t l;
const char *s = mp_obj_str_get_data(args[0], &l);
return mp_parse_num_decimal(s, l, false, false, NULL);
default: {
mp_buffer_info_t bufinfo;
if (mp_get_buffer(args[0], &bufinfo, MP_BUFFER_READ)) {
// a textual representation, parse it
return mp_parse_num_decimal(bufinfo.buf, bufinfo.len, false, false, NULL);
} else if (mp_obj_is_float(args[0])) {
// a float, just return it
return args[0];
@ -151,6 +150,7 @@ STATIC mp_obj_t float_make_new(const mp_obj_type_t *type_in, size_t n_args, size
return mp_obj_new_float(mp_obj_get_float(args[0]));
}
}
}
}
STATIC mp_obj_t float_unary_op(mp_unary_op_t op, mp_obj_t o_in) {

View File

@ -36,6 +36,10 @@ try:
except ValueError:
print("ValueError")
# construct from something with the buffer protocol
print(float(b"1.2"))
print(float(bytearray(b"3.4")))
# unary operators
print(bool(0.0))
print(bool(1.2))