Skip to main content

Python 个人编程风格

Y-aong...About 5 min代码风格代码风格

Python 个人编程风格

一、变量名

变量名总体要求

  1. 尽可能使用有意义的英文单词给变量命名,禁止使用单字母作为变量【强制】

    反例

    a = '杨勇'
    data = [22, 33, 23]
    

    正例

    name = '杨勇'
    ages = [22, 33, 23]
    
  2. 不可以和保留字进行重复【强制】

    反例

    type = 'number'
    

    正例

    search_type = 'number'
    
  3. 私有变量不可以对外暴露【强制】

  4. 通用的变量名缩写【建议】

    反例

    dm = [[1,2,3]]
    ct = None
    

    正例

    df = [[1,2,3]]
    ctx = None
    
  • 模块名 ——模块名统一使用下划线命名 redis_utils
  • 类名——类名统一使用大驼峰命名 Person
  • 函数名——统一使用下划线命名 get_name
  • 变量名——统一使用下划线命名 my_name

二、导入

  • 少用 import *,少导入不用的代码,避免循环导入【建议】

  • 导入格式,每个导入应该独占一行 【建议】

    导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组,每种顺序之间添加一个空行

    • 标准库导入
    • 第三方库导入
    • 应用程序指定导入

    每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.

    反例

    from flask import Resquese
    from foo.bar import baz
    import os
    from foo.bar import Quux
    

    正例

    import os
    
    from flask import Resquese
    
    from foo.bar import baz
    from foo.bar import Quux
    

三、注释

  • 文件头设置【强制】

    所有的文件强制添加以下文件头,其中替换为自己的名字,Description必写

    # !/usr/bin/env python
    # -*-coding:utf-8 -*-
    
    """
    # File       : ${NAME}.py
    # Time       :${DATE} ${TIME}
    # Author     :your name
    # version    :python 3.10
    # Description:
    """
    
  • 需要加注释的地方,根据实际情况【建议】

  • 关键逻辑注释

  • TODO 注释

  • 注释不要太长,和代码最大长度一致

四、异常处理

  • 异常日志必须打印,最好把堆栈信息打印出来【强制】

    import traceback
    def test():
      try:
          num = 1 / 0
      except ZeroDivisionError as e:
          print(f'异常信息::{e}, {traceback.format_exc()}')
    
    
    test()
    
    
  • except 处理,处理的错误具体处理

五、函数设计

  • 函数的if else过多层嵌套,不超过两层的if else 嵌套

    def demo(num: int):
        if num > 0:
            if num > 10:
                if num > 100:
                    print('大于100')
                else:
                    print('小于100')
            else:
                print('小于10')
        elif num == 0:
            print('等于0')
        else:
            print('小于0')
    
  • for循环嵌套层数过多,一般不超过2层

    def demo(data: List[list]):
        for items in data:
            if items:
                for item in items:
                    for temp in item:
                        print(temp)
    
  • 过长的函数,函数长度远大于100行,一般在50行内

  • 过多的函数参数(一般5个之内)

    解决方法

    • 使用**kwargs,注释中解释参数的作用
    def do_something(name: str, age: int, **kwargs):
        """
        @param name: 姓名
        @param age: 年龄
        @param kwargs: 
                hobbies:爱好
                sex:性别
                height:身高
        @return: 
        """
        pass
    
    • 使用具名数组 namedtuple
    from collections import namedtuple
    
    Student = namedtuple('Student', 'name, gender')
    s = Student('小花', '女')
    
    Student = namedtuple('Student', 'name,age,sex,height,hobbies')
    
    def do_something(student: Student):
        """
        @param student:学生
        @return:
        """
        pass
    stu = Student('小花', '18', '女', 165, '唱歌')
    do_something(stu)
    
    
    
    
    
  • 使用 dataclasses数据类,使用 pydantic类型提示类,自行百度

  • 拒绝函数具有隐式返回值

    # 反例
    def demo(num: int) -> int:
        """
        测试隐私返回值方法
        @param num: 
        @return: 
        """
        if num > 10:
          return num
        
    # 正例
    def demo(num: int) -> int:
        """
        测试隐私返回值方法
        @param num: 
        @return: 
        """
        if num > 10:
            return num
        return 0
    

    异常解析:函数正常情况下返回值为int类型,但是参数小于10时,返回值为None,这时如果使用函数返回值可能会有一些意料之外的结果。

六、类的设计

  • 类的分类:数据类和是实现类(功能类)

    数据类:例如这个类中保存的基本都是数据相关的,没有其他功能

    实现类:这个类中有大量的实现方法,涉及到一些功能操作和实现

  • __init__.py文件中尽量少写或者是不写功能类方法,功能方法放在下面的子模块中

    • __init__文件作用是模块的初始化作用,不适合写功能
    • __init__文件名称难以区分功能作用,起不到标识的作用
  • 过于庞大的类

    • 第一指的是代码行数过长
    • 第二指的是类的功能过于复杂
  • 私有方法外部引用

    反例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self._sex = '未知'
            
      zs = Person('zs', 18)
    
      print(zs._sex)
    
    
  • 随意为类添加属性

    # 反例
    class Person:
        def __init__(self, name, age):
          self.name = name
          self.age = age
    
        def set_sex(self, sex: str):
          """设置性别"""
          self.sex = sex
            
    # 正例
    class Person:
        def __init__(self, name, age):
          self.name = name
          self.age = age
          self.sex = None
    
        def set_sex(self, sex: str):
          """设置性别"""
          self.sex = sex
    
  • 类的继承和类的组合,尽量少用类的多继承,多使用类的组合

    类的多继承是保证类的多态性,但是过长的继承规则,不利于写代码和业务调试,类的组合也是符合很多设计模式的思路。

7、模块设计

  • 模块解耦,各个功能的模块要明确
  • 公共方法的提取,公共方法要进行方法的抽取

8、其他

  • 数据类不要过于凌乱
  • 过多的重复代码
  • 没有注释或者令人困惑的注释
  • 缩进:统一使用 tab四个宫格
  • 空格,空行,这个以 pycharm格式化为准,快捷键 ctrl+alt+l
  • 行长度:这个以 pycharm格式化为准,一般120个字符
  • 全局变量和私有变量:少使用全局变量,全局变量使得程序更难理解和使用
  • 密码,密钥,token:在日志打印中注重隐私保护,不打印密码,密钥,token
  • 一个py文件一般不超过300行
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8