首页 > 编程语言 >论Python代码风格与编程习惯的重要性

论Python代码风格与编程习惯的重要性

时间:2022-10-27 16:39:09浏览次数:69  
标签:meiduo 模块 Python 代码 编程 redis django 重要性 import

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


引言

实现高内聚,低耦合、结构清晰不臃肿、可读性高、数据冗余性低、高复用、易扩展的代码,并非易事。上到设计模式,下到某个类、方法、函数的构造。在这里我分享一下我自己的代码设计、编写风格,让我们互相学习。


Python代码风格

首先我们要以 PEP8 代码规范为标准,但也无需完全遵守。例如:一行不能超过 79 个字符等。


Python模块模板

  • 模块开头指定编码格式
  • 模块文档注释,展示模块的信息,信息内容自己决定,如:
    • Author,作者
    • Desc,模块描述
    • Date,创建时间
  • 有一个 main() 函数
  • 有一个程序主入口 if __name__ == '__main__':
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @Author: Hui
# @Desc: { 项目主入口模块 }
# @Date: 2020/05/21 13:04


def main():
    print('Hello Python')


if __name__ == '__main__':
    main()
复制代码

main() 函数方便用于测试当前模块功能。


import 导入

import 导入,避免使用 from ... import * ,因为这可能导致模块、类、变量名重复而导致错误。

我自己的 import 代码风格有两种。


由短到长

根据代码的长度由短到长依次导入,import 过度到 from ... import ... ,换行分割可有可无,我是根据 from ... import ... 前面的 import 的数量和整体美观来决定要不要换行。

import os
import sys
import time
import random
import config
import pygame
import requests
import numpy as np

from PIL import Image
from threading import Thread
from datetime import datetime
复制代码

分类导入

分类导入,是分好类后在根据代码的长度由短到长依次导入,主要有:

  • Python内置模块
  • Python自建模块
  • Python第三方库
# Python内置模块导入
import os
import sys
import time
import random
from threading import Thread
from datetime import datetime

# Python自建模块、第三方库导入
import config
import pygame
import requests
import numpy as np
from PIL import Image
复制代码

导入顺序依次为

Python内置模块  -->  Python自建模块  -->  Python第三方库
复制代码

根据自己的风格,导入的自建模块、Python第三方库少时可以在一起无需换行

导入的自建模块少时可以跟Python内置模块在一起,就是转换成 由短到长 的风格


建议

导入模块代码风格无需照搬照抄地遵循,我们做任何的优化就是为了让代码更好看,结构清晰,无需刻意遵循死规则、烂规则,应该活学活用,创新变化,学习别人优秀的方案,总结出适合自己的。

例如:

假如import 导入语句比 from 导入语句更长,要遵循或者纠结 import 是要在 from 导入语句前面还是由短到长排放呢?

import numpy as np
import multiprocessing

from PIL import Image
复制代码

import numpy as np
from PIL import Image
import multiprocessing
复制代码

无需太过纠结、抠字眼,两种导入风格都可以。


变量的命名规范

命名规范 可以被视为一种 惯例,并无绝对与强制 目的是为了 增加代码的识别和可读性


下划线命名法

  1. 在定义变量时,为了保证代码格式,= 的左右应该各保留一个空格
  2. Python 中,如果 变量名 需要由 二个多个单词 组成时,可以按照以下方式命名
    • 每个单词都使用小写字母
    • 单词与单词之间使用 _下划线 连接
    • 例如:first_namelast_nameqq_numberqq_password

驼峰命名法

  • 变量名 是由二个或多个单词组成时,还可以利用驼峰命名法来命名
  • 小驼峰式命名法
    • 第一个单词以小写字母开始,后续单词的首字母大写
    • 例如:firstNamelastName
  • 大驼峰式命名法
    • 每一个单词的首字母都采用大写字母
    • 例如:FirstNameLastNameCamelCase

驼峰命名法

Java、C 等其他语言一般用 驼峰命名法,在 Python 中则推荐使用下划线命名法,符合 PEP8 规范。


Django 代码范例

模块导入

import re
import json
import logging

from django import http
from django.views import View
from django.conf import settings
from django.db import DatabaseError
from django.contrib.auth import authenticate
from django.contrib.auth import login, logout
from django_redis import get_redis_connection
from django.shortcuts import render, reverse, redirect

from goods.models import SKU
from users import constants
from users.models import User
from users.models import Address
from users.utils import generate_verify_email_url
from users.utils import check_verify_email_token
from carts.utils import merge_cart_cookie_to_redis

from meiduo_mall.utils.result import R
from meiduo_mall.utils.constants import RedisKey
from meiduo_mall.utils.constants import CookieKey
from meiduo_mall.utils.enums import StatusCodeEnum
from meiduo_mall.utils.constants import HtmlTemplate
from meiduo_mall.utils.views import LoginRequiredMixin
from meiduo_mall.utils.views import LoginRequiredJSONMixin
from meiduo_mall.utils.exceptions import BusinessException
from celery_tasks.email.tasks import celery_send_verify_email
复制代码

这样导入看起来更舒服,有换行代码不紧凑,分类有条理。


封装html的url网址

渲染 html 页面,把 html 的存放路径总体封装到一个类里面,方便日后维护。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author: Hui
# @Desc: { 项目公共常量模块 }
# @Date: 2021/09/25 15:57

class HtmlTemplate(object):
    """
    项目 html网页模板路径汇总类
    """

    # 首页
    INDEX_HTML = 'index.html'

    """
    用户登录模块
    """
    # 用户登录
    LOGIN_HTML = 'users/login.html'

    # 用户注册
    REGISTER_HTML = 'users/register.html'

    # 用户中心个人信息
    USER_CENTER_INFO_HTML = 'users/user_center_info.html'

    
    """
    商品模块
    """
    # 商品列表
    GOODS_LIST_HTML = 'goods/list.html'

    # 商品详情
    GOODS_DETAIL_HTML = 'goods/detail.html'

    
    """
    购物车模块
    """
    # 购物车列表
    CART_LIST_HTML = 'carts/cart.html'
    

    """
    项目错误 html 模板
    """
    ERRORS_404_HTML = 'errors/404.html'


复制代码

视图访问与渲染

from meiduo_mall.utils.constants import HtmlTemplate

# /
class IndexView(View):
    """首页类视图"""

    def get(self, request):
        context = {
            'name': 'hui'
        }
        return render(request, HtmlTemplate.INDEX_HTML, context)
    

# /login    
class LoginView(View):
    """用户登录类视图"""

    def get(self, request):
        """
        提供登录界面
        :param request: 请求对象
        :return: 登录界面
        """
        return render(request, HtmlTemplate.LOGIN_HTML)
    
    
# /register
class RegisterView(View):
    """用户注册类视图"""

    def get(self, request):
        """提供注册页面"""
        return render(request, HtmlTemplate.REGISTER_HTML)
    
复制代码

设计与封装 Cookie 和 Redis 的键(key)

class CookieKey(object):
    """
    Cookie key 常量设计类
    """

    # 登录用户名 cookie key
    USERNAME_KEY = 'username'

    # 购物车信息 cookie key
    CARTS_KEY = 'carts'


class RedisKey(object):
    """
    redis key 常量设计类
    """
    # 图形验证码 key
    IMG_CODE_KEY = 'meiduo:img:code:{uuid}'

    # 短信验证码 key
    SMS_CODE_KEY = 'meiduo:sms:code:{mobile}'

    # 短信发送标记
    SMS_SEND_FLAG_KEY = 'meiduo:sms:send:flag:{mobile}'

    # 省份数据 key
    PROVINCES_KEY = 'meiduo:area:provinces'

    # 市区数据 key
    SUB_AREA_KEY = 'meiduo:sub_area:{area_id}'

    # 用户商品浏览记录
    HISTORY_BROWSE_KEY = 'meiduo:history:{user_id}'

    # 用户购物车数据 key
    USER_CARTS_KEY = 'meiduo:carts:{user_id}'

    # 购物车商品是否勾选 key
    CARTS_SELECTED_KEY = 'meiduo:cart:selected:{user_id}'
复制代码

Rediskey 的名称,就非常见名知意。

项目名称 业务模块/功能 唯一标识
'meiduo:img:code:{uuid}'
'meiduo:sms:code:{mobile}'
'meiduo:carts:{user_id}'
'meiduo:history:{user_id}'
复制代码

这里还有一个 settings 配置的常量设置

# redis 缓存 ip/port 信息
REDIS_URI = f"redis://{SERVER_IP}:6379"

# 缓存别名
DEFAULT_CACHE_ALIAS = 'default'
SESSION_CACHE_ALIAS = "session"
VERIFY_CODE_CACHE_ALIAS = 'verify_code'
HISTORY_CACHE_ALIAS = 'history'
CARTS_CACHE_ALIAS = 'carts'

# 缓存
CACHES = {
    # 默认采用0号Redis库。
    DEFAULT_CACHE_ALIAS: {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"{REDIS_URI}/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },

    # session, 采用1号Redis库
    SESSION_CACHE_ALIAS: {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"{REDIS_URI}/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    
   # 校验码(图片、短信验证码), 采用2号Redis库
    VERIFY_CODE_CACHE_ALIAS: {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"{REDIS_URI}/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    ...
}

复制代码

封装前后代码对比

封装前

from django.conf import settings
from django_redis import get_redis_connection
from meiduo_mall.utils.constants import RedisKey

# 创建连接到redis的对象
redis_conn = get_redis_connection('verify_code')

img_code_key = 'meiduo:img:code:' + uuid 

image_code_server = redis_conn.get(img_code_key)
复制代码

封装后

from django.conf import settings
from django_redis import get_redis_connection
from meiduo_mall.utils.constants import RedisKey

# 创建连接到redis的对象
redis_conn = get_redis_connection(settings.VERIFY_CODE_CACHE_ALIAS)

img_code_key = RedisKey.IMG_CODE_KEY.format(uuid=uuid)

image_code_server = redis_conn.get(img_code_key)
复制代码

虽然封装的代码量添加了一些,但有助于你更快的了解项目大概做了什么,以及提高可维护性。不用到具体的模块、类、函数中一个个查看,日后更新只需在封装的类中改下即可。


注意:文章中有很多伪代码,主要是体现代码设计与编写的思想。


尾语

✍ 用 Code 谱写世界,让生活更有趣。❤️

✍ 万水千山总是情,点赞再走行不行。❤️

✍ 码字不易,还望各位大侠多多支持。❤️


作者:忆想不到的晖
链接:https://juejin.cn/post/7024486715867791397
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:meiduo,模块,Python,代码,编程,redis,django,重要性,import
From: https://www.cnblogs.com/netflix/p/16832721.html

相关文章

  • python数据分析——lxml已下载但pycharm中使用仍然报错
    参照一本书(《python数据分析入门从数据获取到可视化》-沈祥壮)上的代码准备学习一下爬虫,但是卡在了标题中的错误中,尝试了很多方法:pipinstalllxml/pipuninstalllxml、......
  • Python从进阶到高级—通俗易懂版(五)
    #==================================#Author:Mikigo#Env:deepin20.4os#==================================自定义序列1、可切片对象切片大家都很熟悉,......
  • js函数式编程讲解
    什么是函数式编程是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简......
  • python | 算法-最短路径-dijikstra改进算法
    写在前面:我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!1️⃣参考链接:https://github.com/algorithmzuo/algorithmbasic......
  • Python之JSON用法解析
    前景Python编写HDFS服务安装的过程中,需要将构建好的JSON对象输出到文件,采用那种方式更便捷方案1open函数defwriteExecCmdCheckActionsFile(self,out_res,che......
  • Python在接口测试中的应用
    1.介绍接口测试的方式有很多,可以使用的工具有jmeter,postman,soapUI等,也可以自己写代码进行接口测试(Python,java,go等等),工具的使用相对来说都比较简单,开箱即用。但如果接口中定......
  • 一文带你了解 Python 中的继承知识点
    1类继承Python是面向对象的编程语言,因此支持面向对象的三大特性之一:继承。继承是代码重用的一种途径,Python中的继承就像现实生活中的继承一样,子类可以顺利继承父类的属性......
  • Python7-实战
    实战01(修改手机默认语言)1classPhone:2'''手机类'''3def__init__(self,language='英文'):4iflanguage=='英文':5print("智能手......
  • conda管理python环境
    Anaconda使用教程Anaconda详细安装使用教程condacreate-nlearnpython=3//创建一个名为learn的环境并指定python版本为3(最新版本)condaactivatelearn//激活l......
  • python遇到IndexError: only integers, slices (`:`), ellipsis (`...`)……
    完整错误信息如下:IndexError:onlyintegers,slices(​​:​​​),ellipsis(​​...​​​),numpy.newaxis(​​None​​)andintegerorbooleanarraysarevalid......