-3
我運行下面的代碼來獲得亞馬遜點播服務器的價格:無法使用訪問字典`[]`,但可以訪問使用`獲得()`在Python
import json
import requests
region='ap-southeast-1'
instanceType='m4.large'
operatingSystem='Linux'
url = 'https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/{}/index.json'.format(region)
response = requests.get(url)
offers = json.loads(response.text)
SKU = [sku for sku in offers['products'] if offers['products'][sku]['attributes'].get('instanceType') == instanceType and offers['products'][sku]['attributes'].get('operatingSystem') == operatingSystem][0]
# SKU = [sku for sku in offers['products'] if offers['products'][sku]['attributes']['instanceType'] == instanceType and offers['products'][sku]['attributes']['operatingSystem'] == operatingSystem][0]
SKU_TERM = [sku_term for sku_term in offers['terms']['OnDemand'][SKU] if offers['terms']['OnDemand'][SKU][sku_term]['sku'] == SKU][0]
priceDimensionKey = offers['terms']['OnDemand'][SKU][SKU_TERM]['priceDimensions'].keys()[0]
price = offers['terms']['OnDemand'][SKU][SKU_TERM]['priceDimensions'][priceDimensionKey]['pricePerUnit']['USD']
print price
上面的代碼工作正常,我得到我想要的價格。但是,如果我們將替換爲註釋行(略低於吧)SKU = ...
行我得到:
KeyError: 'instanceType'
的兩條線之間的唯一區別是,我訪問使用[]
屬性instanceType
在一行和get()
在另一線。與get()
一個正常工作,但沒有其他人。任何人都可以向我解釋這是爲什麼?
P.S. :更好的方式從定價API響應中獲得價格的建議也受到歡迎。亞馬遜定價API的Doc。
'dict.get(foo)'將返回給定鍵的值(如果存在),但如果不存在則返回'無'。 '__getattr__'(aka'[]'),做同樣的事情,但如果key不存在但不會返回'None',但會引發'KeyError'。 https://docs.python.org/2/library/stdtypes.html#dict.get – Arount
我知道不同之處。關鍵的'instanceType'存在於響應中,如果我使用'[]'來訪問它,我仍然會得到KeyError。請在回覆之前查看API響應和我的代碼正在執行的操作。 – kvr
大聲笑,幫助像你這樣的人真的很酷,所以這些ID有'屬性> instanceType'鍵? '9AFX8EFNRVRXD3PH','3MKHN58N7RDDVGKJ','W3PUKFKG7RDK3KA5'。 Protip,當Python引發'KeyError'時,這是因爲**發生了一個關鍵錯誤**。在不愉快之前查看您的代碼 – Arount