Hi I am trying to print the data type of a user input and produce a table like following:
ABCDEFGH = String, 1.09 = float, 0 = int, true = bool
input() will always return a string. If you want to see if it is possible to be converted to an integer, you should do:
try:
int_user_var = int(user_var)
except ValueError:
pass # this is not an integer
You could write a function like this:
def try_convert(s):
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
try:
return bool(s)
except ValueError:
return s
However, as mentioned in the other answers, using ast.literal_eval
would be a more concise solution.
The problem here is that any input is taken a 'string'. So we need to treat 'string' as a special case, and keep it separate from everything else.
x = input("Enter something: ")
try:
if type(eval(x)) == float:
print(x, " is floating point number")
elif type(eval(x)) == int:
print(x, " is interger number")
elif type(eval(x)) == bool:
print(x, " is a boolean")
except:
print("That is a string")
Here the input is first evaluated. If it's anything other than a string, the eval function shall show the type. If it's a string, it is considered as an "error", and the error message is given as "That is a string".
Input will always return a string. You need to evaluate the string to get some Python value:
>>> type(eval(raw_input()))
23423
<type 'int'>
>>> type(eval(raw_input()))
"asdas"
<type 'str'>
>>> type(eval(raw_input()))
1.09
<type 'float'>
>>> type(eval(raw_input()))
True
<type 'bool'>
If you want safety (here user can execute arbitrary code), you should use ast.literal_eval
:
>>> import ast
>>> type(ast.literal_eval(raw_input()))
342
<type 'int'>
>>> type(ast.literal_eval(raw_input()))
"asd"
<type 'str'>
from ast import literal_eval
def get_type(input_data):
try:
return type(literal_eval(input_data))
except (ValueError, SyntaxError):
# A string, so return str
return str
print(get_type("1")) # <class 'int'>
print(get_type("1.2354")) # <class 'float'>
print(get_type("True")) # <class 'bool'>
print(get_type("abcd")) # <class 'str'>