You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字符串去查,肯定匹配不上,反之亦然。

解决办法就是统一字符串类型:

  1. 最简单的:在代码文件最开头加一行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")
    
  2. 或者手动转类型:把要检查的字符串转成和键一样的类型,比如str(u'Brazil')转成字节串,或者unicode('Brazil')转成Unicode。

排查小妙招

要是还是找不到问题,直接打印类型看看!比如:

# 检查字典键的类型和你要查的字符串类型
countries_dict = {'Brazil': '南美'}
print(type('Brazil'))  # 看看是str还是unicode
print(type(countries_dict.keys()[0]))  # 对比字典键的类型

如果这俩类型不一样,那就是问题根源啦!

内容的提问来源于stack exchange,提问作者TigerTV.ru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:48:13