我正在使用API,其中的信息将是这样的:
"id": "17",
"address": "Av. Nossa Senhora de Copacabana",
"addressComplement": "A",
"number": "945",
"cityId": "2",
"cityName": "Rio de Janeiro",
"state": "Rio de Janeiro",
"uf": "RJ",
"neighborhood": "Copacabana",
"properties": {},
"telephones": [],
"geolocation": {
"lat": -22.97625,
"lng": -43.19002
},
但是,在某些记录中,它不包含geolocation
字段,因此我必须检查代码中是否存在geolocation
。
我试图用hasattr
做这个伎俩,但我觉得我做错了。
这是我的代码的一部分:
if hasattr(i, 'geolocation'):
address_lat = i['geolocation']['lat']
address_lng = i['geolocation']['lng']
else:
address_lat = 0.0
address_lng = 0.0
我的想法是,它将检查在i
指数geolocation
的位置是否存在。如果有东西,则返回true并进入条件,否则var将接收0.0
。
那么,我做错了什么?这是使用hasattr
的正确方法吗?
它比那简单:
address_lat = i['geolocation']['lat'] if 'geolocation' in i else 0.0
address_lng = i['geolocation']['ing'] if 'geolocation' in i else 0.0
hasattr
可用于检查对象是否具有属性。这是一个更具体的情况,你只需要检查密钥是否是in
字典。
一个小小的抱怨:i
是一个混乱的字典名称,乍一看我认为这是一个索引。更好地将其重命名为有意义的东西!
您可以使用dict.get
方法,该方法允许提供默认值,如果密钥不存在,将返回该值,例如喜欢:
geolocation = i.get('geolocation', {"lat": 0., "lng": 0.})
你可以使用try except
条款:
try:
address_lat = i['geolocation']['lat']
address_lng = i['geolocation']['lng']
except KeyError:
address_lat = 0.0
address_lng = 0.0
hasattr
通常用于物体。
>>> class A:
... i = 10
...
>>> hasattr(A(), 'i')
True
在您的情况下,检查字典中是否存在密钥的最佳方法是执行类似的操作
data = {'geolocation': 0.0}
if 'geolocation' in data:
...do something
如果它们不存在,您可以使用get并设置lat和lng的默认值。
geolocation = i.get('geolocation',{"lat": 0,"lng":0})
address_lat = geolocation['lat']
address_lng = geolocation['lng']