2012-02-28 78 views
0

昨天我正在做一些测试,以确定列表中元素的类型。最好的方法来检查变量的类型

types={"float":float, "int":int, "str":str} 
try:  
    sql_type = next (k for k,v in types.iteritems() if isinstance (uniqLst[0],v))  
except TypeError as Typeerr:  
    print "Type not right: " + str(Typeerr)  

那么,当然元素结果总是一个字符串,因为列表保存的数据来自文本文件。我想知道什么可能是检查元素真实性质的好方法。如果你真的走了try/except的解决方案,如:

def check_type(element): 
    try: 
     int(element) 
     return 'int' 
    except: 
     pass 
    try: 
     float(element) 
     return 'float' 
    except: 
     pass 
    try: 
     str(element) 
     return 'str' 
    except: 
     return 'error type' 

什么re.compile? (然后像('[0-9]+'))似乎对我来说不太实际。任何建议非常感谢!

干杯,LarsVegas

回答

3

基于您的评论对ikanobori的答案,你可能会寻找以下string methods。如果以下任一值返回True,则字符c为字母数字:c.isalpha(),c.isdecimal(),c.isdigit()或c.isnumeric()。

str.isalpha() 

如果字符串中的所有字符都是字母并且至少有一个字符,则返回true,否则返回false。字母字符是在Unicode字符数据库中定义为“Letter”的那些字符,即具有一般类别属性为“Lm”,“Lt”,“Lu”,“Ll”或“Lo”之一的那些字符。请注意,这与Unicode标准中定义的“字母”属性不同。

str.isdecimal() 

如果字符串中的所有字符都是十进制字符并且至少有一个字符,则返回true,否则返回false。十进制字符是来自一般类别“Nd”的字符。该类别包括数字字符以及可用于形成十进制小数数字的所有字符,例如, U + 0660,阿拉伯数字ZERO。

str.isdigit() 

如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false。数字包含需要特殊处理的十进制字符和数字,例如兼容性上标数字。形式上,数字是具有属性值Numeric_Type = Digit或Numeric_Type = Decimal的字符。

str.isidentifier() 

根据语言定义标识符和关键字部分,如果字符串是有效标识符,则返回true。真正

str.islower() 

返回,如果字符串中的所有字符套管是小写字母和至少有一个套管字符,否则为false。套用字符是一般类别属性为“Lu”,“Ll”或“Lt”之一的字符,小写字符是具有普通类别属性“Ll”的字符。真正

str.isnumeric() 

返回,如果字符串中的所有字符都是数字字符,并且至少有一个字符,否则为false。数字字符包括数字字符和具有Unicode数字值属性的所有字符,例如U + 2155,VULGAR FRACTION ONE FIFTH。形式上,数字字符是具有属性值Numeric_Type = Digit,Numeric_Type = Decimal或Numeric_Type = Numeric的字符。

str.isprintable() 

如果字符串中的所有字符都是可打印的或字符串为空,则返回true,否则返回false。非可打印字符是在Unicode字符数据库中定义为“Other”或“Separator”的字符,但ASCII空格(0x20)被认为是可打印的。 (请注意,在这种情况下可打印字符是再版时,()在一个字符串调用其不应被转义。它有到sys.stdout或sys.stderr字符串的处理没有任何影响。)

str.isspace() 

如果字符串中只有空白字符且至少有一个字符,则返回true,否则返回false。空格字符是在Unicode字符数据库中定义为“其他”或“分隔符”的那些字符,以及具有“WS”,“B”或“S”之一的双向属性的那些字符。如果字符串是titlecased字符串,至少有一个字符,比如大写字符只能跟着加套管字符和小写字符只有那些套管

str.istitle() 

,则返回true。否则返回false。

str.isupper() 

如果字符串中的所有字符都是大写且至少包含一个装入字符的字符,则返回true,否则返回false。套用字符是一般类别属性是“Lu”,“Ll”或“Lt”之一,大写字符是具有一般类别属性“Lu”的字符。

+0

感谢这个不错的概述!这将有很大的帮助。 – LarsVegas 2012-02-28 12:03:26

2

我们强烈不鼓励使用类型检查Python编写的。为什么你需要知道类型?

Python使用鸭子打字,这意味着我可以创建我自己的Integer对象的子类,它的行为方式完全相同,只是它不是'类型int'的实例,它会打败你的类型检查冒险。

这个想法是以你想使用它的方式使用一个对象,如果失败会引发异常,那么你给自己和最终的其他编码者提供了更多的自由:-)

如果字符串中的所有字符是字母数字

str.isalnum() 

回归真实,至少有一个字符,否则为false:

+0

嗯,我从一个txt文件读取数据,并希望执行一个基于它的sql语句。事情是:在txt文件中可以是任何东西 - 整数,浮动,字符串。这就是为什么我需要在整理陈述之前检查他们的类型。 – LarsVegas 2012-02-28 10:53:35

+1

不,在文本文件中一切都是一个字符串,所以你已经将字符串转换为你的类型,这意味着你已经*拥有*他们是什么类型的信息,为什么需要再次检查?另外,如果您使用的是符合Python DB-API的数据库模块(其中大部分都是),那么您的绑定参数将解决手动类型检查和处理强制问题的需求? – ikanobori 2012-02-28 10:57:18

+0

我知道文本文件中的所有内容都是一个字符串,这就是我在我的问题的介绍中所说的。但他们实际上可能是别的东西,所以是的,需要转换。从技术上讲,我可以解决这个问题,我只是好奇什么是一个好方法。我认为不建议做类型检查。但@Weetu提到的字符串方法表明显然需要更多地了解字符串的性质。不过,感谢您的回复,以及您对此主题的见解。欢呼声,LarsVegas – LarsVegas 2012-02-28 12:01:59

1

@Weetu's answer是Python string predicates对应于Unicode general category properties的一个很好的概述。

作为一个练习,我试图编写一个程序来找出我自己,哪个字符串谓词(例如isdigit)对应于哪些字符属性。于是我打开了Unicode Character Categories并填充了一个字典,其中键为2个字母的类别('Lt'),值为示例Unicode字符(u'Dž'),然后编写了一个程序来获得字符串谓词和字符属性之间的对应关系。我使用了Python 3,因为Python 2有一些神秘的Unicode错误(如果你指出,为什么下面的代码在Python 2中工作不正确,我会很高兴的)

d = { 
    'Cc': u'', 'LC': None, 'Pc': u'_', 'Sc': u'$', 
    'Cf': u'', 'Ll': u'a', 'Pd': u'-', 'Sk': u'^', 
    'Cn': None, 'Lm': u'ʰ', 'Pe': u')', 'Sm': u'+', 
    'Co': u'', 'Lo': u'ª', 'Pf': u'»', 'So': u'¦', 
    'Cs': u'⠀', 'Lt': u'Dž', 'Pi': u'«', 
       'Lu': u'A', 'Po': u'!', 
           'Ps': u'(', 
    'Mc': u'ः', 'Nd': u'0', 'Zl': u'
', 
    'Me': u'҈', 'Nl': u'ᛮ', 'Zp': u'
', 
    'Mn': u'̀', 'No': u'²', 'Zs': u' '          
} # Zl and Zp have invisible characters that break Markdown's code blocks
methods = ['isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 
      'istitle', 'isupper', 'isnumeric', 'isdecimal'] 

dl = {method: [code 
       for code, character 
       in d.items() 
       if character and getattr(character, method)()] 
     for method in methods} 

结果如下。例如。 ch.isdigit()将返回True如果chNoNd Unicode属性。

>>> from pprint import pprint # pretty printing 
>>> pprint(dl) 
{'isalnum': ['No', 'Nd', 'Nl', 'Lu', 'Lt', 'Lo', 'Lm', 'Ll'], 
'isalpha': ['Lu', 'Lt', 'Lo', 'Lm', 'Ll'], 
'isdecimal': ['Nd'], 
'isdigit': ['No', 'Nd'], 
'islower': ['Lo', 'Lm', 'Ll'], 
'isnumeric': ['No', 'Nd', 'Nl'], 
'isspace': ['Zp', 'Zs', 'Zl'], 
'istitle': ['Lu', 'Lt'], 
'isupper': ['Lu']} 

对于使用Unicode字符数据库的更智能操作,请参阅Python库unicodedata

参考文献:

相关问题