PEP 8 摘录

1,781次阅读
没有评论

PEP

前言

PEP 8 是python代码规范说明,里面规定了一些推荐的python代码的格式与用法。笔者将在本文中做一些总结,不是为了纯粹的翻译PEP 8,而是根据个人习惯与喜好进行的一个整理。如有谬误,欢迎指出。

PEP 8 官方文档:这里

A Follish Consistency is the Hobgoblin of Little Minds

永远不要为了和已有的文档保持一致而特意做出不自然的改变,否则,这只会限制你的思维,降低你的效率。Guido在这里写下的这些规范是处于代码的可读性考虑的,但是如果有的时候这些规范也不一定适用,例如:

  • 如果使用了这些规范会降低可读性;
  • 如果代码写于规范面世以前;
  • 如果代码使用到了老版本的依赖库,然而这些老版本的依赖库且兼容新的规范;
  • 如果已有代码使用了另外的一种风格;

代码规范

  1. 多参数情况下适当缩进
    <span class="hljs-comment"># function</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">long_function_name</span><span class="hljs-params">(  # no argument on the first line
            var_one, var_two,  # more indentation to distinguish this from the rest
            var_three, var_four)</span>:</span>
        print(var_one)
    <span class="hljs-comment"># list</span>
    my_list = [
        <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>,
        <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>,
        <span class="hljs-number">7</span>, <span class="hljs-number">8</span>, <span class="hljs-number">9</span>,  <span class="hljs-comment"># add a comma here to be consistent with the preceding lines</span>
        ]
    <span class="hljs-comment"># long if -statement</span>
    <span class="hljs-keyword">if</span> (this_is_one_thing
            <span class="hljs-keyword">and</span> that_is_another_thing)  <span class="hljs-comment"># more indentation to distinguish this</span>
        do_something()
  2. 使用4个空格键<space>替代制表键<tab>
  3. 每行字符数控制在79个以内,必要的时候可使用\
    with <span class="hljs-keyword">open</span>(<span class="hljs-string">'/path/to/the/file/to/read'</span>) as file_1, \
         <span class="hljs-keyword">open</span>(<span class="hljs-string">'/path/to/the/file/to/read'</span>) as file_2:
        file_2.<span class="hljs-keyword">write</span>(file_1.<span class="hljs-keyword">read</span>())
  4. 多行分别import依赖库,且须放在全局变量和常量之前
    <span class="hljs-reserved">import</span> os
    <span class="hljs-reserved">import</span> sys
    <span class="hljs-reserved">import</span> other_standard_libraries
    <span class="hljs-reserved">import</span> related_third_parties
    ipmort local applications
  5. python不区分双引号"和单引号',选一个适合你自己的风格,然后坚持下去
  6. 空白符的规则很繁琐,基本上和英文书写的规范一致,下面列举了部分情况
    <span class="hljs-tag">ham</span><span class="hljs-attr_selector">[1:9]</span>, <span class="hljs-tag">ham</span><span class="hljs-attr_selector">[1:9:3]</span>, <span class="hljs-tag">ham</span><span class="hljs-attr_selector">[1::3]</span>, <span class="hljs-tag">ham</span><span class="hljs-attr_selector">[1:9:]</span>
    <span class="hljs-tag">ham</span><span class="hljs-attr_selector">[lower+offset : upper+offset]</span>  # <span class="hljs-tag">equal</span> <span class="hljs-tag">amounts</span> <span class="hljs-tag">on</span> <span class="hljs-tag">either</span> <span class="hljs-tag">side</span> <span class="hljs-tag">of</span> <span class="hljs-tag">the</span> <span class="hljs-tag">operator</span>
  7. 在分配默认值或者键值对赋值的时候,等号=周围不要用空格
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">complex</span><span class="hljs-params">(real, imag=<span class="hljs-number">0.0</span>)</span>:</span>
        <span class="hljs-keyword">return</span> magic(r=real, i=img)
  8. 关于注释,不要添加与代码逻辑相违背的注释,也不要添加显而易见的注释。记住一点,注释是为了增强可读性。
  9. 关于命名,不同的对象会有不同的规范:
    • 包:小写,可以使用但是不推荐使用下划线_。一些利用C/C++编写的包的名字可以以下划线开头;
    • 类:CapWords命名规范,例如CapitalizeWords, HTTPServerError
    • 异常:其本质是一个类,所以沿用上面的规范,另外需要以Error_开头
    • 函数:小写,并且用下划线隔开
    • 方法与变量:沿用函数的命名规范,另外非公有变量需要以_开头

方法规范

  1. None作比较的使用,不要使用==,使用is或者is not
  2. 字符串的合并操作不要使用a += b或者a = a + b,使用''.join()
  3. Excepetion而不是BaseException库中继承异常
  4. 抛出异常的时候,请使用raise ValueError('message')
  5. 在捕捉异常语句中,请尽可能指明捕捉的异常类别。如果需要捕捉所有扰乱程序的异常,可以使用
    <span class="hljs-keyword">try</span>:
        some_magic()
    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> exc:
        print(str(exc))
        <span class="hljs-keyword">raise</span> some_error
    <span class="hljs-keyword">else</span>:
        everything_is_good()
    <span class="hljs-keyword">finally</span>:
        clean_up()
  6. 对于不同的输入,函数的返回值类型应该保持一致
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">foo</span><span class="hljs-params">(x)</span>:</span>
        <span class="hljs-keyword">if</span> x >= <span class="hljs-number">0</span>:
            <span class="hljs-keyword">return</span> math.sqrt(x)
        <span class="hljs-keyword">else</span>:
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">None</span>  <span class="hljs-comment"># should also be a value or None</span>
  7. 字符串操作中,尽可能使用字符串类的方法
    <span class="hljs-string">''</span>.startswith()
    <span class="hljs-string">''</span>.endswith()
  8. 判断对象的类别,尽量使用isinstance()

转自https://segmentfault.com/a/1190000005342432

admin
版权声明:本站原创文章,由admin2016-06-01发表,共计1978字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)