@@ -17,6 +17,11 @@ __version__ = '1.0.0'
1717import sys
1818IS_PY2 = sys.version[0 ] == ' 2'
1919
20+ try :
21+ from collections import OrderedDict
22+ except ImportError :
23+ from ordereddict import OrderedDict
24+
2025if IS_PY2:
2126 END_CHAR = ' e'
2227else :
@@ -57,7 +62,7 @@ def decode_list(bytes x, int f):
5762
5863
5964def decode_dict (bytes x , int f ):
60- r, f = {} , f + 1
65+ r, f = OrderedDict() , f + 1
6166 while x[f] != END_CHAR:
6267 k, f = decode_string(x, f)
6368 r[k], f = decode_func[x[f]](x, f)
@@ -89,6 +94,18 @@ def bdecode(bytes x):
8994 return r
9095
9196
97+ def encode (v , r ):
98+ tp = type (v)
99+ if tp in encode_func:
100+ return encode_func[tp](v, r)
101+ else :
102+ for tp, func in encode_func.items():
103+ if isinstance (v, tp):
104+ return func(v, r)
105+ raise BTFailure(" Unknown Type: %s " % tp)
106+
107+
108+
92109def encode_int (int x , list r ):
93110 r.extend((b' i' , str (x).encode(), b' e' ))
94111
@@ -109,19 +126,19 @@ def encode_string(x, list r):
109126def encode_list (x , list r ):
110127 r.append(b' l' )
111128 for i in x:
112- encode_func[ type (i)] (i, r)
129+ encode (i, r)
113130 r.append(b' e' )
114131
115132
116- def encode_dict (dict x , list r ):
133+ def encode_dict (x , list r ):
117134 r.append(b' d' )
118135 item_list = list (x.items())
119136 item_list.sort()
120137 for k, v in item_list:
121138 if isinstance (k, str ):
122139 k = k.encode()
123140 r.extend((str (len (k)).encode(), b' :' , k))
124- encode_func[ type (v)] (v, r)
141+ encode (v, r)
125142 r.append(b' e' )
126143
127144
@@ -132,11 +149,12 @@ encode_func = {
132149 list : encode_list,
133150 tuple : encode_list,
134151 dict : encode_dict,
152+ OrderedDict: encode_dict,
135153 bool : encode_bool,
136154}
137155
138156
139157def bencode (x ):
140158 r = []
141- encode_func[ type (x)] (x, r)
159+ encode (x, r)
142160 return b' ' .join(r)
0 commit comments