python中self做前缀_为Python字典键添加前缀的最有效方法

所以我发现自己需要在

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值