为Python字典键添加前缀的最有效方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为Python字典键添加前缀的最有效方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6272字,纯文字阅读大概需要9分钟。
内容图文
![为Python字典键添加前缀的最有效方法](/upload/InfoBanner/zyjiaocheng/817/c01ccbd719f542329f2a232cdc565d4b.jpg)
所以我发现自己需要在Python字典中添加前缀.
基本上我想要的是这个字典的用户能够在字典的实例化中添加前缀,在这种情况下字典保存前缀,并且每次添加新密钥时,它都会预先添加前缀.但是如果由于某种原因没有提供或改变前缀,我也想要改变字典,这意味着旧的字典键需要在保留各自值的同时为它们添加前缀.
使用案例:
基本上我正在完成MWS API的最后一次api.
我建立了api围绕着每个调用需要采取特定参数的想法,
喜欢 :
def get_report(self, marketplaceids):
# Here I process marketplaceids which is a python list
# and send the following to Amazon:
MarketplaceIdList.Id.1: 123,
MarketplaceIdList.Id.2: 345,
MarketplaceIdList.Id.3: 4343
# By doing this I eliminate the complexity of the arguments Amazon expects
不幸的是,最后两个api更难以这种方式实现,因为它们利用亚马逊引入的一个名为Datatypes的新“特性”.
这些“数据类型”是嵌套结构.
例如:
我想从InboundShipmentAPI调用CreateInboundShipment操作,
该操作采用以下参数:
ShipmentId - String
InboundShipmentHeader - InboundShipmentHeader datatype
InboundShipmentItems - A list of InboundShipmentItem datatypes
问题发生的原因是InboundShipmentHeader是一种数据类型,它采用另一种数据类型作为参数.
亚马逊最终期望如下:
ShipmentId=102038383
InboundShipmentHeader.ShipmentName': 'somevalue',
InboundShipmentHeader.ShipFromAddress.Name': 'somevalue',
InboundShipmentHeader.ShipFromAddress.AddressLine1': 'somevalue',
InboundShipmentHeader.ShipFromAddress.City': 'somevalue',
InboundShipmentHeader.ShipFromAddress.StateOrProvinceCode': 'somevalue',
InboundShipmentHeader.ShipFromAddress.PostalCode': 'somevalue',
InboundShipmentHeader.ShipFromAddress.CountryCode': 'somevalue',
InboundShipmentHeader.DestinationFulfillmentCenterId': 'somevalue',
InboundShipmentHeader.ShipmentStatus': 'somevalue',
InboundShipmentHeader.LabelPrepPreference': 'somevalue',
InboundShipmentItems.member.1.QuantityShipped': 'somevalue',
InboundShipmentItems.member.2.QuantityShipped': 'somevalue',
InboundShipmentItems.member.1.SellerSKU': 'somevalue',
InboundShipmentItems.member.2.SellerSKU': 'somevalue',
InboundShipmentHeader.ShipFromAddress.AddressLine2': 'somevalue',
InboundShipmentHeader.ShipFromAddress.DistrictOrCounty': 'somevalue',
所以我想简单地让某人做这个电话而不必担心每个参数的名字.
我的解决方案是创建一个基本数据类型类,然后创建单独的数据类型
作为课程.
这是我到目前为止:
class AmazonDataType(dict):
"""
Base for all Amazon datatypes.
"""
def __init__(self, *args, **kwargs):
self._prefix = kwargs.pop('prefix', '')
self.update(*args, **kwargs)
@property
def prefix(self):
return self._prefix
@prefix.setter
def prefix(self, value):
self._prefix = value
newdict = {'%s.%s' % (value, key): dictvalue for key, dictvalue in self.iteritems()}
self.clear()
dict.update(self, newdict)
def __setitem__(self, key, value):
try:
original_key = self.fields[key]
except KeyError, e:
raise e
if isinstance(value, AmazonDataType):
value.prefix = original_key
dict.update(self, value)
else:
newkey = self.prefix + original_key if self.prefix else original_key
dict.__setitem__(self, newkey, value)
def update(self, *args, **kwargs):
"""
Props to Matt Anderson (https://stackoverflow.com/a/2390997/389453)
"""
for k, v in dict(*args, **kwargs).iteritems():
self[k] = v
class InboundShipmentHeader(AmazonDataType):
fields = {
'name': 'ShipmentName',
'address': 'ShipFromAddress',
'fulfillment_center_id': 'DestinationFulfillmentCenterId',
'label_preference': 'LabelPrepPreference',
'cases_required': 'AreCasesRequired',
'shipment_status': 'ShipmentStatus',
}
然后而不是做
somedict = {
'InboundShipmentHeader.ShipmentName': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.Name': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.AddressLine1': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.City': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.StateOrProvinceCode': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.PostalCode': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.CountryCode': 'somevalue',
'InboundShipmentHeader.DestinationFulfillmentCenterId': 'somevalue',
'InboundShipmentHeader.ShipmentStatus': 'somevalue',
'InboundShipmentHeader.LabelPrepPreference': 'somevalue',
}
call_amazon(somedict)
我想通过类似的东西
ShipmentHeader = InboundShipmentHeader()
ShipmentHeader['name'] = 'somevalue'
ShipmentHeader['address'] = address_datatype_instance
ShipmentHeader['fulfillment_center_id'] = 'somevalue'
ShipmentHeader['label_preference'] = 'somevalue'
ShipmentHeader['cases_required'] = 'somevalue'
ShipmentHeader['shipment_status'] = 'somevalue'
call_amazon(ShipmentHeader, otherparams)
在后台,call_amazon方法执行:
ShipmentHeader.prefix = InboundShipmentHeader
解决方法:
你可以继承dict并添加一个方法(我不知道该怎么称呼它,所以让我们说dict):
class AmazonDataType(dict):
"""
Base for all Amazon datatypes.
"""
def __init__(self, *args, **kwargs):
self._prefix = kwargs.pop('prefix', self.__class__.__name__)
super(AmazonDataType, self).__init__(*args, **kwargs)
def __getattr__(self, key):
return self.__getitem__(key)
def __setattr__(self, key, value):
return self.__setitem__(key, value)
def dict(self):
result = {}
for key, value in self.items():
if key.startswith('_'):
continue
key = self.fields.get(key, key)
if isinstance(value, AmazonDataType):
for skey, svalue in value.dict().items():
result['%s.%s' % (self._prefix, skey)] = svalue
else:
result['%s.%s' % (self._prefix, key)] = value
return result
现在,界面更加Pythonic:
class InboundShipmentHeader(AmazonDataType):
fields = {
'name': 'ShipmentName',
'address': 'ShipFromAddress',
'fulfillment_center_id': 'DestinationFulfillmentCenterId',
'label_preference': 'LabelPrepPreference',
'cases_required': 'AreCasesRequired',
'shipment_status': 'ShipmentStatus',
}
class Address(AmazonDataType):
fields = {
'name': 'Name',
'address': 'AddressLine1',
'city': 'City'
}
address = Address(prefix='ShipFromAddress')
address.name = 'Foo'
header = InboundShipmentHeader()
header.name = 'somevalue'
header.address = address
header.fulfillment_center_id = 'somevalue'
header.label_preference = 'somevalue'
header.cases_required = 'somevalue'
header.shipment_status = 'somevalue'
header.dict()的输出是:
{'InboundShipmentHeader.AreCasesRequired': 'somevalue',
'InboundShipmentHeader.DestinationFulfillmentCenterId': 'somevalue',
'InboundShipmentHeader.LabelPrepPreference': 'somevalue',
'InboundShipmentHeader.ShipFromAddress.Name': 'Foo',
'InboundShipmentHeader.ShipmentName': 'somevalue',
'InboundShipmentHeader.ShipmentStatus': 'somevalue'}
内容总结
以上是互联网集市为您收集整理的为Python字典键添加前缀的最有效方法全部内容,希望文章能够帮你解决为Python字典键添加前缀的最有效方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。