int('10**2') raises ValueError: invalid literal for int() with base 10: '10**2' despite type(10**2) being <class 'int'>.
I take input n as n = input(), then I do int(n). When I input 10**2, I get ValueError: invalid literal for int() with base 10: '10**2'.
I'm guessing the issue is that 10**2 is not a literal - it has to be evaluated first, but I'm hesitant to do int(eval(n)) since n can be any string.
By contrast, float('1e2') despite being very similar, doesn't raise an error. I guess 1e2 is considered a literal...? and doesn't have to be evaluated?
My current workaround is to check whether the string contains '**' and if it does, handle it accordingly:
n = input()
if '**' in n:
base, exp, *a = n.split('**')
if a:
raise ValueError(f'This input, {n}, can't be interpreted as an integer')
n = int(base)**int(exp)
else:
n = int(n)
or to support expressions like 3**3**3:
n = input()
if '**' in n:
operands = input.split('**')
# '**' associates to the right
exp = 1
while operands:
base = int(operands.pop())
exp = base ** exp
n = exp
else:
n = int(n)