1.《Python高质量代码的91个建议》引论

1 建议1:理解 Pythonic 概念

Python之禅

The Zen of Python, by Tim Peters

Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than right now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!

中文版

  • 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密
  • 找到简单问题的一个方法,最好是唯一的方法(正确的解决之道)
  • 难以解释的实现,源自不好的注意;如果有非常棒的注意,它的实现肯定易于理解

2 建议 2:编写 Pythonic 代码

  • 变量命名清晰明确、可读性高、不重复
  • 可参考PEP8、Google Python Style Guide等统一编程风格
# 示例一:
def funA(list, num):
    for element in list:
        if num == element:
            return True
        else:
            pass

# 示例二:
def find_num(searchList, num):
    for listValue in searchList:
        if num == listValue:
            return True
        else:
            pass

3 建议 3:理解 Python 与 C 语言的不同之处

Python 底层是用 C 语言实现的,但切忌用 C 语言的思维和风格来编写 Python 代码

比如C语言中的三元操作符C?X:Y 在 Python 中等价的形式为 X if C else Y

4 建议 4:在代码中适当添加注释

Python 中有 3 种形式的代码注释:块注释、行注释以及文档注释(docstring)

  • 对复杂的操作、算法使用块或者行注释
  • 外部可访问的函数和方法使用文档注释

5 建议 5:通过适当添加空行使代码布局更为优雅、合理

6 建议 6:编写函数的几个原则

  • 原则 1:函数设计要尽量短小,嵌套层次不宜过深。最好能控制在 3 层以内。

  • 原则 2:函数申明应该做到合理、简单、易于使用。参数个数不宜太多。

  • 原则 3:函数参数设计应该考虑向下兼容。比如函数版本更新时,高版本中增加了新的参数,应该通过参数默认值做到向下兼容。

  • 原则 4:一个函数只做一件事,尽量保证函数语句粒度的一致性。

  • 原则 5:不要在函数中定义可变对象作为默认值

  • 原则 6:使用异常替换返回错误

  • 原则 7:保证通过单元测试

7 建议 7:将常量集中到一个文件

  • 为常量设定特殊的命名风格
  • 通过自定义的类包含所有常量
  • 尽量将常量集中到一个文件中
# constant.py
class Const(object):
  class ConstError(TypeError):
      pass
  class ConstCaseError(ConstError):
      pass

  def __setattr__(self, name, value):
      if name in self.__dict__:
          raise(self.ConstError, "Can't change const.{}".format(name))
      if not name.isupper():
          raise(self.ConstCaseError, "const name {} is not all uppercase".format(name))
      self.__dict__[name] = value
      
const = Const()
const.MY_CONSTANT = 1
const.MY_SECOND_CONSTANT = 2

#pythonic

往年同期文章