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 ...
随机推荐
- CPP_封装_继承_多态
类的三方法:封装,继承,多态.封装:使用一整套方法去创建一个新的类型,这叫类的封装.继承:从一个现有的类型基础上,稍作改动,得到一个新的类型的方法,叫类的继承.多态:当有几个不同的子类对象时,对象调用 ...
- Hive Tunning 补充 关于bucket
在前面的几篇文章当中一直有一个概念bucketing不清楚到底是怎么回事. 网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了 ...
- 在 Android studio 中 配置Gradle 做到 “根据命令行提示符生成指定versionCode, versionName,指定apk的打包输出路径”
需求: 1. 使用 Android studio ,使用 gradle 进行构建 2. 在实际开发中,我们需要使用jenkins进行打包.就需要配置我们的 gradle 脚本以支持参数化的方式. 3. ...
- jquery.nestable.min.js可拖动标签
主容器为一个叫div的classname为dd的东西. 只要对这个主容器进行捕获加上一个方法 nestable就可以了. 可以给的属性为 serialize 直接以字符串的形式给入,意思就是按 ...
- visual studio 2015 2017 key vs2015 vs2017密钥
Visual Studio Professional 2015简体中文版(专业版) KEY:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Studio Enterprise ...
- @Resource、@Autowired跟default-autowire区别联系
@Resource.@Autowired和default-autowire区别联系 今天看了一工程,里面既有default-autowire,又有@Autowired,还有@Resource.我就不明 ...
- linux守护进程编写实践
主要参考:http://colding.bokee.com/5277082.html (实例程序是参考这的) http://wbwk2005.blog.51cto.com/2215231/400260 ...
- struts2+hibernate(分页实现)
//Dao类中实现了list集合和pagetotal方法 package zjf.strhib.Dao; import java.util.ArrayList; import java.util.Li ...
- 自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
项目技术总结: VoiceToText的具体使用方法: 语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安 ...
- android下通过app名字打开程序(activity)链接
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00004599 1.手机遥控器模拟快捷键启动app 刚开 ...