1 ''' 2 检查Python程序的一些基本规范,例如,运算符两测是否有空格,是否每次只导入一个模块,在不同的功能模块之间是否有空行,注释是否够多,等等 3 ''' 4 import sys 5 import re 6 7 def checkFormats(lines,desFileName): 8 fp=open(desFileName,'w') 9 for i, line in enumerate(lines): 10 print('='*30) 11 print('Line:',i+1) 12 if line.strip().startwith('#'): 13 print(' '*10+'Comments.Pass.') 14 fp.write(line) 15 continue 16 flag=True 17 #check operator symbols 18 symbols=[',','+','-','*','/','//','**','>>','<<','+=','-=','*=','/='] 19 temp_line=line 20 for symbol in symbols: 21 pattern=re.compile(r's*'+re.escape(symbol)+r's*') 22 temp_lie=pattern.split(temp_line) 23 sep=' '+symbol+' ' 24 temp_line=sep.join(temp_line) 25 if line !=temp_line: 26 flag=False 27 print(' '*10+'You may miss some blank spaces in this line.' ) 28 #check import statement 29 if line.strip().startwith('import'): 30 if ',' in line: 31 flag = False 32 print(' '*10+"You'd bbetter import one module at a time.") 33 temp_line=line.strip() 34 modules=modules.strip() 35 pattern=re.compile(r's*,s*') 36 modules=pattern.split(modules) 37 temp_line='' 38 for module in modules: 39 temp_line +=line[:line.index('import')] + 'import '+module+' ' 40 line=temp_line 41 pri_line=lines[i-1].strip() 42 if pri_line and(not pri_line.startwith('import'))and (not pri_line.startwith('#')): 43 falg=False 44 print(' '*10+'You should add a blank line before this line.') 45 line=' '+line 46 after_line=lines[i+1].strip() 47 if after_line and(not after_line.startwith('import')): 48 flag=False 49 print(' '*10+'You should add a blank line after this line.') 50 line=line+' ' 51 #check if there is a blank line before new funtional code block 52 #including the class/function definition 53 if line.strip() and not line.startswith(' ')and i>0: 54 pri_line=lines[i-1] 55 if pri_line.strip() and pri_line.startwith(' '): 56 flag=False 57 print(' '*10 +"You'd better add a blank line before this line.") 58 line=' '+line 59 if flag: 60 print(' '*10+'Pass.') 61 fp.write(line) 62 fp.close() 63 64 if __name__ == '__main__': 65 fileName=sys.argv[1] #命令行参数 66 fileLines=[] 67 with open(fileName,'r') as fp: 68 fileLines=fp.readline() 69 desFileName=fileName[:-3]+'_new.py' 70 checkFormats(fileLines,desFileName) 71 #check the ratio of comment lines to all lines 72 comments=[line for line in fileLines if line.strip().startswith('#')] 73 ratio=len(comments)/len(fileLines) 74 if ratio <= 0.3: 75 print('='*30) 76 print('Comments in the file is less than 30%') 77 print('Perhaps you should add some comments at appropriate position.')