直系领导手把手带我Refactor代码,纠正下以前的坏习惯,记录下来
目录
2.不要把所有的参数说明都写在代码中,给一个link ref就好
3.不要把debug时的print等注释掉,要么删除,要么加上debug或者verbose变量:
1.try-except后一定要处理except:
'''
原始写法如下:
目的:pic1是opencv读取的图片,如果为空返回一个[],但是不为空时为numpy,使用if not会报错,就采用了try的方式,这是练leetcode学会的,用try规避报错。
但是这里这样写就导致了except没有做任何事情,如果发生的其他错误,风险极大
'''
try:
if not pic1:return
except:
pass
'''
修改:
pic1如果为空返回None而不是[],
'''
if pic1 is None:return
我很习惯用try去跳脱错误,但是这是不好的方式,改正!改正!
2.不要把所有的参数说明都写在代码中,给一个link ref就好
'''
原始写法如下:
'''
'''
image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
...
'''
lines = cv.HoughLinesP(img_canny, 1.0, np.pi / 180, threshold=30 + 5 * i, minLineLength=40, maxLineGap=5)
'''
改为:
'''
'''
HoughLinesP参数 ref:https://blog.csdn.net/dcrmg/article/details/78880046
'''
lines = cv.HoughLinesP(img_canny, 1.0, np.pi / 180, threshold=30 + 5 * i, minLineLength=40, maxLineGap=5)
3.不要把debug时的print等注释掉,要么删除,要么加上debug或者verbose变量:
'''
原始代码,imshow被注释掉了,这是在debug过程中可视化展示调节的内容
'''
def main(json_path):
# 此处省略。。。
# cv.imshow('image', cv.resize(pic1, (500, 400)))
# cv.waitKey(0)
'''
改动:直接删除是一种方法,另一种方法是加上参数
main不光加上了verbose这个参数,还加上了*,目的是区分该debug的参数
'''
def main(json_path,*,verbose=False):
# 此处省略。。。
if verbose:
cv.imshow('image', cv.resize(pic1, (500, 400)))
cv.waitKey(0)
这个其实比较简单,只是要养成这种习惯,不然代码会debug过程中越来越乱,尤其是有些debug内容又不想删掉就难以区分
4.利用枚举清晰逻辑
枚举类似于结构体,这样虽然代码看起来复杂了一些,但是逻辑更加清晰了
'''
原始代码:
'''
image = image[...,0] # 读取蓝色通道
'''
改动,创建一个py文件存放枚举数据,使用枚举变量进行读取,一眼就能看出是读取蓝色通道,可去掉注释了
from enum import IntEnum
class Channel(IntEnum):
BLUE = 0
GREEN = 1
RED = 2
'''
image = image[..., Channel.BLUE] # 读取蓝色通道
5.习惯使用f-string与pep8进行format
f-string谁用谁知道,真好用
按代码规范format养成习惯就行
6.命名规范
(1)类名一般是首字母大写:比如CameraCalibration
(2)变量名一般用下划线:比如camera_param
(3)python习惯:一个下划线表示self的变量,两个下划线表示内部方法,一般而言在init中初始化的变量都是带下划线的:
def __init__(self, aruco_detector, image_size):
self._ARUCO_DETECTOR = aruco_detector
self._IMG_SIZE = image_size
(4)全局变量全大写,以前java也是如此
(5)变量名字一眼要能读懂什么意思,比如camera_params就是相机的参数