• Python 基础编码风格


    一、 基础风格:遵循PEP

    1. 语句编排:
      • 每个语句独占一行,勿在行尾加分号, 也不要用分号将多条语句放在同一行。
      • 另起一行,即使定义,语句较为简单:
        • if/for/while 语句中
        • 类定义:class UnfoundError(Exception): pass
      • 建议多行: 
        • 函数和方法的括号中参数或者元素过多时,建议换行多层缩进书写解决
    2. 空格使用:
      • 不加空格:
        • 各类括号内接语句前后不加空格 
        • 参数中默认值 
      • 加空格: 基本符号后(口号,冒号)前不加空格,后加  使用等号的场景(除参数默认值)  
    3. 命名规范:
      • 小写配合下划线场景:
        • 文件名 
        • 类方法和属性 
      • 驼峰场景:
        • 类名 
      • 大写与下划线配合场景:
        • 全局变量名 
      • 下划线使用开头(同样应用于模块,文件):
        • 为其实例的私有方法(默认:不建议实例外部调用,但不影响获取其值)
      •  双下划线开头(同样应用于模块,文件):
        • 为其私有方法,不允许外部调用,仅可在内部方法之间使用(原因:是防止调用,内部进行了对进行了重载) 
        • 在不重载类属性时,不建议定义以双下划线开头和结尾的方法 
    4. 判断比较:
      • 可能的话使用 is/is not 代替 ==(并不是所有的都可以,== 与 is 不等价) 
      • 使用 isinstance() 比较对象的类型,而不是 type() 
      • 使用 startswith() 和 endswith() 代替切片进行序列前缀或后缀的检查。 
      • if、while、for 时无需专门使用语句判断对象真值 
    5. 拼接:
      • 字符串,list,tuple等,建议使用join 替代 + ;
      • 路径拼接,如果跨平台,建议使用os.path.join or pathlib 
    6. 效率: 使用迭代器和生成器代替列表等数据结构效率更高,使用列表(字典)解析式和生成器表达式比用循环效率更高。
    7. 好的习惯:
      • try: ... except ...., except 后面异常类型确认的话,明确写上各类型 
      • 文件模块:功能结构众多,期望有if __name__ == "__main__" 代码块,标准函数执行逻辑过程: 
        if__name__ =="__main__":
            do1()
            do2()
      • 使用推导式,map,filter,reduce等代替for,while循环处理
      • 包模块拥有自己定义的异常类型
      • 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。尽可能的使用 classmethod, staticmethod
     

    二、特别:

        1. 模块导入格式

    • 位于最顶层,或者顶层注释与代码块中间
    • 导入应该按照从最通用到最不通用的顺序分组: 
      • 标准库导入
      • 第三方库导入
      • 应用程序指定导入
    • 不建议使用 from flask import * 形式导入,污染全局变量
    • 针对模块文件中存在大量函数情况下,建议使用__all__ 标注可供外部直接使用的函数

        2.  涉及到IO操作的,注意对象IO对象的关闭,可能的话建议了解是否可用 with

    with open("hello.txt") as fr:
        for line in fr:
            pass

           网络请求包:requests,urllib等sockets连接相关,因内存管理存在,析构函数可能被无线延长,在大并发高频次网络请求时,会产生严重的内存泄漏

        3. 建议使用 TODO 为项目代码添加临时注释

    三、 工程:

        1. 函数:Python是一门动态语言,很多时候我们可能不清楚函数参数类型或者返回值类型,可以通过 typing (Python3.5 之后内置方法,目前可能仅有Pycharm支持typing检查)标注入参,返回值类型,提高可读性

    • 注释:
    • 入参(:param):
    • 返回值(:return)

     如下:使用基本类型与 typing类型标注配合,提高项目可读性,IDE中拥有类型提示,不影响代码的使用:https://docs.python.org/zh-cn/3.6/library/typing.html

    from typing import List, Mapping, Optional
     
    # 基础函数定义标注
    def func_merge(a: List[int], b: List[int or str], c: List) -> List[int or str]:
        """
        实现列表合并,产生新的列表
        :param a: 列表a
        :param b: 列表b
        :param c: 列表c
        :return: 生成新的列表
        """
        return a + b + c
     
     
    func_merge(1, 2, 0)  # Pycharm 上会变黄有提示: Expected type 'list', got 'int' instead
    func_merge([1], [2], [0])
     
     
    # 回调函数定义标注
    def do(a: int):
        return str(a)
     
     
    def run_callback(num: int, cb: Callable[[int], str]) -> str:
        return cb(num)
     
     
    print(run_callback(123456, do))
    print(run_callback("a", do))  # 变黄
     
    # 可变参数定义标注
    def foo(arg: Optional[int] = 0) -> None:
        print("arg:", arg)
     
     
    # foo(arg="a")  # 以不正确形式
    # foo(arg=1)
    foo()
     
    # 变量定义标注
    conf: Mapping[str, str]
    conf = {"REDIS": 12323}

       2. http api 接口建议采用restful风格:

    • 接口功能单一
    • 视图函数,建议以类形式进行处理,django/flask的views,或者restful 的Resource:
      • 方法功能明确:get/post/put/delete 
      • 方法,功能可聚合
      • 结构继承
    • 请求:资源层次化,利于阅读与网关权限控制
    • 响应:

    {
        "code": 0,         # 0, 接口预期响应,非0:异常响应
        "data": {},        # 返回具体结果详情
        "message": "",     # 响应描述
        "desc": "",        # desc 接口功能描述
        "time": ""         # 返回响应时间
    }
  • 相关阅读:
    Android 9.0 Native Looper机制(原理篇)
    Android 9.0 开机时间优化
    Android 9.0 Zygote进程启动源码分析指南二
    Android 9.0 Zygote进程启动源码分析指南一
    Android 9.0 设置白名单赋予应用权限
    Android 9.0 可以裁剪的应用
    鸿蒙 HarmonyOs 记录一下 第一次配置的时候便遇到问题了:Unable to download the HarmonyOS SDK. proxyHost should not be null when a proxy is s...
    vue3 封装简单的 tabs 切换组件
    Vue 所有实用插件集合汇总
    vue项目中如何使用有向无环图(dag-diagram)
  • 原文地址:https://www.cnblogs.com/spaceapp/p/15330212.html
Copyright © 2020-2023  润新知