Add float.from_number classmethod (#7107)

This commit is contained in:
Lee Dogeon
2026-02-13 20:47:12 +09:00
committed by GitHub
parent 9c72e32874
commit 4b1ff4b003
2 changed files with 15 additions and 2 deletions

View File

@@ -287,7 +287,6 @@ class GeneralFloatCases(unittest.TestCase):
self.assertEqual(actual, expected_value)
self.assertIs(type(actual), expected_type)
@unittest.expectedFailure # TODO: RUSTPYTHON; AttributeError: type object 'float' has no attribute 'from_number'
def test_from_number(self, cls=float):
def eq(actual, expected):
self.assertEqual(actual, expected)
@@ -312,7 +311,6 @@ class GeneralFloatCases(unittest.TestCase):
self.assertRaises(TypeError, cls.from_number, {})
self.assertRaises(TypeError, cls.from_number)
@unittest.expectedFailure # TODO: RUSTPYTHON; AttributeError: type object 'FloatSubclass' has no attribute 'from_number'
def test_from_number_subclass(self):
self.test_from_number(FloatSubclass)

View File

@@ -324,6 +324,21 @@ impl PyFloat {
})
}
#[pyclassmethod]
fn from_number(cls: PyTypeRef, number: PyObjectRef, vm: &VirtualMachine) -> PyResult {
if number.class().is(vm.ctx.types.float_type) && cls.is(vm.ctx.types.float_type) {
return Ok(number);
}
let value = number.try_float(vm)?.to_f64();
let result = vm.ctx.new_float(value);
if cls.is(vm.ctx.types.float_type) {
Ok(result.into())
} else {
PyType::call(&cls, vec![result.into()].into(), vm)
}
}
#[pyclassmethod]
fn fromhex(cls: PyTypeRef, string: PyStrRef, vm: &VirtualMachine) -> PyResult {
let result = crate::literal::float::from_hex(string.as_str().trim())