从嵌套字典构建类

时间:2018-04-26 17:16:51

标签: python class dictionary inheritance

所以我对这一切都不熟悉,请原谅我糟糕的格式,只是松散地掌握行话。

简而言之,我有一个

$("#container").on("click", "a.report-button", function(event) {
    alert("Thx!");
});

返回json()嵌套字典(抱歉可怕的措辞),如下所示:

coins = requests.get("https://bittrex.com/api/v1.1/public/getcurrencies")

简而言之,我想访问{ "success" : true, "message" : "", "result" : [{ "Currency" : "BTC", "CurrencyLong" : "Bitcoin", "MinConfirmation" : 2, "TxFee" : 0.00020000, "IsActive" : true, "CoinType" : "BITCOIN", "BaseAddress" : null }, { "Currency" : "LTC", "CurrencyLong" : "Litecoin", "MinConfirmation" : 5, "TxFee" : 0.00200000, "IsActive" : true, "CoinType" : "BITCOIN", "BaseAddress" : null }] } 中的每个字典并使用它们构建我自己的值,为每个硬币生成一个类,以便继承代码被填充,如:

coins["result"]

我理解这段代码不正确,但我试图让你知道我想要完成的事情。对不起,我的可怕的措辞,一般的编程新手,虽然我对功能的一般掌握,我仍然试图赶上行话。

2 个答案:

答案 0 :(得分:2)

有几种不同的方法可以执行此操作,例如,您可以解析__init__函数中的字典。

我倾向于通过单独的@classmethod处理这个问题,该class Coinbuilder: def __init__(self, cur, curlong): self.currency = cur self.currency_long = curlong @classmethod def build_from_dict(coin_b, d): attributes = {'Currency', 'CurrencyLong'} try: class_dct = {a: d[a] for a in attributes} except: raise ValueError('Input did not contain necessary attributes') return coin_b(class_dct['Currency'], class_dct['CurrencyLong']) 负责解析字典以创建我的类的实例。

这样的事情:

Coinbuilder

这样我就不会强制传递x = Coinbuilder.build_from_dict({'Currency': 'BTC', 'CurrencyLong': 'Bitcoin'}) 字典来创建一个类实例,但是我有一个简单的方法可以用来解析字典来创建我的类的实例。

对于这个简单的例子,我可以做到以下几点:

y = Coinbuilder('BTC', 'Bitcoin')

或者我可以使用:

print(x.currency, x.currency_long)
print(y.currency, y.currency_long)

获得两个相等的类实例:

BTC Bitcoin
BTC Bitcoin

输出:

@classmethod

使用您的示例输入作为指南,一旦您编写my_coins = [] for result in coins['result']: my_coins.append(Coinbuilder.build_from_dict(result)) 来解析字典,您就可以使用:

my_coins = [Coinbuilder.build_from_dict(result) for result in coins['result']]

或者:

routes

答案 1 :(得分:0)

以下是您要执行的操作的完整脚本:

import requests
import json

class CoinBuilder:
  def __init__(self,dict):
    self.currency = dict['Currency']
    self.currencyLong = dict['CurrencyLong']
    self.minConfirmation = dict['MinConfirmation']
    self.txFee = dict['TxFee']
    self.isActive = dict['IsActive']
    self.coinType = dict['CoinType']
    self.baseAddress = dict['BaseAddress']
    self.notice = dict['Notice']


coins_response = requests.get("https://bittrex.com/api/v1.1/public/getcurrencies")

all_coins = json.loads(coins_response.content)

list_of_coin_obs = []

for coin in all_coins["result"]:
  list_of_coin_obs.append(CoinBuilder(coin))

此脚本正在获取响应,然后遍历result[]中的字典并从中构建CoinBuilder个对象。所有创建的对象也存储在列表list_of_coin_obs[]

然后,您可以打印前10个结果,例如:

# Print out the first 10 coins
print("First 10 coins:")
for i in range(1,11):
  print(i,") ",list_of_coin_obs[i].currency)

对于此示例,这将输出:

First 10 coins:
1 )  LTC
2 )  DOGE
3 )  VTC
4 )  PPC
5 )  FTC
6 )  RDD
7 )  NXT
8 )  DASH
9 )  POT
10 )  BLK

如果你想通过它的股票代码创建一个查找特定硬币的方法,你可以创建这样的东西:

# method to retrieve a specific coin from 'list_of_coin_obs[]'
#   we are passing in a parameter, 'coin_abr' to give to our filter
def get_specific_coin_by_abr(coin_abr):
  return next(filter(lambda x: x.currency == coin_abr, list_of_coin_obs)) 
# call our method, which returns a 'CoinBuilder' type  
specific_coin = get_specific_coin_by_abr('BTC')
# print our results to show it worked
print('CurrencyName: ',specific_coin.currency,'CurrencyLong: ',specific_coin.currencyLong)

打印:

CurrencyName:  BTC CurrencyLong:  Bitcoin

注意:这假设您已经创建了list_of_coin_obs[]并且与此方法的范围相同。

一个建议,这里的班级名称CoinBuilder并非完全最有意义。类/对象的更好名称只是CoinNamedCurrency或其他类似的名称。我想我知道你的目的是什么,但这可能更适合你的项目。

祝你好运。