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 ...
随机推荐
- DRUPAL8模版命名规则
DRUPAL8模版命名规则 xiaopang 星期一, 04/08/2013 - 20:04 发布 我想了半个小时,想怎么清楚简单的为大家解释drupal8的模版命名规则,但是很显然,我失败了,但 ...
- 更快的方式实现 PHP 数组去重
概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组.这个函数大多数情况下都能工作得很好.但是,如果你尝试在一个大的数组里使用array_u ...
- 【转】两款 Web 前端性能测试工具
前段时间接手了一个 web 前端性能优化的任务,一时间不知道从什么地方入手,查了不少资料,发现其实还是蛮简单的,简单来说说. 一.前端性能测试是什么? 前端性能测试对象主要包括: HTML.CSS.J ...
- Sword libcurl使用
libcurl编译 >> ./configure --prefix=/opt/soft/curl --disable-ldap --disable-ldaps >> make ...
- c 预处理的宏定义
概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所 ...
- window.location.href 跳转失败
我恨这个问题,因为困扰已久,做为一个不称职的半开发人员,对前端非常不熟,程度仅限于alert调试的水平 这个问题似乎是IE的一个傻逼哄哄的BUG引起的,在AJAX盛行的今天,当在返回success状态 ...
- 计算机网络——链路层协议
一. 链路层的功能 可靠交付:在高差错的链路,如无线链路,可以进行可靠交付:对于其它的有线,可以是多余的: 流量控制:防止接收方的缓存区溢出,帧丢失: 差错检测与差错纠正:在硬件上实现了: 二.多路访 ...
- Ubuntu 安装IntelliJ IDEA
1. 下载IDEA 官网地中:http://www.jetbrains.com/idea/download/index.html 选择对应操作系统的版本.下载后,我的文件名称为: idea ...
- Java反射 Introspector
一.解释 Introspector 内省,自我检查. 位于java中的java.beans包中,其原文说明文为: The Introspector class provides a standard ...
- TensorFlow:tf.contrib.layers.xavier_initializer
xavier_initializer( uniform=True, seed=None, dtype=tf.float32 ) 该函数返回一个用于初始化权重的初始化程序 “Xavier” .这个初始化 ...