在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=
实现的。