Skip to content

Commit 2b09654

Browse files
committed
新增python trick中的复杂dict打印功能
1 parent 62b8f44 commit 2b09654

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Code segment are often used in deep learning algorithms(pytorch/numpy)
5151
收集开发中常用的python稍微高级点的trick,
5252
1. 如何将dict参数自动变成类内部属性?
5353
2. 如何将字典变成可以属性访问?
54+
3. 复杂dict如何打印的漂亮,更有层次感?
5455

5556

5657
### 7 numpy_trick

Diff for: docs/detail.md

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ print(iou)
101101
通过self.__ dict __.update实现
102102
2. 如何将字典变成可以属性访问?
103103
有两种方式:可以直接用第三方库addict实现;也可以自己简化写,核心就是递归+__ getattr __方法
104+
3. 复杂dict如何打印的漂亮,更有层次感?
105+
借助yapf库实现的pep8自动格式化字符串即可,我们要做的仅仅需要把dict按照行排列切割好就行,后面的每行如何格式化采用pep8标准自动执行
104106

105107

106108
## 7 numpy_trick

Diff for: library/c6_python_trick.py

+61
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
# deep eyes
33

44
# 汇集 python 相关的trick写法
5+
try:
6+
from yapf.yapflib.yapf_api import FormatCode
7+
except:
8+
FormatCode = None
59

610

711
# 1. 如何将dict参数自动变成类内部属性?
@@ -35,3 +39,60 @@ def _hook(self, item):
3539
# 在.a和['a']时候自动调用
3640
def __getattr__(self, item):
3741
return self[item]
42+
43+
44+
# 3. 复杂dict如何打印的漂亮,更有层次感?
45+
# from mmcv 简化版本
46+
def pretty_text(src_dict):
47+
48+
def _format_basic_types(k, v):
49+
if isinstance(v, str):
50+
v_str = f"'{v}'"
51+
else:
52+
v_str = str(v)
53+
54+
attr_str = f'{str(k)}={v_str}'
55+
56+
return attr_str
57+
58+
def _format_list(k, v):
59+
if all(isinstance(_, dict) for _ in v):
60+
v_str = '[\n'
61+
v_str += '\n'.join(
62+
f'dict({_format_dict(v_)}),'
63+
for v_ in v).rstrip(',')
64+
attr_str = f'{str(k)}={v_str}'
65+
attr_str = attr_str + ']'
66+
else:
67+
attr_str = _format_basic_types(k, v)
68+
return attr_str
69+
70+
def _format_dict(input_dict, outest_level=False):
71+
r = ''
72+
s = []
73+
74+
for idx, (k, v) in enumerate(input_dict.items()):
75+
end = '' if outest_level else ',' # 需要符合pep8格式
76+
if isinstance(v, dict):
77+
v_str = '\n' + _format_dict(v) # 递归调用
78+
attr_str = f'{str(k)}=dict({v_str}'
79+
attr_str = attr_str + ')' + end
80+
elif isinstance(v, list):
81+
attr_str = _format_list(k, v) + end
82+
else:
83+
attr_str = _format_basic_types(k, v) + end
84+
85+
s.append(attr_str)
86+
r += '\n'.join(s)
87+
return r
88+
# outest_level 最外层
89+
# 仅仅需要把dict按照行排列切割好就行,后面的每行如何格式化采用pep8标准自动执行
90+
text = _format_dict(src_dict, outest_level=True)
91+
# 借助yapf库实现的pep8格式化字符串功能实现
92+
yapf_style = dict(
93+
based_on_style='pep8',
94+
blank_line_before_nested_class_or_def=True,
95+
split_before_expression_after_opening_paren=True)
96+
text, _ = FormatCode(text, style_config=yapf_style, verify=True)
97+
98+
return text

Diff for: tools/c6_python_trick.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ def demo_2():
2121
print(cd.c.f.a)
2222

2323

24+
def demo_3():
25+
cd = dict(a=1, b=[1, 2], c=dict(d=1, e=[2, 3], f=dict(a=1), aa=1, bb=1, cc=2, dd=dict(a=[1, 2, 3, 4],
26+
ee=dict(d=1, e=[2, 3],
27+
f=dict(a=1), aa=1,
28+
bb=1, cc=2, dd=dict(
29+
a=[1, 2, 3, 4]))),
30+
kk=dict(a=[1, 2, 3, 4], ee=dict(d=1, e=[2, 3],
31+
f=dict(a=1), aa=1,
32+
bb=1, cc=2, dd=dict(
33+
a=[1, 2, 3, 4])))))
34+
cd_str = pretty_text(cd)
35+
print(cd_str)
36+
37+
2438
if __name__ == '__main__':
2539
# demo_1()
26-
demo_2()
40+
# demo_2()
41+
demo_3()

0 commit comments

Comments
 (0)