1. 背景
Python是谷歌内部使用的主要动态语言(脚本语言)。这份指导手册列出了使用Python的编程人员应该做的
和不应该做的
。
为了帮助你正确格式化代码,我们提供了一个用于Vim的设置文件,mac用户的话,使用默认设置就很好。
文件
google_python_style.vim
,规定了一些python缩进语法格式(这个代码文件很短,除了注释,代码就一个函数,30多行),如下:
function GetGooglePythonIndent(lnum)
" Indent inside parens.
" Align with the open paren unless it is at the end of the line.
" E.g.
" open_paren_not_at_EOL(100,
" (200,
" 300),
" 400)
" open_paren_at_EOL(
" 100, 200, 300, 400)
call cursor(a:lnum, 1)
另外,很多teams都会使用yapf来自动格式化,避免关于格式的争论。
2. python语言规范
2.1 Lint
这里普及一下Lint是什么:
lint是最著名的C语言工具之一,是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析(static code analysis),一般由UNIX系统提供。
GCC 已经把 lint 的功能合并进编译器本身,编译时打开 -Wall 开关就会进行多数 lint 的检查。
百度百科
可以使用pylintrc在自己的代码上运行pylint
,pylintrc的文件也不大,有大量的注释配置项,一共442行,大致如下:
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=StandardError,
Exception,
BaseException
2.1.1 定义
pylint
是一个用于寻找python源码中的bugs和styles问题的工具,它可以发现典型的像非动态语言C和C++中编译器捕获的问题,然而由于python的动态特性,一些警告可能是不正确的,不过,错误的警告还是很少见的。
2.1.2 优点
可以捕获一些像拼写错误,分配之前就使用了向量(using-vars-before-assignment),这些简单容易忽略的错误
(Pros and Cons优缺点)
2.1.3 缺点
pylint
不是完美的,为了充分利用其优点,有时需要在它的基础上做一些修改,消除一些警告信息等。
2.1.4 决策(decision)
确保pylint
运行在你的代码上
如果警告信息不合适就屏蔽掉,以避免隐藏掉其他信息,屏蔽警告,可以设置行级别的注释,例如:
dict = 'something awful' # Bad Idea... pylint: disable=redefined-builtin
- pylint的每个warnings都是用符号名(empty-docstring)来表示,谷歌的warnings使用
g-
开头 - 如果从符号名中看不出错误原因,可以添加一个注释。
- 使用这种方式进行报错的好处是可以很容易搜索访问错误信息。
可以使用下面的命令,得到pylint
的警告列表:
pylint --list-msgs
可以使用下面命令来得到更多特定信息(C6409是一种错误类型,就像下面示例中:C0301
表示Line too long (103/100) (line-too-long)
):
pylint --help-msg=C6409
推荐使用pylint:disable
代替即将要被废弃的形式——pylint:disable-msg
可以在函数开头删除变量来屏蔽unused argument
警告,删除的时候最好包含一个解释为什么删除的评论,比如:没用过(unused) 这个理由就很充分。
def viking_cafe_order(spam: str, beans: str, eggs: Optional[str] = None) -> str:
del beans, eggs # Unused by vikings.
return spam + spam + spam
其他常见的屏蔽警告的方式包括:使用_
作为未使用参数的标识,或者在参数前面使用前缀unused_
,或者将其赋值为_
。这些做法是合法的但是不再被鼓励,因为这样会中断调用程序按照名称传递参数,同时无法强制实际上没有使用的参数。
这里插一些内容,参考python中pylint使用方法(pylint代码检查):
可以在python的安装目录下(如果是使用anaconda安装),则目录类似:
C:\XXXX\anaconda\Scripts
,在这个目录下,可以看到有以下这些脚本/文件
|--Scripts
|-- pep8.exe
|-- pep8-script.py
|-- pylint.bat
|-- pylint.exe
|-- pylint.exe
调用运行的时候,可以pylint XXX.py
(当然,也支持一些参数,可以再去了解一下),如下,会打印出很多检查出来的警告或错误信息
$ pylint extract_frame.py
> ************* Module extract_frame
extract_frame.py:13:0: C0301: Line too long (103/100) (line-too-long)
extract_frame.py:16:0: C0301: Line too long (112/100) (line-too-long)
extract_frame.py:17:0: C0301: Line too long (114/100) (line-too-long)
extract_frame.py:29:0: C0325: Unnecessary parens after 'while' keyword (superfluous-parens)
extract_frame.py:55:0: C0301: Line too long (102/100) (line-too-long)
extract_frame.py:65:0: C0325: Unnecessary parens after 'while' keyword (superfluous-parens)
extract_frame.py:72:0: C0304: Final newline missing (missing-final-newline)
extract_frame.py:1:0: C0114: Missing module docstring (missing-module-docstring)
extract_frame.py:11:-1: W0105: String statement has no effect (pointless-string-statement)
extract_frame.py:12:0: C0103: Constant name "parser" doesn't conform to UPPER_CASE naming style (invalid-name)
extract_frame.py:21:0: C0116: Missing function or method docstring (missing-function-docstring)
extract_frame.py:22:10: E1101: Module 'cv2' has no 'VideoCapture' member (no-member)
extract_frame.py:24:18: E1101: Module 'cv2' has no 'CAP_PROP_FPS' member (no-member)
extract_frame.py:35:16: E1101: Module 'cv2' has no 'imwrite' member (no-member)
extract_frame.py:43:0: C0116: Missing function or method docstring (missing-function-docstring)
extract_frame.py:48:4: W0622: Redefining built-in 'type' (redefined-builtin)
extract_frame.py:63:0: C0116: Missing function or method docstring (missing-function-docstring)
extract_frame.py:64:10: E1101: Module 'cv2' has no 'VideoCapture' member (no-member)
extract_frame.py:66:13: W0612: Unused variable 'frame' (unused-variable)
-----------------------------------
Your code has been rated at 2.86/10
其余部分实在太长了,不翻译了,找到了一个中文翻译文档,参考:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/