Skip to content

Commit 857e74a

Browse files
authored
Merge pull request #12 from MeiK2333/master
Support python3
2 parents 5c0e852 + 77ca50a commit 857e74a

9 files changed

Lines changed: 62 additions & 40 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ python-dubbo支持以下Java类型的参数,表格右边一列代表了在Pyto
3535
| 浮点类型 | float, double | float |
3636
| 字符串类型 | java.lang.String | str |
3737
| 列表类型 | Collection & Array | [] |
38+
| 时间类型 | java.util.Date | datetime |
3839
| 自定义的对象类型 | java.lang.Object |_具体使用方法如下所示_|
3940

4041
##### 使用Java的对象类型

dubbo/client.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import threading
2323
import time
2424
import random
25-
from urllib import quote
25+
from urllib.parse import quote
2626

2727
from kazoo.client import KazooClient
2828
from kazoo.protocol.states import KazooState
@@ -120,16 +120,17 @@ def __init__(self, hosts, application_name='search_platform'):
120120
:param hosts: Zookeeper的地址
121121
:param application_name: 当前客户端的名称
122122
"""
123+
self.hosts = {}
124+
self.weights = {}
125+
self.application_name = application_name
126+
self.lock = threading.Lock()
127+
123128
zk = KazooClient(hosts=hosts)
124129
# 对zookeeper连接状态的监控
125130
zk.add_listener(self.state_listener)
126131
zk.start()
127132

128133
self.zk = zk
129-
self.hosts = {}
130-
self.weights = {}
131-
self.application_name = application_name
132-
self.lock = threading.Lock()
133134

134135
def state_listener(self, state):
135136
"""
@@ -186,11 +187,11 @@ def _get_providers_from_zk(self, path, interface):
186187
:return:
187188
"""
188189
providers = self.zk.get_children(path, watch=self._watch_children)
189-
providers = filter(lambda provider: provider['scheme'] == 'dubbo', map(parse_url, providers))
190+
providers = list(filter(lambda provider: provider['scheme'] == 'dubbo', list(map(parse_url, providers))))
190191
if not providers:
191192
raise RegisterException('no providers for interface {}'.format(interface))
192193
self._register_consumer(providers)
193-
self.hosts[interface] = map(lambda provider: provider['host'], providers)
194+
self.hosts[interface] = list(map(lambda provider: provider['host'], providers))
194195

195196
def _get_configurators_from_zk(self, interface):
196197
"""
@@ -200,7 +201,7 @@ def _get_configurators_from_zk(self, interface):
200201
"""
201202
configurators = self.zk.get_children(DUBBO_ZK_CONFIGURATORS.format(interface), watch=self._watch_configurators)
202203
if configurators:
203-
configurators = map(parse_url, configurators)
204+
configurators = list(map(parse_url, configurators))
204205
conf = {}
205206
for configurator in configurators:
206207
conf[configurator['host']] = configurator['fields'].get('weight', 100) # 默认100
@@ -217,12 +218,12 @@ def _watch_children(self, event):
217218
interface = path.split('/')[2]
218219

219220
providers = self.zk.get_children(path, watch=self._watch_children)
220-
providers = filter(lambda provider: provider['scheme'] == 'dubbo', map(parse_url, providers))
221+
providers = list(filter(lambda provider: provider['scheme'] == 'dubbo', list(map(parse_url, providers))))
221222
if not providers:
222223
logger.debug('no providers for interface {}'.format(interface))
223224
self.hosts[interface] = []
224225
return
225-
self.hosts[interface] = map(lambda provider: provider['host'], providers)
226+
self.hosts[interface] = list(map(lambda provider: provider['host'], providers))
226227
logger.debug('{} providers: {}'.format(interface, self.hosts[interface]))
227228

228229
def _watch_configurators(self, event):
@@ -239,7 +240,7 @@ def _watch_configurators(self, event):
239240
configurators = self.zk.get_children(DUBBO_ZK_CONFIGURATORS.format(interface),
240241
watch=self._watch_configurators)
241242
if configurators:
242-
configurators = map(parse_url, configurators)
243+
configurators = list(map(parse_url, configurators))
243244
conf = {}
244245
for configurator in configurators:
245246
conf[configurator['host']] = configurator['fields'].get('weight', 100)
@@ -303,7 +304,7 @@ def _routing_with_wight(self, interface):
303304
hosts_weight.append(int(weights.get(host, 100)))
304305

305306
hit = random.randint(0, sum(hosts_weight) - 1)
306-
for i in xrange(len(hosts)):
307+
for i in range(len(hosts)):
307308
if hit <= sum(hosts_weight[:i + 1]):
308309
return hosts[i]
309310

dubbo/codec/decoder.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,20 @@ def _read_utf(self, length):
185185
:return:
186186
"""
187187
value = u''
188-
for i in xrange(length):
188+
for i in range(length):
189189
ch = self.read_byte()
190190
if ch < 0x80:
191-
value += unichr(ch)
191+
value += chr(ch)
192192
elif (ch & 0xe0) == 0xc0:
193193
ch1 = self.read_byte()
194-
value += unichr(((ch & 0x1f) << 6) + (ch1 & 0x3f))
194+
value += chr(((ch & 0x1f) << 6) + (ch1 & 0x3f))
195195
elif (ch & 0xf0) == 0xe0:
196196
ch1 = self.read_byte()
197197
ch2 = self.read_byte()
198-
value += unichr(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f))
198+
value += chr(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f))
199199
else:
200200
raise ValueError('Can\'t parse utf-8 char {}'.format(ch))
201-
return value.encode('utf-8') # 将unicode转化为str类型
201+
return value
202202

203203
@ranges((0x00, 0x1f), (0x30, 0x33), 0x52, ord('S'))
204204
def read_string(self):
@@ -263,7 +263,7 @@ def read_class(self):
263263

264264
field_length = self.read_int()
265265
field_names = []
266-
for i in xrange(field_length):
266+
for i in range(field_length):
267267
field_names.append(self.read_string())
268268
self.field_names.append(field_names)
269269
return self.read_object()
@@ -295,23 +295,23 @@ def read_list(self):
295295
if 0x70 <= value <= 0x77:
296296
_type = self.read_type() # type对于Python来说没有用处
297297
length = value - 0x70
298-
for i in xrange(length):
298+
for i in range(length):
299299
result.append(self.read_next())
300300
# 固定长度的无类型短小列表
301301
elif 0x78 <= value <= 0x7f:
302302
length = value - 0x78
303-
for i in xrange(length):
303+
for i in range(length):
304304
result.append(self.read_next())
305305
# 固定长度的有类型列表
306306
elif value == 0x56:
307307
_type = self.read_type()
308308
length = self.read_int()
309-
for i in xrange(length):
309+
for i in range(length):
310310
result.append(self.read_next())
311311
# 固定长度的无类型列表
312312
elif value == 0x58:
313313
length = self.read_int()
314-
for i in xrange(length):
314+
for i in range(length):
315315
result.append(self.read_next())
316316
# 可变长度的有类型列表
317317
elif value == 0x55:
@@ -423,7 +423,7 @@ def read_error(self):
423423

424424
field_length = self.read_int()
425425
field_names = []
426-
for i in xrange(field_length):
426+
for i in range(field_length):
427427
field_names.append(self.read_string())
428428
self.field_names.append(field_names)
429429

dubbo/codec/encoder.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
* java.lang.Object
3131
"""
3232
import struct
33+
from datetime import datetime
3334

3435
from dubbo.common.constants import MIN_INT_32, MAX_INT_32, DEFAULT_REQUEST_META
3536
from dubbo.common.exceptions import HessianTypeError
@@ -46,7 +47,7 @@ def __init__(self, path, values=None):
4647
:param path: Java对象的路径,例如:java.lang.Object
4748
:param values: 可以在创建对象时就进行赋值
4849
"""
49-
if not isinstance(path, (str, unicode)):
50+
if not isinstance(path, str):
5051
raise ValueError('Object path {} should be string type.'.format(path))
5152
self.__path = path
5253
if not isinstance(values, dict):
@@ -57,7 +58,7 @@ def __getitem__(self, key):
5758
return self.__values[key]
5859

5960
def __setitem__(self, key, value):
60-
if not isinstance(key, (str, unicode)):
61+
if not isinstance(key, str):
6162
raise ValueError('Object key {} should be string type.'.format(key))
6263
self.__values[key] = value
6364

@@ -133,8 +134,10 @@ def _get_class_name(self, _class):
133134
return 'J'
134135
elif isinstance(_class, float):
135136
return 'D'
136-
elif isinstance(_class, (str, unicode)):
137+
elif isinstance(_class, str):
137138
return 'L' + 'java/lang/String' + ';'
139+
elif isinstance(_class, datetime):
140+
return 'Ljava/util/Date;'
138141
elif isinstance(_class, Object):
139142
path = _class.get_path()
140143
path = 'L' + path.replace('.', '/') + ';'
@@ -180,7 +183,7 @@ def _encode_request_body(self):
180183
body.append(ord('Z'))
181184

182185
# 因为在上面的逻辑中没有对byte大小进行检测,所以在这里进行统一的处理
183-
for i in xrange(len(body)):
186+
for i in range(len(body)):
184187
body[i] = body[i] & 0xff
185188
return body
186189

@@ -277,6 +280,21 @@ def _encode_float(value):
277280
result.append(bits)
278281
return result
279282

283+
@staticmethod
284+
def _encode_datetime(value):
285+
result = []
286+
result.append(0x4a)
287+
value = int(value.timestamp() * 1000)
288+
result.append(value >> 56)
289+
result.append(value >> 48)
290+
result.append(value >> 40)
291+
result.append(value >> 32)
292+
result.append(value >> 24)
293+
result.append(value >> 16)
294+
result.append(value >> 8)
295+
result.append(value)
296+
return result
297+
280298
@staticmethod
281299
def _encode_utf(value):
282300
"""
@@ -308,7 +326,7 @@ def _encode_str(self, value):
308326
result = []
309327
# 在进行网络传输操作时一律使用unicode进行操作
310328
if isinstance(value, str):
311-
value = value.decode('utf-8')
329+
value = value
312330
length = len(value)
313331
if length <= 0x1f:
314332
result.append(0x00 + length)
@@ -415,8 +433,10 @@ def _encode_single_value(self, value):
415433
elif isinstance(value, float):
416434
return self._encode_float(value)
417435
# 字符串类型
418-
elif isinstance(value, (str, unicode)):
436+
elif isinstance(value, str):
419437
return self._encode_str(value)
438+
elif isinstance(value, datetime):
439+
return self._encode_datetime(value)
420440
# 对象类型
421441
elif isinstance(value, Object):
422442
return self._encode_object(value)

dubbo/common/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import struct
2424
import threading
2525
from sys import platform, maxsize
26-
from urlparse import urlparse, unquote, parse_qsl
26+
from urllib.parse import urlparse, unquote, parse_qsl
2727

2828
import logging
2929

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
kazoo==2.4.0
1+
kazoo==2.6.0

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@
3737
'Programming Language :: Python :: 2.7',
3838
],
3939
install_requires=[
40-
'kazoo==2.4.0'
40+
'kazoo==2.6.0'
4141
],
4242
)

tests/dubbo_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,13 @@ def _run_num(self):
129129

130130
# @unittest.skip('skip performance test')
131131
def test_multi_threading(self):
132-
for i in xrange(10):
132+
for i in range(10):
133133
thread = threading.Thread(target=self._run_num)
134134
thread.start()
135135

136136
# @unittest.skip('skip performance test')
137137
def test_performance(self):
138-
for i in xrange(10):
138+
for i in range(10):
139139
self.dubbo.call('echo18')
140140

141141
def test_auto_rule(self):
@@ -265,15 +265,15 @@ def test_pc(self):
265265
result = spu_query_provider.call('query', spu_query_request)
266266
# pretty_print(result)
267267
total = result['totalCount']
268-
print total
269-
print len(result['dataList'])
268+
print(total)
269+
print(len(result['dataList']))
270270

271271
data_list = result['dataList']
272272
for data in data_list:
273273
spu_id = data['spuId']
274274
spu_desc_request = Object('com.qianmi.pc.item.api.spu.request.SpuDescriptionGetRequest')
275275
spu_desc_request['spuId'] = spu_id
276-
print spu_id
276+
print(spu_id)
277277
spu_desc_request['chainMasterId'] = 'A000000'
278278
pretty_print(spu_query_provider.call('getDescription', spu_desc_request))
279279

tests/run_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,17 @@ def test_run_default(self):
4949
def test_run(self):
5050
zk = ZkRegister('127.0.0.1:2181')
5151
dubbo_cli = DubboClient('me.hourui.echo.provider.Echo', zk_register=zk)
52-
for i in xrange(4):
52+
for i in range(4):
5353
thread = threading.Thread(target=run, args=(dubbo_cli,))
5454
thread.start()
5555

5656

5757
def pretty_print(value):
58-
print json.dumps(value, ensure_ascii=False, indent=4, sort_keys=True)
58+
print(json.dumps(value, ensure_ascii=False, indent=4, sort_keys=True))
5959

6060

6161
def run(_dubbo):
62-
for j in xrange(1000):
62+
for j in range(1000):
6363
_dubbo.call('echo18')
6464

6565

0 commit comments

Comments
 (0)