2016-06-08 26 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