【问题标题】:Find best type fit for a string in Python在 Python 中找到最适合字符串的类型
【发布时间】:2016-01-22 20:11:04
【问题描述】:

我有一个字符串变量,我想找出哪个内置类型最能描述这个变量的值。例如:"3.14" -> 浮动; "2015-10-23" -> 日期;其他 -> 字符串

现在我只是级联尝试和例外,这有点难看:

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”方法有什么想法吗?

【问题讨论】:

    标签: python types casting


    【解决方案1】:

    您可以遍历解析尝试:

    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"
    

    这很容易扩展到更多的解析器,并且总是回退到最后的字符串。

    【讨论】:

    • 谢谢。两个后续问题: 1. 为什么将 return 放在 try-except 子句的底部更好?可读性? 2.解析函数的返回值不赋值有什么问题吗?
    • @MatthiasBrandt 1. try 块应该尽可能短,这样比将return 行放在else 中少一行。 2. 不,这仍然有效,但我认为最好明确指出 “这将返回一些东西,但我们对此不感兴趣”_ = 实现了这一点。
    【解决方案2】:

    保留list 的转换/解析函数,并一一试用:

    >>> 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
    

    添加与您正在检查的类型相关的任何异常类型。

    【讨论】:

      【解决方案3】:

      我的解决方案不同。假设我想找到最合适的类型并且我可以让python来决定顺序,我可以简单地使用eval

      value = '1.2'
      try:
          result = eval(value)
      except ValueError:
          result = value
      type(result)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多