2016-06-08 54 views
-2

我不是python中的大师。我不明白为什么我不能为这个def的这个词典赋予一个值的数组。在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)) 
+2

所以问题是,你有没有包括在这个问题一些其他的代码? – khelwood

+1

*代码抛出异常* - 哪个代码和哪个异常?你应该优先使用'setattr()''__dict__'。请参阅http://stackoverflow.com/questions/432786/how-can-i-assign-a-new-class-attribute-via-dict-in-python – cdarke

+0

@khelwood包括我所知道的。我不熟悉SDK,但它是开源的。 – fneron

回答

1

我转载

SOLUTION(HACK)这样的:

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()与项目在列表中,代码始终预期它将与包含的对象一起递归。但是字符串(也不是int)都不包含__dict__。 (我看到你在问题中的描述类似)。

我会在github上提到一个问题,指出这个问题。

除修补代码外,唯一的选择是创建一个包含所需项目的类。看起来他们不支持stringint,除了__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包含一个类或其他更复杂的(非json)对象,则会失败。

如果你想在本地修补他们的代码,或请他们来修补他们的代码,它可以被修改这样既接受元组和妥善处理intstring

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)

一个快速的方法来转换listdict

l = ['string1', 'string2', ] 
dictified_list = dict(zip(l, range(0, len(l)))) 
redirect.returnkeys(dictified_list) 
+0

我不希望我的名单成为关键。我想为一个key.self .__ dict __ ['returnKeys'] = return_keys其中return_keys =值数组 – fneron

+0

编辑...但我需要查看您使用的SDK以更好地了解您的问题。你可以在问题中包含错误信息吗? – rrauenza

+0

如何解决这个递归定义来处理字符串? – fneron