Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型检查/定义类型检查_Python_Types_Ctypes - Fatal编程技术网

Python 类型检查/定义类型检查

Python 类型检查/定义类型检查,python,types,ctypes,Python,Types,Ctypes,请原谅我这个糟糕的标题,我真的想不出一个合适的标题 这是我的问题。假设给我一个字符串列表: ['2010.01.01', '1b', '`abc' '12:20:33.000'] 我想做一个“类型检查”,这样给定第一个字符串,它返回类型日期,第二个是布尔值,第三个是符号,第四个是一次一个。。。返回的值可以是字符串或任何东西,因为我只想转换正确的CType 有什么办法吗 ps:my python是2.5如果你完全确定你可以信任内容——比如说,它不是来自一个可能以某种方式将代码潜入列表的用户——你

请原谅我这个糟糕的标题,我真的想不出一个合适的标题

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

['2010.01.01',
'1b',
'`abc'
'12:20:33.000']
我想做一个“类型检查”,这样给定第一个字符串,它返回类型日期,第二个是布尔值,第三个是符号,第四个是一次一个。。。返回的值可以是字符串或任何东西,因为我只想转换正确的CType

有什么办法吗


ps:my python是2.5

如果你完全确定你可以信任内容——比如说,它不是来自一个可能以某种方式将代码潜入列表的用户——你可以将列表映射到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.strtime()将它们转换为日期。您需要弄清楚预期的时间格式,并为每种格式生成一个解析表达式(您可以检查python文档或类似的内容),您必须尝试所有选项,并查看哪些选项正确转换——如果一个有效,则值为日期;如果不是,它只是一个字符串。

>str=['2010.01.01',
>>> str = ['2010.01.01',
... '1b',
... '`abc'
... '12:20:33.000']
>>> [type(x) for x in str]
[<type 'str'>, <type 'str'>, <type 'str'>]
…“1b”, “‘abc’ ... '12:20:33.000'] >>>[str中x的类型(x)] [, ]

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

当然——您只需要确定一组规则,确定哪些字符串映射到哪些“类型”,然后应用它们。例如,你的第二个“1b”在我看来一点也不像一个傻瓜,但我的意见并不重要。你要做的是格式检查,即类型检查。看起来像是正则表达式的工作。您可以按照@DSM的建议滚动自己的映射,或者可以使用类似于
pyparsing
的东西,或者,如果您有足够的灵活性,重新定义接口以接受类似JSON的东西,它已经有了定义良好的规则和经过良好测试的解析器。我以前对语言为什么包含
eval
感到困惑。嗯,永远不要用它。如果这看起来是个好主意,那么有一个更好/更安全的主意可以解决这个问题。好吧,它是免费的——如果你已经把所有的文本都写进了代码,人们会想‘为什么不呢?’。如果你真的在写这种语言,它可能非常有用。