在python運行環境中已加載模塊會存在於sys.modules,import 已加載模塊只是將sys.module中對應模塊引到local命名空間,多個文件多次import同一模塊內存中為同一模塊對象。
實現
因此我們可以通過修改已加載的模塊來達到修改標准庫的目的,gevent框架就是通過這種方式來監控調度方法的運行狀態,這裡我們也使用gevent的patch方式。
#monkey.py
# -*- coding: utf-8 -*-
import json
import datetime
class _JSONEncoder(json.JSONEncoder):
"""
JSONEncoder subclass that knows how to encode date/time.
"""
def default(self, o):
# See "Date Time String Format" in the ECMA-262 specification.
if isinstance(o, datetime.datetime):
r = o.isoformat()
if o.microsecond:
r = r[:23] + r[26:]
if r.endswith('+00:00'):
r = r[:-6] + 'Z'
return r
elif isinstance(o, datetime.date):
return o.isoformat()
else:
return super(_JSONEncoder, self).default(o)
def patch_json():
def dumps(obj, *args, **kwargs):
return _JSONEncoder(*args, **kwargs).encode(obj)
json.dumps = dumps
#test.py
# -*- coding: utf-8 -*-
import datetime
import json
import monkey
monkey.patch_json()
if __name__ == '__main__':
print json.dumps({'now': datetime.datetime.now()})
這樣就在沒有修改json模塊源碼的情況下使其支持dumps datetime類型,也算的上是非侵入式補丁了。