当前位置: 首页 > news >正文

【Python】防御性编程入门

1. 前言

防御性编程指的是为了防止代码泄露后被竞品公司窃取技术,使用一种较高级的明文加密编程方式。也可以当做一种带解密性质的时间胶囊,锻炼程序员自己的记忆能力、读代码能力等。


2. 案例分析


2.1 import

  • Import里面可以多取一些喜欢的名字,也可以取简写
  • 原生库和三方库混着Import
  • Importfrom交错使用,增加美观性
  • 模块和模块内的函数都分别导入,使用更加方便
  • 相同作用的库都导入,如这里的pathlibos,又比如可以mathnumpy换着用
import json as j
from pathlib import Path as P
import dicttoxml as dtxfrom xml.dom.minidom import parseString as pS
import os as oasis
from json import dumps as ds

2.2 函数

  • 将完全不需要组成函数的内容组成函数,没啥可说的,基本技巧
  • 别写类型提示
  • 注意函数名和参数名也有讲究,我个人是简洁派,whatever
def psd(s,did, fn,p, name,d,os):l1 = ...l2 = ...l = ...c = m.get(l)try:if ...:l += "..."except:passos.append(...)if c and c not in str(p):...return os
  • 交替使用实参和外部的全局变量,如此处的d变量和全局的dt变量实则为同一个
def gd(d
):if not oasis.path.exists(pc):with open(pc, 'w') as lq:lq.write(ds(d, ensure_ascii=False))else:with open(pc, 'r') as lq:dc = j.loads(lq.read())dc['...'] = dtwith open(pc, 'w') as lq:lq.write(ds(dc, ensure_ascii=False))
  • 函数调用的时候能用位置参数就不用关键字参数
dtx.dicttoxml(lq,True,'...',True,False,False,lambda lq:'...')
  • 能用自己的函数就不用标准库/三方库的函数,比如将.rglob("*.json")替换为下面的函数
def gj(p
):for x in p.rglob("*"):if x.is_file():if x.suffix == ".json":yield x

2.3 注释

  • 适当增加一些没有意义的注释
  • 注释加的位置多进行变化,避免单一
# 遍历JSON
for x in gj(pa):...for x in gj(pa):     # 再次遍历JSON...
  • 在有问题的地方注释上noqa,如下面这里的dd变量是循环内的一个变量,一般不在循环外调用,但是注释上noqa,权当无事发生
for x in l1:dd = ...
if dd is None:  # noqaraise ValueError("unexpected value")

2.4 if-else

  • 能嵌套if就绝不用elif
  • 能多写if就绝不写and
if ct == 0:...
else:if ct == 1:if "..." in sn:...else:if ct > 1:if "..." in sn:...if ct == 1:if "..." in ht or "..." in ht or "..." in ht or "..." in ht:if no != '...':...else:if "..." in ht:if no != '...':...

至于1个if做2件事还是2个if各做1件事,见仁见智,比如我这里就写了2次if ct == 1:

  • 如果没有那么多条件拿来判断,可以多加入一些边缘情况,如下面案例中的dd变量一般不会为None,但是万一呢?同理,f变量本来不可能超过10,但是万一呢?
for x in gen_json(pa):     # 再次遍历JSONr1 = j.load(x.open(encoding="utf-8"))dd = r1["..."]if dd is None:raise ValueError("unexpected value")else:f = r1["..."]["..."] + 1if f >= 12:raise ValueError("...")else:...

2.5 变量

  • 简洁有力
  • 能一起创建就一起创建,不同类型变量混一起
pa, m,pc, dt,pb,s = P(r"..."), {...},P(r"..."), {},P(r"..."),{}
  • 重复使用同样的变量名,如这里的lq变量最初指向一个列表(通过psd函数更新,单看这里看不出来),之后又指向一个DOM,最后又指向了一个Path对象
lq = []
# 遍历data
for y in dl[:1]:psd(y,dd,f,po,po.name,dt,lq)
lq = pS(dtx.dicttoxml(lq,True,'...',True,False,False,lambda lq:'...'))
udm(d.getElementsByTagName('...')[0],lq)
lq = pb/of/x.relative_to(pa).with_suffix("...")
lq.parent.mkdir(511,True,True)
lq.write_text(d.toprettyxml())

2.6 代码风格

  • 从头到尾不用空行分隔或随心情添加空行
  • 绝不换行,多嵌套,多用火车式代码,如这是一行代码:
d = pS(dtx.dicttoxml({'...': P(r1["..."]["..."]).parent.name,'...': P(r1["..."]["..."]).name,"...": P(r1["..."]["..."]).name,'...': {'...': '...'},'...': {'...': ..., '...': ..., '...': ...},'...': ...},True,'...',True,False,False))
  • 不用刻意乱打空格,因为一个ctrl+alt+L就纠正过来了

2.7 异常捕获

  • try-except作为if-else的替代,可以增加两行代码:
try:assert len(dl) <= 1
except:...
  • try-except包住绝大部分代码,让报错有处遁形,锻炼debug能力。如下面这段代码,数据量大的时候如果有少量报错的很难从结果端察觉:
for x in gj(pa):try:...except:...

相关文章:

【Python】防御性编程入门

1. 前言 防御性编程指的是为了防止代码泄露后被竞品公司窃取技术&#xff0c;使用一种较高级的明文加密编程方式。也可以当做一种带解密性质的时间胶囊&#xff0c;锻炼程序员自己的记忆能力、读代码能力等。 2. 案例分析 2.1 import Import里面可以多取一些喜欢的名字&#…...

无线麦克风哪个品牌音质最好?热门无线麦克风品牌推荐

这段时间短视频行业兴起&#xff0c;很多人都开始尝试步入自媒体&#xff0c;不过想要自己的视频内容更出色、更吸引人&#xff0c;好的音频设备肯定是必不可少的&#xff0c;而麦克风就是其中的一种。麦克风的好坏也将决定了一个视频的质量与完整性等等&#xff0c;如果我们作…...

粒子奇观:用Processing创造宇宙级的动态效果

前言: 👋 今天,我们将一起探索宇宙的奥秘,不是在星空下,而是在Processing的代码世界中。这是我们的第八篇文章,我们将深入粒子系统的神奇领域,学习如何创造出令人惊叹的动态效果。 粒子系统:构建动态世界的基石 🔨 粒子系统是计算机图形学中用于模拟复杂自然现象…...

Filesystem Fragmentation on Modern Storage Systems——论文泛读

TOCS 2023 Paper 论文阅读笔记整理 问题 文件系统碎片是计算机系统随着时间的推移而变慢的主要原因之一。以前认为&#xff0c;碎片化对硬盘驱动器&#xff08;HDD&#xff09;等旋转存储设备有害&#xff0c;但不影响固态驱动器&#xff08;SSD&#xff09;&#xff0c;因为…...

如何同步管理1000个设备的VLAN数据?

什么是VLAN&#xff1f; VLAN&#xff0c;也就是虚拟局域网&#xff0c;是通过为子网提供数据链路连接来抽象出局域网的概念。在企业网中&#xff0c;一个企业级交换机一般是24口或者是48口&#xff0c;连接这些接口的终端在物理上形成一个广播域。广播域过大&#xff0c;就会导…...

【谷粒商城】01-环境准备

1.下载和安装VirtualBox 地址&#xff1a;https://www.virtualbox.org/wiki/Downloads 傻瓜式安装VirtualBox 2.下载和安装Vagrant官方镜像 地址&#xff1a;https://app.vagrantup.com/boxes/search 傻瓜式安装 验证是否安装成功 打开CMD,输入vagrant命令&#xff0c;是否…...

2024深圳杯数学建模C题参考论文24页+完整代码数据解题

一、问题研究 24页参考论文&#xff1a; 【编译器识别】2024深圳杯C题24页参考论文1-3小问完整解题代码https://www.jdmm.cc/file/2710545/ 为了回答这些问题&#xff0c;我们需要进行一系列的编译实验、分析编译结果&#xff0c;并构建判别函数。以下是对这些问题的初步分析…...

用go语言写一个代码,加班就自动给老婆发信息,下班自动提醒的代码

文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的a…...

Spring-Cloud 微服务

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程 优点: 1:部署简单:由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈&#xff0c;往往一套熟悉的…...

python数据分析——数据可视化(图形绘制基础)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制plot示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线图的…...

必背!!2024年软考中级——网络工程师考前冲刺几页纸

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来 今天给大家整理了——软考网络工程师考前冲刺几页纸&#xff0c;都是核心重点&#xff0c;有PDF版&#xff0c;可打印下来&#xff0c;每天背一点。 计算机总线分类 ①总线的分类&#xff1a;数据总线、地址总…...

html+js光标操作

光标设置id为username的字段 window.addEventListener("load", function() {document.getElementById("username").focus(); }); 光标在username的时候点击enter回车键的时候光标移动到id为password的input里面 document.getElementById("username…...

Cannot read properties of undefined (reading ‘init‘)报错

出现这个报错是印象项目没有引echarts包 npm i echarts 下包 然后在main.js中引入 import echarts from echarts Vue.prototype.$echarts echarts 如果还不行 import * as echarts from echarts; 更改一下引入方式 ok了...

golang html/template模板中使用自定义函数/方法的2种方法总结

在golang的html/template模板库中我们如果希望在视图文件中调用自定义的函数 或者方法可以通过以下2种方法实现&#xff1a; 1. 调用自定义函数 可通过将自定义的函数加入到 template.FuncMap中&#xff0c;然后再使用 template.New("xxx.html").Funcs(funcMap)来在…...

浅析vue3自定义指令

vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量&#xff0c;vue怎么知道这是一个指令呢&#xff1f; 这是因为约定大于配置&#xff0c;vue3中有这样一个约定&#xff08;截图来自官方文档&#xff09;&#xff1a; 注意这里说的是驼峰命令&#x…...

后仿真中的关于延时问题(延迟类型选择和脉冲控制)

目录 通过前面的文章提到,从物理特性角度出发,仿真中存在两种延时:惯性延时和传输延时。那么,实际仿真电路过程中,我们究竟选择的哪种模式呢? 一 指定传输延迟类型 传输延迟类型不是默认的延迟类型。我们需要显示指定它。 1.1 module-path delay VCS 仿真中添加如下三…...

欧拉公式e^(ix)=(cos x+isin x)

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#张亿&#xff0c;今天呐&#xff0c;学的是欧拉公式 在不同的学科中有着不同的含义和应用。在复变函数中&#xff0c;欧拉公式表述为e^(ix)(cos xisin x)&#xff0c;其中e是自然对数的底&#xff0c;i是虚数单位&#x…...

Android 获取已安装应用、包名、应用名、版本号、版本名

1、相关代码 List<ApplicationInfo> installedApps getPackageManager().getInstalledApplications(0);for (ApplicationInfo appInfo : installedApps) {CharSequence getAppName getPackageManager().getApplicationLabel(appInfo);String appNamegetAppName.toStrin…...

2024数学建模深圳杯B题成品论文43页word+完整可视化结果图+可执行代码

【无水印word】2024深圳杯B题成品论文43页&#xff08;附带1-4小问完整py解题代码思路&#xff09;https://www.jdmm.cc/file/2710664 批量工件并行切割下料优化研究 摘 要 本研究针对批量工件并行切割下料问题展开了深入的探讨与分析。通过建立数学模型和运用优化算法&…...

达梦(DM) SQL查询及联合查询

达梦DM SQL查询及联合查询 查询结果排序多表联合查询 这里继续讲解DM数据库的Sql查询操作 查询结果排序 为提高查询结果可读性&#xff0c;我们可以对查询结果按照一定顺序排列&#xff0c;或者也可以将列名替换成数字&#xff0c;例如 ORDER BY 1 DESC&#xff0c;意思是按第…...

拯救者工具箱终极指南:3大场景化解决方案提升笔记本使用体验

拯救者工具箱终极指南&#xff1a;3大场景化解决方案提升笔记本使用体验 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 联想…...

iOS 27 Siri 自动删除聊天记录:深度解析与行业启示

上周同事跟我吐槽&#xff0c;说他跟Siri聊了点私事&#xff0c;换手机时发现聊天记录全在iCloud里躺着。我跟他说&#xff0c;等iOS 27吧&#xff0c;Siri终于要加自动删除功能了。这个功能不算革命性创新&#xff0c;但方向是对的。下面从用户价值、技术实现和行业影响三个维…...

基于MATLAB的GPS捕获、跟踪与PVT计算实现

一、系统架构设计 GPS信号处理流程分为信号捕获、信号跟踪、导航电文解调和PVT解算四个核心模块。以下为MATLAB实现框架&#xff1a; % 主程序流程 [acquired_data, doppler_shift, code_phase] acquisition(signal, PRN_list); [tracked_data, cn0_est] tracking(acquired_d…...

DDoS防护架构解析与实战经验

随着互联网业务的迅猛发展&#xff0c;企业在享受技术红利的同时&#xff0c;也面临着越来越复杂的安全挑战。分布式拒绝服务攻击&#xff08;DDoS&#xff09;作为一种常见的网络攻击手段&#xff0c;能够通过大量的虚假流量导致服务器过载&#xff0c;从而影响业务的正常运行…...

一款面向高清多媒体应用的高性价比解决方案

Hi-CHIP C3100是一款面向高清多媒体应用的高性价比解决方案。它集成了高性能32位RISC CPU与强大的多媒体处理系统&#xff0c;支持2K视频解码和显示&#xff0c;并提供丰富的外设接口。主要规格与特性特性类别具体规格CPU双核高性能32位RISC CPU&#xff0c;性能达2000 DMIPS&a…...

告别ActiveX!用WebSocket+JavaScript在Chrome/Firefox里直接调用扫描仪(附完整代码)

现代浏览器无插件扫描方案&#xff1a;WebSocket与JavaScript的完美结合 曾几何时&#xff0c;企业办公系统中扫描文档需要依赖特定的浏览器和插件。如今&#xff0c;随着技术演进&#xff0c;我们终于可以摆脱ActiveX和NPAPI的束缚&#xff0c;在Chrome、Firefox等现代浏览器中…...

LinuxVLAN接口异常定位实战

LinuxVLAN接口异常定位实战这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在VLAN接口&#xff0c;重点讨论链路隔离、子接口和二层网络划分。在真实生产环境中&#xff0c;VLAN接口相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、资源状…...

SNMP Exporter实战指南:构建企业级网络监控架构的深度解析

SNMP Exporter实战指南&#xff1a;构建企业级网络监控架构的深度解析 【免费下载链接】snmp_exporter SNMP Exporter for Prometheus 项目地址: https://gitcode.com/gh_mirrors/sn/snmp_exporter SNMP Exporter作为Prometheus生态中的关键组件&#xff0c;专为网络设备…...

【RuoYi】数据分页功能分析 —— 以登录日志页面为例

本文基于 RuoYi-Vue v3.8.2&#xff0c;以"监控 → 登录日志"页面为例&#xff0c;从前端代码、前端开发者工具、后端代码到后端 Log 输出&#xff0c;完整分析 RuoYi 框架中数据分页的实现原理。一、实例简介本次分析选取的含数据分页功能的页面为&#xff1a;系统管…...

python海龟绘图之点击屏幕事件处理

在《python海龟绘图之鼠标事件处理》中提到&#xff0c;onclick()函数能够对鼠标点击事件进行处理。但是该鼠标点击事件指的是鼠标点击到海龟图标上的事件&#xff0c;而如果要处理鼠标点击到海龟绘图窗口的任意位置事件的处理&#xff0c;则要用到onscreenclick()函数。通过on…...