int-on-sliced-str (FURB166)#
Derived from the refurb linter.
Fix is always available.
This rule is unstable and in preview. The --preview flag is required for use.
What it does#
Checks for uses of int with an explicit base in which a string expression
is stripped of its leading prefix (i.e., 0b, 0o, or 0x).
Why is this bad?#
Given an integer string with a prefix (e.g., 0xABC), Python can automatically
determine the base of the integer by the prefix without needing to specify
it explicitly.
Instead of int(num[2:], 16), use int(num, 0), which will automatically
deduce the base based on the prefix.
Example#
num = "0xABC"
if num.startswith("0b"):
i = int(num[2:], 2)
elif num.startswith("0o"):
i = int(num[2:], 8)
elif num.startswith("0x"):
i = int(num[2:], 16)
print(i)
Use instead:
Fix safety#
The rule's fix is marked as unsafe, as Ruff cannot guarantee that the
argument to int will remain valid when its base is included in the
function call.