我想要一个可以确定某个输入是否属于以下类别之一的函数
这是我目前拥有的功能,但挑战在于,如果输入是一个字符串,我希望该函数仍然可以确定它是日期,整数,双精度,布尔值,还是串
def text_type_determine(i):
if type(i) == int:
return 'integer'
elif type(i) == float:
return 'double'
elif type(i) == bool:
return 'boolean'
elif type(i) == str:
return 'string'
例如,我希望以下输入产生相关结果:
答案 0 :(得分:0)
您可以像这样使用eval
:
def text_type_determine(i):
i = eval(i)
if type(i) == int:
return 'integer'
elif type(i) == float:
return 'double'
elif type(i) == bool:
return 'boolean'
elif type(i) == str:
return 'string'
所以这个:
print(text_type_determine("12.3"))
输出:
double
答案 1 :(得分:0)
您可以使用try / catch指令测试转换为(仅用于int ):
def isInt(s):
try:
int(s)
return True
except ValueError:
return False
def text_type_determine(s):
if isInt(s):
return 'integer'
答案 2 :(得分:0)
您可以尝试按逻辑顺序将每个项目转换为各种类型并处理每个案例:
from datetime import datetime
def text_type_determine(i):
# datetime is the most specific, so start with it
try:
datetime.strftime(i, '%Y-%m-%d')
return 'date'
except:
# Next try int before float since float(`4`) will work
try:
int(i)
return 'integer'
except:
try:
# Python uses float not double, but I think it should do
float(i)
return 'double'
except:
pass
# Finally if all our number cases fail, check if
# we have a boolean, otherwise it's just a string
if i in ['true', 'false']:
return 'boolean'
return 'string'
这当然假设日期只是YYYY-MM-DD
格式,并且所有布尔值都是true
或false
。添加更多选项应该非常简单。
答案 3 :(得分:0)
我不知道你的日期是什么意思,因为它没有出现在你自己的代码中,但如果你想评估潜在的整数,浮点数是字符串等......你可以使用ast.literal_eval
from ast import literal_eval
def text_type_determine(i):
types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string'}
try:
return types.get(type(literal_eval(i)))
except ValueError:
return types.get(type(i))
如果您想测试对象是否可以解析为日期,您可以使用dateutil之类的内容:
from dateutil import parser
from datetime import datetime
def text_type_determine(i):
types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string', datetime: "date"}
for tpe in [literal_eval, parser.parse]:
try:
return types.get(type(tpe(i)))
except (AttributeError, ValueError):
pass
return types.get(type(i))
哪个会给你:
In [17]: text_type_determine(1)
Out[17]: 'integer'
In [18]: text_type_determine(datetime.now())
Out[18]: 'date'
In [19]: text_type_determine("2016-03-19")
Out[19]: 'date'
In [20]: text_type_determine("2016")
Out[20]: 'integer'
In [21]: text_type_determine("2016.23")
Out[21]: 'double'
您可能希望重新排列检查顺序,因为dateutil.parser
可能会给您一些意外的输出。如果您的日期总是以相同的顺序,那么只需使用datetime.strptime
进行解析,如果不是用strptime尝试每个可能的日期变化,那么dateutil将是一个更好的解决方案。