python monkey 猴子补丁技术编程,修改python json dumps方法。
1、猴子补丁就是不改变原有模块的内容的前提下,给原有模块新增方法或者修改原有模块。
一个模块的函数,如果希望改变函数的功能,不改变函数名,通常是库模块,你不可能去修改三方库的源码的,实施起来不方便,而且假设你直接在原处改了东西,别人继续用那个库模块,你没和别人提前打好招呼,那可能产生悲剧。
2、面向对象中,替换一个方法,继承重写方法就可以,当然也可以直接给原类的方法重新赋值一个函数对象,这也算猴子补丁。
面向过程是模块加函数的写法,不能继承。
此时做法可以是猴子补丁,就是重新给模块的某个函数赋值为一个自定义的函数对象。
3、以json为例,json只能解析基本的字符串 数字啥的,对大多数三方类型都不支持。
例如最常见的是从数据库中读取的时间字段,得到结果时候是datetime对象,此时直接json.dumps会造成解析错误。
但我原来谢了很多代码,之前的数据库没有时间类型的字段,所以现在有了时间后,原来的代码大面积出错,报TypeError: datetime.datetime(2018, 7, 12, 19, 44, 19, 141200) is not JSON serializable这个错误。
为了不一一修改,那就用monkey技术,
以下文件是我的utils包的__init__.py文件
这样做了后,
1)原来的所有其他地方的json.dumps代码不用做任何修改,就可以直接解析时间了,
2)json.dumps方法解析有中文的字典时候很蛋疼,必须设置ensure_ascii=False才能显示汉字,每次都加这几个字也很麻烦。现在用了monkey patch,原来所有没设置这个参数的json.dumps方法现在也能直接解析出中文了。
3)由于我所有代码几乎都import了utils包,直接在包里面执行了monkey_patch_json()方法,所以不用再去单独模块调用pacth函数了。
import json
from .log_manager import LogManager, get_logs_dir_by_folder_name
from .redis_manager import RedisManagerfrom . import decorators, config_ydf
from .currency_converter import CurrencyConverter
from .local_ip_query import get_host_ip
from datetime import datetime as _datetime
from datetime import date as _date def show_sys_path():
import sys
print(sys.path) class _CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, _datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, _date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj) def _dumps(obj, skipkeys=False, ensure_ascii=False, check_circular=True,
allow_nan=True, cls=_CustomEncoder, indent=None, separators=None,
default=None, sort_keys=False, **kw):
if (not skipkeys and ensure_ascii and
check_circular and allow_nan and
cls is None and indent is None and separators is None and
default is None and not sort_keys and not kw):
return json._default_encoder.encode(obj) # noqa
return cls(
skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular, allow_nan=allow_nan, indent=indent,
separators=separators, default=default, sort_keys=sort_keys, ).encode(obj) def monkey_patch_json():
json.dumps = _dumps monkey_patch_json() # pacth掉json模块的dumps方法
monkey不光可以patch三方库,其他方面也包括,比如原来写了个A类,现在想要试用B类的效果,只要你保证A和B的公有方法和属性的名字都是一样的,然后直接写A = B就可以了,
假如A类在其他各个文件中被使用了几百次,那么你不需要去每个地方修改一下,因为调用A,但实际使用的是B。
python monkey 猴子补丁技术编程,修改python json dumps方法。的更多相关文章
- python的猴子补丁monkey patch
monkey patch指的是在运行时动态替换,一般是在startup的时候. 用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/ ...
- Python之猴子补丁
1.在运行时,对属性,方法,函数等进行动态替换 2.其目的往往是为了通过替换,修改来增强,扩展原有代码的能力 #test2.py class Person: def get_score(self): ...
- python基础===猴子补丁
>>> class test: def A(self, x, y): return x+y >>> t = test() >>> t.A(10,2 ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表
好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...
- python json.dumps(output) ^ SyntaxError: invalid syntax
问题 下面代码在有些机器上执行正常,有些机器上执行报错: import json output={} print json.dumps(output) python代码报错: line 277 pri ...
- Python json.dumps 特殊数据类型的自定义序列化操作
场景描述: Python标准库中的json模块,集成了将数据序列化处理的功能:在使用json.dumps()方法序列化数据时候,如果目标数据中存在datetime数据类型,执行操作时, 会抛出异常:T ...
- Python下调用json.dumps中文显示问题解决办法
json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...
- python中eval()和json.dumps的使用
在python中通过requests.get(url)获取json数据,此时可能需要eval进行解析. # -*- coding: utf-8 -*- import requests r = requ ...
随机推荐
- [sql]sqlite3板子上安装运行报错
不管是apt-get install还是deb直接安装都抱如下错误: SQLite header and source version mismatch -- ***** -- *****
- Android——简易计算器(转)
这是我的第一个andriod小程序,第一次写用了半个月,第二次修改用了一天,第三次修改用了两个小时,现在终于比较满意了.现在我就直接分享一下我的源代码,由于思路比较简单,注释加的不多.采用的是相对布局 ...
- python-opencv 图像二值化,自适应阈值处理
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果. 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用 ...
- 枚举Enum和常量0之间的恩怨
1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...
- Redis客户端连接
Redis接受上配置监听TCP端口和Unix套接字客户端的连接,如果启用.当一个新的客户端连接被接受,如有以下操作进行: 客户端套接字置于非阻塞状态,因为Redis的使用复用和非阻塞I/O操作. TC ...
- 【jquery】jquery 实现许愿墙效果,可拖拽
最近整理做过的项目,发现有个许愿墙的效果,今天拿出来给大家分享下. 先简单的介绍下功能点: 随机显示背景图或背景色 出现的位置随机 可以通过拖拽改变位置 好了,附上代码: <!doctype h ...
- OAuth 授权
- [hadoop读书笔记] Hadoop下各技术应用场景
1.数据采集 对于数据采集主要分为三类,即结构化数据库采集,日志和文件采集,网页采集. 对于结构化数据库,采用Sqoop是合适的,可以实现结构化数据库中数据并行批量入库到hdfs存储.对于网页采集,前 ...
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...
- tensorflow的升级与版本管理
1 查看cuda与cudnn的版本 cuda一般安装在 /usr/local/cuda/ 路径下,该路径下有一个version.txt文档,里面记录了cuda的版本信息 cat /usr/local ...