检查变量类型的最佳方法

时间:2012-02-28 10:42:21

标签: python regex types try-catch

昨天我正在做一些测试,以从列表中识别元素的类型。

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 个答案:

答案 0 :(得分:3)

根据您对ikanobori的回答的评论,您可能正在寻找以下string methods

str.isalnum()

如果字符串中的所有字符都是字母数字且至少有一个字符,则返回true,否则返回false。如果以下之一返回True,则字符c是字母数字:c.isalpha(),c.isdecimal(),c.isdigit()或c.isnumeric()。

str.isalpha()

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

str.isdecimal()

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

str.isdigit()

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

str.isidentifier()

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

str.islower()

如果字符串中的所有外壳字符都是小写且至少有一个外壳字符,则返回true,否则返回false。套用字符是具有一般类别属性的字符,其中一个是“Lu”,“Ll”或“Lt”,小写字符是具有一般类别属性“Ll”的字符。

str.isnumeric()

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

str.isprintable()

如果字符串中的所有字符都是可打印的或字符串为空,则返回true,否则返回false。不可打印的字符是Unicode字符数据库中定义为“其他”或“分隔符”的字符,但ASCII空间(0x20)除外,它被认为是可打印的。 (请注意,此上下文中的可打印字符是在字符串上调用repr()时不应转义的字符。它与写入sys.stdout或sys.stderr的字符串的处理无关。)

str.isspace()

如果字符串中只有空格字符并且至少有一个字符,则返回true,否则返回false。空白字符是Unicode字符数据库中定义为“其他”或“分隔符”的字符,以及双向属性为“WS”,“B”或“S”之一的字符。

str.istitle()

如果字符串是一个带有标题的字符串并且至少有一个字符,则返回true,例如,大写字符可能只跟随无字符的字符,而小写字符只能跟随字符。否则返回false。

str.isupper()

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

答案 1 :(得分:2)

强烈建议不要在Python中使用类型检查。为什么你需要知道类型?

Python使用duck-typing,这意味着我可以创建自己的Integer对象的子类,其行为完全相同,只是它不是'type int'的实例,这会破坏你的类型检查冒险。

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

答案 2 :(得分:1)

@Weetu's answer概述了Python string predicatesUnicode 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()具有Truech Unicode属性,No将返回Nd

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

<强>参考文献: