【Python】防御性编程入门
1. 前言
防御性编程指的是为了防止代码泄露后被竞品公司窃取技术,使用一种较高级的明文加密编程方式。也可以当做一种带解密性质的时间胶囊,锻炼程序员自己的记忆能力、读代码能力等。
2. 案例分析
2.1 import
Import里面可以多取一些喜欢的名字,也可以取简写- 原生库和三方库混着
Import - 单
Import和from交错使用,增加美观性 - 模块和模块内的函数都分别导入,使用更加方便
- 相同作用的库都导入,如这里的
pathlib和os,又比如可以math和numpy换着用
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. 前言 防御性编程指的是为了防止代码泄露后被竞品公司窃取技术,使用一种较高级的明文加密编程方式。也可以当做一种带解密性质的时间胶囊,锻炼程序员自己的记忆能力、读代码能力等。 2. 案例分析 2.1 import Import里面可以多取一些喜欢的名字&#…...
无线麦克风哪个品牌音质最好?热门无线麦克风品牌推荐
这段时间短视频行业兴起,很多人都开始尝试步入自媒体,不过想要自己的视频内容更出色、更吸引人,好的音频设备肯定是必不可少的,而麦克风就是其中的一种。麦克风的好坏也将决定了一个视频的质量与完整性等等,如果我们作…...
粒子奇观:用Processing创造宇宙级的动态效果
前言: 👋 今天,我们将一起探索宇宙的奥秘,不是在星空下,而是在Processing的代码世界中。这是我们的第八篇文章,我们将深入粒子系统的神奇领域,学习如何创造出令人惊叹的动态效果。 粒子系统:构建动态世界的基石 🔨 粒子系统是计算机图形学中用于模拟复杂自然现象…...
Filesystem Fragmentation on Modern Storage Systems——论文泛读
TOCS 2023 Paper 论文阅读笔记整理 问题 文件系统碎片是计算机系统随着时间的推移而变慢的主要原因之一。以前认为,碎片化对硬盘驱动器(HDD)等旋转存储设备有害,但不影响固态驱动器(SSD),因为…...
如何同步管理1000个设备的VLAN数据?
什么是VLAN? VLAN,也就是虚拟局域网,是通过为子网提供数据链路连接来抽象出局域网的概念。在企业网中,一个企业级交换机一般是24口或者是48口,连接这些接口的终端在物理上形成一个广播域。广播域过大,就会导…...
【谷粒商城】01-环境准备
1.下载和安装VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads 傻瓜式安装VirtualBox 2.下载和安装Vagrant官方镜像 地址:https://app.vagrantup.com/boxes/search 傻瓜式安装 验证是否安装成功 打开CMD,输入vagrant命令,是否…...
2024深圳杯数学建模C题参考论文24页+完整代码数据解题
一、问题研究 24页参考论文: 【编译器识别】2024深圳杯C题24页参考论文1-3小问完整解题代码https://www.jdmm.cc/file/2710545/ 为了回答这些问题,我们需要进行一系列的编译实验、分析编译结果,并构建判别函数。以下是对这些问题的初步分析…...
用go语言写一个代码,加班就自动给老婆发信息,下班自动提醒的代码
文章推荐 1 作为程序员,开发用过最好用的AI工具有哪些? 2 Github Copilot正版的激活成功,终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手,帮助你提高写代码效率 5 Jetbrains的a…...
Spring-Cloud 微服务
1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war,然后部署一个进程 优点: 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的…...
python数据分析——数据可视化(图形绘制基础)
数据可视化(图形绘制基础) 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制plot示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线图的…...
必背!!2024年软考中级——网络工程师考前冲刺几页纸
距离软考考试的时间越来越近了,趁着这两周赶紧准备起来 今天给大家整理了——软考网络工程师考前冲刺几页纸,都是核心重点,有PDF版,可打印下来,每天背一点。 计算机总线分类 ①总线的分类:数据总线、地址总…...
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种方法实现: 1. 调用自定义函数 可通过将自定义的函数加入到 template.FuncMap中,然后再使用 template.New("xxx.html").Funcs(funcMap)来在…...
浅析vue3自定义指令
vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量,vue怎么知道这是一个指令呢? 这是因为约定大于配置,vue3中有这样一个约定(截图来自官方文档): 注意这里说的是驼峰命令&#x…...
后仿真中的关于延时问题(延迟类型选择和脉冲控制)
目录 通过前面的文章提到,从物理特性角度出发,仿真中存在两种延时:惯性延时和传输延时。那么,实际仿真电路过程中,我们究竟选择的哪种模式呢? 一 指定传输延迟类型 传输延迟类型不是默认的延迟类型。我们需要显示指定它。 1.1 module-path delay VCS 仿真中添加如下三…...
欧拉公式e^(ix)=(cos x+isin x)
啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是欧拉公式 在不同的学科中有着不同的含义和应用。在复变函数中,欧拉公式表述为e^(ix)(cos xisin x),其中e是自然对数的底,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页(附带1-4小问完整py解题代码思路)https://www.jdmm.cc/file/2710664 批量工件并行切割下料优化研究 摘 要 本研究针对批量工件并行切割下料问题展开了深入的探讨与分析。通过建立数学模型和运用优化算法&…...
达梦(DM) SQL查询及联合查询
达梦DM SQL查询及联合查询 查询结果排序多表联合查询 这里继续讲解DM数据库的Sql查询操作 查询结果排序 为提高查询结果可读性,我们可以对查询结果按照一定顺序排列,或者也可以将列名替换成数字,例如 ORDER BY 1 DESC,意思是按第…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
