python笔记以及遇到的坑
29 Jul 2020
|
|
## pyyaml
-
pyyaml会有特殊的字符串转换,比如把yes转换成true,所以必须要把yes用引号括起来,或者定制yaml的构造函数,定制resolver,见参考链接的做法。
- 修改意见:主动引号括起来。或者换名字。定制resolver杀鸡牛刀
-
pyyaml对于一些key会加引号,当初由于上层应用不是标准yaml库解析,不能解析引号,所以采用了ruamel.yaml这个库,设置指定的dumper可以让字段不带引号,但是这个库的实现有很大问题,建议别用,而且你能搜到该库作者的很多SO网站回答推广,真有你的啊
- 不要用,出来混早晚要还的。千万别取巧
-
eventlet 0.25版本,会依赖dnspython库,这个库不能用2.0版本,接口不兼容
- 解决方法 固定dnspython在1.16或者升级eventlet到0.25.2以上
xml
之前以为xml库难用,其实是我不理解xml
hdfs的配置文件格式xml ,我需要解析一个配置项,改值
<property>
<name>dfs.client.failover.max.attempts</name>
<value>10</value>
<description>
if multiply namenodes are configured, it is the max retry times when the dfs client try to issue a RPC call. default is 75.
</description>
</property>
<property>
<name>dfs.ratelimiter.enabled</name>
<value>false</value>
<description>
ratelimiter enabled or not.
</description>
</property>
<property>
<name>limiter.bandwidth</name>
<value>62914560</value>
<description>
the limited highest bandwidth.
</description>
</property>
<property>
<name>limiter.iops</name>
<value>60000</value>
<description>
the limited highest iops.
</description>
</property>
主要是限流的改动,全去掉
依据我之前使用json yaml的经验,都是kv型的,怎么也改不了value字段的值
部门高手写了这么段代码,真暴力
xml是树型的,都是子节点,也就是说上面匹配到了text,那下一个肯定是value字段。。。
我之前的考虑就是奔着value字段改的。笨比了。
import sys
import xml.etree.ElementTree as ET
tree = ET.parse('hdfs-client.xml')
root = tree.getroot()
found = False
for child in root.iter():
if child.text == 'dfs.client.failover.max.attempts':
found = True
continue
if found:
child.text = "111"
found = False
break
tree.write("hdfs-client.xml")
- xml真是太让我头疼了
进程连接不上
- 网络问题
- 进程卡死
不要很自信的说网络问题。自己模块写的有问题进程卡死也是有可能的
Python核心语法
- 共享引用 在原处更改
is == 区别
-
小的整数和字符串缓存复用了 sys.getrefcount(1)
- 函数
- def 生成函数对象并复制给函数名 lambda直接返回函数
- yield 返回一个结果对象,保存上下文
- global 模块级变量 nonlocal 类似global,用于闭包
- 闭包,有点像c++里的函数对象 python中类实现__call__(self)也行,书上说这种写法过于重型
- 参数
- 传参是引用还是传值 In-Place Change
- 避免 主动传值[:],传tuple
- 任一参数*pargs kargs pargs是元组 **kargs是字典,用来解包 引申-》Keyword-Only 用来指定元组和字典。单独使用做占位参数,则需要调用方保证指定所有入参(a=8这种)注意必须是最后一个参数
- 再谈函数
- map(functor, iterable-obj) std::for_each filter std::remove functools.reduce std::acc,
- 迭代,next()语法糖
- yield,生成器,for,range这些都是生成器函数
- 生成器表达式
- 可迭代对象
- 模块
- import from from 危害,模块冲突
- import 决定将__name__ = ‘main‘解释成模块还是函数
- 类
- 运算符重载
- __str__
- __repr__
- 继承,真正意义上的接口。不会调用基类构造函数
from abc import abstractmethod
@abstractmethod
__getitem__ 买一送一
_iter__
__next__
__del__
__getaddr__ 属性钩子
__slot__
- 装饰器与元类
- 类做装饰器
- 函数装饰类 元类
class tracer:
def __init__(self, func):
self.func = func;
def __call__(self,*args):
self.func(*args)
- 异常
- try except finally
- raise assert
- with as
- with 环境管理协议 enter exit
- 主动释放with内资源。包括多线程的锁条件变量之类dir
ref
- https://stackoverflow.com/questions/34282703/yes-or-no-dumping-as-yes-or-no-in-pyyaml
- https://github.com/eventlet/eventlet/issues/619