在Python中查找最适合字符串的类型
我有一个字符串变量,我想找出哪个内置类型最能描述这个变量的值。例如:在Python中查找最适合字符串的类型,python,types,casting,Python,Types,Casting,我有一个字符串变量,我想找出哪个内置类型最能描述这个变量的值。例如:“3.14”->float“2015-10-23”->日期;else->string 现在我只是简单地将尝试和例外级联,这有点难看: try: float(value) return "This is a float" except ValueError: try: dateutil.parser.parse(value) return "Date" except
“3.14”
->float<代码>“2015-10-23”->日期;else->string
现在我只是简单地将尝试和例外级联,这有点难看:
try:
float(value)
return "This is a float"
except ValueError:
try:
dateutil.parser.parse(value)
return "Date"
except ValueError:
pass
return "This is a string"
有什么“pythonic”方法可以做到这一点吗?您可以循环解析尝试:
def what_is(value):
for attempt, type_ in ((float, "This is a float"),
(dateutil.parser.parse, "Date")):
try:
_ = attempt(value)
except ValueError:
continue
return type_
return "This is a string"
这很容易扩展到更多的解析器,并且始终返回到最后的字符串。您可以循环解析尝试:
def what_is(value):
for attempt, type_ in ((float, "This is a float"),
(dateutil.parser.parse, "Date")):
try:
_ = attempt(value)
except ValueError:
continue
return type_
return "This is a string"
这很容易扩展到更多的解析器,并且始终返回到最后的字符串。您可以循环解析尝试:
def what_is(value):
for attempt, type_ in ((float, "This is a float"),
(dateutil.parser.parse, "Date")):
try:
_ = attempt(value)
except ValueError:
continue
return type_
return "This is a string"
这很容易扩展到更多的解析器,并且始终返回到最后的字符串。您可以循环解析尝试:
def what_is(value):
for attempt, type_ in ((float, "This is a float"),
(dateutil.parser.parse, "Date")):
try:
_ = attempt(value)
except ValueError:
continue
return type_
return "This is a string"
这很容易扩展到更多的解析器,并且总是回到最后的字符串。保留一个强制转换/解析函数的
列表,并逐个尝试:
>>> value = '1.2'
>>> answer = None
>>> casts = [int, float, dateutil.parser.parse]
>>> for c in casts:
... try:
... answer = c(value)
... except ValueError:
... pass
... else:
... break
...
>>> answer
1.2
添加与正在检查的类型相关的任何异常类型。保留强制转换/解析函数的列表,并逐一尝试:
>>> value = '1.2'
>>> answer = None
>>> casts = [int, float, dateutil.parser.parse]
>>> for c in casts:
... try:
... answer = c(value)
... except ValueError:
... pass
... else:
... break
...
>>> answer
1.2
添加与正在检查的类型相关的任何异常类型。保留强制转换/解析函数的列表,并逐一尝试:
>>> value = '1.2'
>>> answer = None
>>> casts = [int, float, dateutil.parser.parse]
>>> for c in casts:
... try:
... answer = c(value)
... except ValueError:
... pass
... else:
... break
...
>>> answer
1.2
添加与正在检查的类型相关的任何异常类型。保留强制转换/解析函数的列表,并逐一尝试:
>>> value = '1.2'
>>> answer = None
>>> casts = [int, float, dateutil.parser.parse]
>>> for c in casts:
... try:
... answer = c(value)
... except ValueError:
... pass
... else:
... break
...
>>> answer
1.2
添加与正在检查的类型相关的任何异常类型。我的解决方案不同。假设我想找到最合适的类型,并且我可以让python决定顺序,我可以简单地使用eval
:
value = '1.2'
try:
result = eval(value)
except ValueError:
result = value
type(result)
我的解决方案不同。假设我想找到最合适的类型,并且我可以让python决定顺序,我可以简单地使用eval
:
value = '1.2'
try:
result = eval(value)
except ValueError:
result = value
type(result)
我的解决方案不同。假设我想找到最合适的类型,并且我可以让python决定顺序,我可以简单地使用eval
:
value = '1.2'
try:
result = eval(value)
except ValueError:
result = value
type(result)
我的解决方案不同。假设我想找到最合适的类型,并且我可以让python决定顺序,我可以简单地使用eval
:
value = '1.2'
try:
result = eval(value)
except ValueError:
result = value
type(result)
谢谢两个后续问题:1。为什么将退货放在try-except条款的底部更好?可读性?2.不分配解析函数的返回值有什么问题吗?@MatthiasBrandt 1。try
块应该尽可能短,这样比将return
行放入else
中少一行。2.不,这仍然有效,但我认为最好明确地说“这将返回一些东西,但我们对它不感兴趣”,这是\u=
实现的。谢谢。两个后续问题:1。为什么将退货放在try-except条款的底部更好?可读性?2.不分配解析函数的返回值有什么问题吗?@MatthiasBrandt 1。try
块应该尽可能短,这样比将return
行放入else
中少一行。2.不,这仍然有效,但我认为最好明确地说“这将返回一些东西,但我们对它不感兴趣”,这是\u=
实现的。谢谢。两个后续问题:1。为什么将退货放在try-except条款的底部更好?可读性?2.不分配解析函数的返回值有什么问题吗?@MatthiasBrandt 1。try
块应该尽可能短,这样比将return
行放入else
中少一行。2.不,这仍然有效,但我认为最好明确地说“这将返回一些东西,但我们对它不感兴趣”,这是\u=
实现的。谢谢。两个后续问题:1。为什么将退货放在try-except条款的底部更好?可读性?2.不分配解析函数的返回值有什么问题吗?@MatthiasBrandt 1。try
块应该尽可能短,这样比将return
行放入else
中少一行。2.不,这仍然有效,但我认为最好明确地说“这将返回一些东西,但我们对它不感兴趣”,这是\u=
实现的。