清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#encoding:utf8
from datetime import datetime
from sqlalchemy.engine import RowProxy
def Print(object):
print object
for key, value in object.__dict__.items():
print '%-20r:%-r'%(key, value)
def Replicate(dir=True, debug=False, \
tcls=None, tobj=None, mcls=None, mobj=None, \
tencoding='utf-8', mencoding='unicode', \
include=None, exclude=None, dt=None, union=True,\
callback_list=None):
src_obj = tobj if dir else mobj
dst_obj = mobj if dir else tobj
src_cls = tcls if dir else mcls
dst_cls = mcls if dir else tcls
def get_source_fields(debug, src_obj, include, exclude):
if isinstance(src_obj, RowProxy):
src_obj_items = src_obj.items()
else:
src_obj_items = src_obj.__dict__.items()
inc_keys = set(include) if include else \
set([item[0] for item in src_obj_items])
exc_keys = set(exclude) if exclude else set()
com_keys = inc_keys & exc_keys
dif_keys = inc_keys - com_keys
fields = dict()
for key in dif_keys:
value = getattr(src_obj, key)
if value is None:
continue
fields[key] = value
return fields
def handle_ignore(union, key, dst_obj):
rv = False
try:
getattr(dst_obj, key)
except Exception, e:
if not union:
rv = True
return rv
def handle_coding(dir, value):
if dir and \
isinstance(value, basestring) and \
not isinstance(value, unicode):
value = value.decode(tencoding)
if not dir and \
isinstance(value, unicode):
value = value.encode(tencoding)
return value
def handle_datetime(key, value, dt):
str_to_dt = lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")
dt_to_str = lambda x: x.strftime('%Y-%m-%d %H:%M:%S')
if key in dt:
value = str_to_dt(value) if dir else dt_to_str(value)
return value
if src_obj is None:
raise Exception('source obj should not be None!')
dst_obj = dst_obj if dst_obj else dst_cls()
fields = get_source_fields(debug, src_obj, include, exclude)
for key, value in fields.items():
if handle_ignore(union, key, dst_obj):
continue
value = handle_coding(dir, value)
value = handle_datetime(key, value, dt)
setattr(dst_obj, key, value)
if callback_list:
for callback in callback_list:
callback(dst_obj)
if debug:
Print(dst_obj)
return dst_obj