#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть словарь, в котором есть несколько ключей с несколькими значениями, и я хочу сохранить их в списке объектов, а не в словаре. Мои результаты выглядят следующим образом:
PLAB {'price': '9.450000', 'quantity': '8.0000', 'average_buy_price': '9.3000', 'equity': '75.60', 'percent_change': '1.61', 'equity_change': '1.200000', 'type': 'stock', 'name': 'Photronics', 'id': '2ae1c2e1-5c68-4d73-ba82-9d14fcf57fa6', 'pe_ratio': '16.187542', 'percentage': '5.63'}
CAIMMR {'price': '8.430000', 'quantity': '12.0000', 'average_buy_price': '8.4200', 'equity': '101.16', 'percent_change': '0.12', 'equity_change': '0.120000', 'type': 'stock', 'name': 'Immersion', 'id': 'bcf02154-1068-4f96-999a-f7ecd7724112', 'pe_ratio': '4.734742', 'percentage': '7.53'}
SH {'price': '19.680000', 'quantity': '4.0000', 'average_buy_price': '19.4400', 'equity': '78.72', 'percent_change': '1.23', 'equity_change': '0.960000', 'type': 'stock', 'name': 'Meta Financial', 'id': '7eb2c5f5-2c3c-46ec-b1d7-89c84c00b133', 'pe_ratio': '10.124530', 'percentage': '5.86'}
Я хотел бы, чтобы эти значения сохранялись в объекте, который я настроил ниже:
class StockProperties(object):
def __init__(self, ticker, price, quantity, average_buy_price, equity, percent_change, equity_change, option_type, name, option_id, pe_ratio, portfolio_percentage):
self.ticker = ticker
self.price = price
self.quantity = quantity
self.average_buy_price = average_buy_price
self.equity = equity
self.percent_change = percent_change
self.equity_change = equity_change
self.type = option_type
self.name = name
self.option_id = option_id
self.pe_ratio = pe_ratio
self.portfolio_percentage = portfolio_percentage
Как я могу выполнить итерацию по ключам и значениям dict, чтобы я мог сохранить его в этом классе?
Комментарии:
1. Похоже, это хорошее использование ** распаковки. Вы могли бы использовать plab_object = StockProperties(**PLAB), если они точно совпадают, но это не так. Некоторые аргументы имеют немного другие имена, а тикер полностью отсутствует. Было бы лучше, если бы конструктор принимал (self, ** kwargs) и имел значения по умолчанию для отсутствующих аргументов или выдавал свою собственную ошибку, если значение по умолчанию неприемлемо.
Ответ №1:
Вы можете попробовать:
class StockProperties(object):
def __init__(self, *args, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
Другим вариантом, возможно, было бы использовать DotMap
Ответ №2:
Если вы используете Python 3.7 , используйте dataclass
который принимает dict для инициализации объекта.
from dataclasses import dataclass
@dataclass
class StockProperties:
ticker :str
price :str
quantity :str
average_buy_price :str
equity :str
percent_change :str
equity_change :str
type :str
name :str
option_id :str
pe_ratio :str
portfolio_percentage :str
props = {'price': '9.450000', 'quantity': '8.0000', 'average_buy_price': '9.3000', 'equity': '75.60', 'percent_change': '1.61', 'equity_change': '1.200000', 'type': 'stock', 'name': 'Photronics', 'id': '2ae1c2e1-5c68-4d73-ba82-9d14fcf57fa6', 'pe_ratio': '16.187542', 'percentage': '5.63'}
stock = StockProperties(**props)
Но единственным условием является то, что dict должен содержать все имена полей. Вы также можете использовать значения по умолчанию в dataclass, чтобы избежать пропуска ключей в проблеме dict.