Python中hasattr()函数未按预期工作,如何正确检查属性是否存在?
搞定Python属性/键存在性检查的问题
嘿,我来帮你解决这个困扰!你说运行代码后一直输出hasn't,试过去掉Brazil前的u前缀也没用,咱们一步步来排查:
先搞清楚你要检查的是啥
首先得明确你是在检查对象的属性,还是字典的键?这俩的检查方式完全不一样:
如果是检查对象的属性
用Python内置的hasattr()函数就对了,举个例子:
# 先定义一个带属性的对象 class Country: def __init__(self): self.Brazil = "南美国家" my_country = Country() # 检查属性是否存在 if hasattr(my_country, 'Brazil'): print("has") else: print("hasn't")
如果是检查字典的键
直接用in关键字判断就行(比Python2里的has_key()靠谱多了,Python3还把has_key()移除了):
countries_dict = {'Brazil': '南美', 'China': '亚洲'} # 检查键是否存在 if 'Brazil' in countries_dict: print("has") else: print("hasn't")
关于u前缀的坑(大概率是这个问题!)
你提到了u前缀,这应该是Python2里的Unicode字符串问题——在Python2中,u'Brazil'是Unicode字符串,'Brazil'是字节串,这俩是不同的类型!如果你的字典键是字节串,你用Unicode字符串去查,肯定匹配不上,反之亦然。
解决办法就是统一字符串类型:
- 最简单的:在代码文件最开头加一行
from __future__ import unicode_literals,这样所有不带前缀的字符串都会变成Unicode类型,和u'Brazil'一致。from __future__ import unicode_literals # 必须放在文件第一行 countries_dict = {'Brazil': '南美'} # 现在这个键是Unicode if 'Brazil' in countries_dict: # 这里的'Brazil'也是Unicode,能匹配上 print("has") else: print("hasn't") - 或者手动转类型:把要检查的字符串转成和键一样的类型,比如
str(u'Brazil')转成字节串,或者unicode('Brazil')转成Unicode。
排查小妙招
要是还是找不到问题,直接打印类型看看!比如:
# 检查字典键的类型和你要查的字符串类型 countries_dict = {'Brazil': '南美'} print(type('Brazil')) # 看看是str还是unicode print(type(countries_dict.keys()[0])) # 对比字典键的类型
如果这俩类型不一样,那就是问题根源啦!
内容的提问来源于stack exchange,提问作者TigerTV.ru
相关产品推荐
相关产品推荐

