Python踩坑指南(第三季)

在代码维护的过程中,发现需要对某个变量进行保护,不允许调用修改,之前我一直使用的是_x或者__x的形式,这样做只是避免展示,但是如果想要强行修改,还是可以变更的,为了保证高安全性,这边可以参考@property的形式:

1
2
3
4
5
6
7
8
9
10
11
12
class test(object):
"""docstring for test"""
def __init__(self, arg):
self._arg = arg

@property
def arg(self):
return self._arg

@arg.setter
def set_arg(self,val):
self._arg=val

当想修改arg的值的时候,必须通过set_arg去修改,虽然仍然可以通过改_arg的方式,但是相对直接暴露多了一层保护;除此之外,它还可以实现一定的逻辑转化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
In [10]: class test(object):
...: """docstring for test"""
...: def __init__(self, arg):
...: self._arg = arg
...: self._half_arg = arg/2
...:
...: @property
...: def arg(self):
...: return self._arg
...:
...: @property
...: def half_arg(self):
...: return self._half_arg
...:
...: @arg.setter
...: def set_arg(self,val):
...: self._arg=val
...: self._half_arg = val/2
...:

In [11]: t=test(10)

In [12]: t.arg
Out[12]: 10

In [13]: t.half_arg
Out[13]: 5.0

In [14]: t.set_arg=20

In [15]: t.arg
Out[15]: 20

In [16]: t.half_arg
Out[16]: 10.0

利用None!=None的性质可以进行快速去None,比如:

1
a = df[df.label_y==df.label_y]

可以快速的把label_y=None的列进行剔除,比dropna要快一些。


traceback可以很好的把错误信息进行暴露,

1
2
3
4
try:
1/0
except Exception,e:
print e

如果这样包起来错误的花,输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错

如果使用traceback:

1
2
3
4
try:
1/0
except Exception as e:
traceback.print_exc()

输出结果是:

1
2
3
4
5
6
7
Traceback (most recent call last): 

File “test_traceback.py”, line 3, in

1/0

ZeroDivisionError: integer division or modulo by zero

这个还不是精髓的,如果说在一个服务中,或者大型项目中,我们不会时时刻刻去盯着进程,还可以进行落日志,方便后续查看:

1
2
3
4
5
6
traceback.print_exc(file=open('tb.txt','w+')) 
import time
try:
1/0
except Exception as e:
traceback.print_exc(file=open(str(time.time())+'.txt','w+'))

欢迎大家关注我的个人bolg知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过邮箱发消息给我。

打赏的大佬可以联系我,赠送超赞的算法资料