将数组分配给 python 中的键字典
Assign array to key dictionary in python
我不是 python 的专家。我不明白为什么我不能用这个定义为这个字典的键分配一个值数组。
我是这样使用sdk定义的。
order_obj = Order(None)
order_obj.customerIp("14.140.42.67")
order_obj.merchantRefNum(RandomTokenGenerator().generateToken())
order_obj.currencyCode("CAD")
order_obj.totalAmount("1125")
redirect = Redirect(None)
redirect.rel("on_success")
redirect.uri("http://outwander.ca:{}/redirect")
return_keys_list = []
return_keys_list.append('id')
return_keys_list.append('transaction.amount')
redirect.returnKeys(return_keys_list)
redirect_list = []
redirect_list.append(redirect.__dict__)
order_obj.redirect(redirect_list)
这是我使用的sdk中的具体定义
https://github.com/OptimalPayments/Python_SDK/blob/63e1ae662a4447bd65c907563eec9effc602dd74/src/PythonNetBanxSDK/HostedPayment/Redirect.py
'''
Property Return Keys
'''
def returnKeys(self, return_keys):
self.__dict__['returnKeys'] = return_keys
根据我的调试,将数组转换为 json 时会出现问题 sent.The 循环查找数组并尝试转换其中的元素(字符串) , 但由于默认情况下循环将每个给定参数视为数组,因此 returnKeys 参数被跳过...
'''
Serializing object
@param: Dictionary Object
@return: Serialized data
'''
def serialize(self, obj):
return (json.dumps(self.to_dictionary(obj)))
'''
Convert object to a dictionary
@param: POJO Object
@return: Dictionary Object
'''
def to_dictionary(self, obj):
obj_dict = dict()
for key in obj.__dict__.keys():
try:
if(type(obj.__dict__[key]) is list):
content = []
for count in range(0, obj.__dict__[key].__len__()):
content.append(
self.to_dictionary(obj.__dict__[key][count]))
obj_dict[key] = content
elif(isinstance(obj.__dict__[key], DomainObject)):
obj_dict[key] = self.to_dictionary(obj.__dict__[key])
else:
obj_dict[key] = obj.__dict__[key]
except KeyError:
pass
except AttributeError:
pass
return (obj_dict)
我可以毫无问题地将一个键分配给一个值,但是当我尝试将一个数组分配给一个键时,它不起作用,它只是从 json 输出中忽略了这个键。
解决方案(黑客)
order_obj = Order(None)
order_obj.customerIp("14.140.42.67")
order_obj.merchantRefNum(RandomTokenGenerator().generateToken())
order_obj.currencyCode("CAD")
order_obj.totalAmount("1125")
redirect = Redirect(None)
redirect.rel("on_success")
redirect.uri("http://outwander.ca:{}/redirect")
redirect.returnKeys(('id', 'transaction.amount'))
redirect_list = []
redirect_list.append(redirect.__dict__)
order_obj.redirect((redirect_list))
我转载了这个:
import json
class S:
def serialize(self, obj):
return (json.dumps(self.to_dictionary(obj)))
def to_dictionary(self, obj):
obj_dict = dict()
for key in obj.__dict__.keys():
try:
if(type(obj.__dict__[key]) is list):
content = []
for count in range(0, obj.__dict__[key].__len__()):
content.append(self.to_dictionary(obj.__dict__[key][count]))
obj_dict[key] = content
# elif(isinstance(obj.__dict__[key], DomainObject)):
# obj_dict[key] = self.to_dictionary(obj.__dict__[key])
else:
obj_dict[key] = obj.__dict__[key]
except KeyError:
pass
except AttributeError:
pass
return (obj_dict)
class A:
def __init__(self):
self.a = "1234"
self.b = (1, 2, 3, 4)
self.c = [1, 2, 3, 4]
self.d = { 1: 2, 3: 4}
print S().serialize(A())
输出:
{"a": "1234", "b": [1, 2, 3, 4], "d": {"1": 2, "3": 4}}
问题在于,当代码递归到 to_dictionary()
列表中的项目时,代码总是期望它递归到包含 __dict__
的对象。但是字符串(或 int)都不包含 __dict__
。 (我看到你在问题中也有类似的陈述。)
我会针对这个问题在 github 上提交一个问题。
除了修补他们的代码,您唯一的选择是创建一个 class 来包含您想要的项目。他们似乎不支持 string
或 int
,除非作为 __dict__
.
中的值
您可以使用 dict
作为列表:
class ReturnList:
def __init__(self):
self.list = { 1: "Item1", 2: "Item2" }
redirect.returnKeys(ReturnList())
附录:
等等!为什么元组案例有效?我认为你可以这样做:
redirect.returnKeys((1,2,3,4))
哦,我知道它为什么有效了。这是一个错误。它们专门处理 list
但不处理 tuple
,并且它不会递归 tuple
类型。由于 tuple
直接包含 json
-able 类型,它只是将其转换为 json
列表。如果您的 tuple
包含 class 或其他更复杂的(非 json
)对象,它将失败。
如果你想在本地修补他们的代码,或者要求他们修补他们的代码,可以像这样修改它以接受元组并正确处理 int
和 string
:
if(isinstance(obj.__dict__[key], (list, tuple)):
for count in range(0, obj.__dict__[key].__len__()):
item = obj.__dict__[key][count])
if not isinstance(item, (str, int)):
item = self.to_dictionary(obj.__dict__[key][count])
content.append(item)
为了可维护性(万一你得到了他们 SDK 的新版本),我可能会想出一种方法来使用 dict
而不是 list
并且只创建索引输入你的 dict
是整数,类似于 list
。即,foo = { 0: 'string1', 1: 'string2', 2: 'string3', }; redirect.returnKeys(foo)
将 list
转换为 dict
的快速方法是
l = ['string1', 'string2', ]
dictified_list = dict(zip(l, range(0, len(l))))
redirect.returnkeys(dictified_list)
我不是 python 的专家。我不明白为什么我不能用这个定义为这个字典的键分配一个值数组。
我是这样使用sdk定义的。
order_obj = Order(None)
order_obj.customerIp("14.140.42.67")
order_obj.merchantRefNum(RandomTokenGenerator().generateToken())
order_obj.currencyCode("CAD")
order_obj.totalAmount("1125")
redirect = Redirect(None)
redirect.rel("on_success")
redirect.uri("http://outwander.ca:{}/redirect")
return_keys_list = []
return_keys_list.append('id')
return_keys_list.append('transaction.amount')
redirect.returnKeys(return_keys_list)
redirect_list = []
redirect_list.append(redirect.__dict__)
order_obj.redirect(redirect_list)
这是我使用的sdk中的具体定义 https://github.com/OptimalPayments/Python_SDK/blob/63e1ae662a4447bd65c907563eec9effc602dd74/src/PythonNetBanxSDK/HostedPayment/Redirect.py
'''
Property Return Keys
'''
def returnKeys(self, return_keys):
self.__dict__['returnKeys'] = return_keys
根据我的调试,将数组转换为 json 时会出现问题 sent.The 循环查找数组并尝试转换其中的元素(字符串) , 但由于默认情况下循环将每个给定参数视为数组,因此 returnKeys 参数被跳过...
'''
Serializing object
@param: Dictionary Object
@return: Serialized data
'''
def serialize(self, obj):
return (json.dumps(self.to_dictionary(obj)))
'''
Convert object to a dictionary
@param: POJO Object
@return: Dictionary Object
'''
def to_dictionary(self, obj):
obj_dict = dict()
for key in obj.__dict__.keys():
try:
if(type(obj.__dict__[key]) is list):
content = []
for count in range(0, obj.__dict__[key].__len__()):
content.append(
self.to_dictionary(obj.__dict__[key][count]))
obj_dict[key] = content
elif(isinstance(obj.__dict__[key], DomainObject)):
obj_dict[key] = self.to_dictionary(obj.__dict__[key])
else:
obj_dict[key] = obj.__dict__[key]
except KeyError:
pass
except AttributeError:
pass
return (obj_dict)
我可以毫无问题地将一个键分配给一个值,但是当我尝试将一个数组分配给一个键时,它不起作用,它只是从 json 输出中忽略了这个键。
解决方案(黑客)
order_obj = Order(None)
order_obj.customerIp("14.140.42.67")
order_obj.merchantRefNum(RandomTokenGenerator().generateToken())
order_obj.currencyCode("CAD")
order_obj.totalAmount("1125")
redirect = Redirect(None)
redirect.rel("on_success")
redirect.uri("http://outwander.ca:{}/redirect")
redirect.returnKeys(('id', 'transaction.amount'))
redirect_list = []
redirect_list.append(redirect.__dict__)
order_obj.redirect((redirect_list))
我转载了这个:
import json
class S:
def serialize(self, obj):
return (json.dumps(self.to_dictionary(obj)))
def to_dictionary(self, obj):
obj_dict = dict()
for key in obj.__dict__.keys():
try:
if(type(obj.__dict__[key]) is list):
content = []
for count in range(0, obj.__dict__[key].__len__()):
content.append(self.to_dictionary(obj.__dict__[key][count]))
obj_dict[key] = content
# elif(isinstance(obj.__dict__[key], DomainObject)):
# obj_dict[key] = self.to_dictionary(obj.__dict__[key])
else:
obj_dict[key] = obj.__dict__[key]
except KeyError:
pass
except AttributeError:
pass
return (obj_dict)
class A:
def __init__(self):
self.a = "1234"
self.b = (1, 2, 3, 4)
self.c = [1, 2, 3, 4]
self.d = { 1: 2, 3: 4}
print S().serialize(A())
输出:
{"a": "1234", "b": [1, 2, 3, 4], "d": {"1": 2, "3": 4}}
问题在于,当代码递归到 to_dictionary()
列表中的项目时,代码总是期望它递归到包含 __dict__
的对象。但是字符串(或 int)都不包含 __dict__
。 (我看到你在问题中也有类似的陈述。)
我会针对这个问题在 github 上提交一个问题。
除了修补他们的代码,您唯一的选择是创建一个 class 来包含您想要的项目。他们似乎不支持 string
或 int
,除非作为 __dict__
.
您可以使用 dict
作为列表:
class ReturnList:
def __init__(self):
self.list = { 1: "Item1", 2: "Item2" }
redirect.returnKeys(ReturnList())
附录:
等等!为什么元组案例有效?我认为你可以这样做:
redirect.returnKeys((1,2,3,4))
哦,我知道它为什么有效了。这是一个错误。它们专门处理 list
但不处理 tuple
,并且它不会递归 tuple
类型。由于 tuple
直接包含 json
-able 类型,它只是将其转换为 json
列表。如果您的 tuple
包含 class 或其他更复杂的(非 json
)对象,它将失败。
如果你想在本地修补他们的代码,或者要求他们修补他们的代码,可以像这样修改它以接受元组并正确处理 int
和 string
:
if(isinstance(obj.__dict__[key], (list, tuple)):
for count in range(0, obj.__dict__[key].__len__()):
item = obj.__dict__[key][count])
if not isinstance(item, (str, int)):
item = self.to_dictionary(obj.__dict__[key][count])
content.append(item)
为了可维护性(万一你得到了他们 SDK 的新版本),我可能会想出一种方法来使用 dict
而不是 list
并且只创建索引输入你的 dict
是整数,类似于 list
。即,foo = { 0: 'string1', 1: 'string2', 2: 'string3', }; redirect.returnKeys(foo)
将 list
转换为 dict
的快速方法是
l = ['string1', 'string2', ]
dictified_list = dict(zip(l, range(0, len(l))))
redirect.returnkeys(dictified_list)