【问题标题】:Type checking / define type check类型检查/定义类型检查
【发布时间】:2013-01-23 16:00:19
【问题描述】:

请原谅我的标题很差,我真的想不出合适的标题。

这是我的问题。假设我得到了一个字符串列表:

['2010.01.01',
'1b',
'`abc'
'12:20:33.000']

我想做一个“类型检查”,以便给定第一个字符串返回日期类型,第二个布尔值,第三个符号,一次第四个......等等。返回的值可以是字符串或任何事情,因为我想做的就是转换正确的 ctypes。

有什么办法吗?

ps:我的python是2.5

【问题讨论】:

  • 当然——您只需要确定一组规则,将哪些字符串映射到哪些“类型”,然后应用它们。例如,您的第二个“1b”对我来说根本不像布尔值,但我的意见并不重要。
  • 您想要做的是格式检查而不是类型检查。看起来像是正则表达式的工作。
  • 您可以按照@DSM 的建议滚动您自己的映射,或者您可以使用pyparsing 之类的东西,或者,如果您有灵活性,重新定义接口以接受已经定义好的JSON 之类的东西规则和经过良好测试的解析器。

标签: python types ctypes


【解决方案1】:
>>> str = ['2010.01.01',
... '1b',
... '`abc'
... '12:20:33.000']
>>> [type(x) for x in str]
[<type 'str'>, <type 'str'>, <type 'str'>]

假设您使用 eval 来确定此列表。

【讨论】:

    【解决方案2】:

    如果您完全确定您可以信任该内容 - 例如,它不是来自可以以某种方式将代码潜入列表的用户 - 您可以将列表映射到 eval,这将捕获像数字这样的本机类型。但是,没有简单的方法可以知道这些字符串的全部含义——例如,如果您尝试升级 '2010.01.01',python 会认为您正在尝试解析一个数字,然后由于额外的小数而失败。

    所以你可以尝试一个两阶段的策略:首先使用 eval 将列表转换为字符串与数字:

    def try_cast (input_string):
        try:
            val = eval(input_string)
            val_type = type(val)
            return val, val_type
        except:
            return input_string, type('')
    
    cast_list = map (try_cast, original_list)
    

    这将给出一个元组列表,其中第二项是类型,第一项是转换后的项。对于更专业的事情,例如日期,您需要对第一次传递后剩余的字符串使用相同的策略,使用 try/except 块尝试使用 time.strptime() 将它们转换为日期.您需要弄清楚预期的时间格式并为每个格式生成一个解析表达式(您可以查看 python 文档或类似 http://www.tutorialspoint.com/python/time_strptime.htm 的内容)您必须尝试所有选项并查看哪些选项正确转换 - - 如果一个工作,价值是一个日期;如果不是,它只是一个字符串。

    【讨论】:

    • 我很困惑为什么语言包括eval。恕我直言,它永远不应该被使用。如果它看起来是个好主意,那么有一个更好/更安全的主意可以解决问题。
    • 好吧,它是免费的——如果你已经编写了所有的文本来编码东西,人们会想'为什么不呢'。如果您实际上是在编写语言,它可能非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多