2017-05-15 42 views
-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

+0

'dict.get(foo)'將返回給定鍵的值(如果存在),但如果不存在則返回'無'。 '__getattr__'(aka'[]'),做同樣的事情,但如果key不存在但不會返回'None',但會引發'KeyError'。 https://docs.python.org/2/library/stdtypes.html#dict.get – Arount

+0

我知道不同之處。關鍵的'instanceType'存在於響應中,如果我使用'[]'來訪問它,我仍然會得到KeyError。請在回覆之前查看API響應和我的代碼正在執行的操作。 – kvr

+0

大聲笑,幫助像你這樣的人真的很酷,所以這些ID有'屬性> instanceType'鍵? '9AFX8EFNRVRXD3PH','3MKHN58N7RDDVGKJ','W3PUKFKG7RDK3KA5'。 Protip,當Python引發'KeyError'時,這是因爲**發生了一個關鍵錯誤**。在不愉快之前查看您的代碼 – Arount

回答

-1

函數dictionary.get(key)在未找到鍵時返回Null,但[key]引發異常。 'offer'字典中的所有字典都沒有'instanceType'鍵。

如果你添加如下代碼(我與Python3工作):

在報價SCU [ '產品']: 嘗試: A =(報價[ '產品'] [SCU ] [ '屬性'] [ 'instanceType']) 除了異常的EX: 打印(SCU) 行 「報價= json.loads(response.text)」

後,您會得到清單沒有'instanceType'鍵的「scu」值。