[Python-ideas] int('0x3241fca1')

Terry Reedy tjreedy at udel.edu
Fri Feb 7 02:00:13 CET 2014


On 2/6/2014 5:04 PM, MRAB wrote:
> On 2014-02-06 21:41, Terry Reedy wrote:
>> On 2/6/2014 5:24 AM, Ram Rachum wrote:
>>> What do you think about letting the `int` constructor automatically
>>> understand the number type without specifying base if given a prefix, so
>>> int('0x3414fa') would immediately work without specifying a base of 16?
>>
>> In addition to int(string, 0):
>>
>>   >>> number = '0x3414fa'
>>   >>> eval(number)
>> 3413242
>>
> The disadvantage is that it'll evaluate (run) anything, so it's unsafe
> in the general case.

To evaluate any number expression, but only number expressions, but be 
safe against untrusted input, one should use ast.literal_eval, and then 
test that the result is a number (either with numbers.Number or adding 0

import ast
from numbers import Number

def get_number(prompt = "Input a number: "):
     s = input(prompt)
     try:
         x = ast.literal_eval(s)  # raise ValueError on failure
         if not isinstance(x, Number):
             raise ValueError()
     except ValueError:
         raise ValueError("'{}' is not a Python number 
literal".format(s)) from None
     return x


-- 
Terry Jan Reedy



More information about the Python-ideas mailing list