From eafa0c01491924da2f11fae3c014f027cc6f653f Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" Date: Tue, 13 Jan 2026 23:23:22 +0900 Subject: [PATCH] Fix int rounding --- crates/vm/src/builtins/int.rs | 7 ++++--- extra_tests/snippets/builtin_int.py | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/vm/src/builtins/int.rs b/crates/vm/src/builtins/int.rs index 9b74b66e3..ad897ce0c 100644 --- a/crates/vm/src/builtins/int.rs +++ b/crates/vm/src/builtins/int.rs @@ -12,7 +12,8 @@ use crate::{ }, convert::{IntoPyException, ToPyObject, ToPyResult}, function::{ - ArgByteOrder, ArgIntoBool, FuncArgs, OptionalArg, PyArithmeticValue, PyComparisonValue, + ArgByteOrder, ArgIntoBool, FuncArgs, OptionalArg, OptionalOption, PyArithmeticValue, + PyComparisonValue, }, protocol::{PyNumberMethods, handle_bytes_to_int_err}, types::{AsNumber, Comparable, Constructor, Hashable, PyComparisonOp, Representable}, @@ -381,10 +382,10 @@ impl PyInt { #[pymethod] fn __round__( zelf: PyRef, - ndigits: OptionalArg, + ndigits: OptionalOption, vm: &VirtualMachine, ) -> PyResult> { - if let OptionalArg::Present(ndigits) = ndigits { + if let Some(ndigits) = ndigits.flatten() { let ndigits = ndigits.as_bigint(); // round(12345, -2) == 12300 // If precision >= 0, then any integer is already rounded correctly diff --git a/extra_tests/snippets/builtin_int.py b/extra_tests/snippets/builtin_int.py index bc3cd5fd9..aab24cbb4 100644 --- a/extra_tests/snippets/builtin_int.py +++ b/extra_tests/snippets/builtin_int.py @@ -318,8 +318,9 @@ assert isinstance((0).__round__(0), int) assert isinstance((1).__round__(0), int) assert (0).__round__(0) == 0 assert (1).__round__(0) == 1 -assert_raises(TypeError, lambda: (0).__round__(None)) -assert_raises(TypeError, lambda: (1).__round__(None)) +# Python 3.14+: __round__(None) is now allowed, same as __round__() +assert (0).__round__(None) == 0 +assert (1).__round__(None) == 1 assert_raises(TypeError, lambda: (0).__round__(0.0)) assert_raises(TypeError, lambda: (1).__round__(0.0))