事情是这样的,我是一个追求完美的人,特别喜欢锦上添花,去年在学习python的时候做了一个作业:多重剪贴板,今天大概是吃饱了,查了一下自己的头发以后,我觉得可以挑战一下自己,所以决定为那个小程序添加一些功能,下面有描述,原以为这个过程会十分顺利,然而 shelve 君早已看穿了一切。。。

为“多重剪贴板”增加功能:

  增加一个 delete <keyword> 命令行参数,它将从Shelve值中删除一个关键字。假如不提供关键字,将删除所有的关键字

  我是这样做的:先去瞧了书上的shelve模块,发现没有删除的介绍。又想起shelve储存值的方式与字典类似又看了书,结果没有,只能上网搜索了,说起来,我好像一直就是宁愿在书上翻来翻去而不去新平台查阅东西。。。最后当然查出来了发现是这样删除的:

>>> import shelve
>>> mcbShelve=shelve.open('mcb')
>>> del mcbShelve['cats'] #删除键值对
>>>mcbShelve.close() #记得关闭

  知道了操作的方法,就成功了一半,你以为我马上就要去写了吗,不,我没有,它不是和字典类似吗,我马上又去试了字典的删除键值对方式,结果是的,get!

  果然,出现了问题,命令行运行失败代码如下

 1 #! python3
2 # mcb.pyw - Save and load pieces of text to the clipboard.
3 # Usage: py.exe mcb.pyw save <keyword> - Saves clipboard to keyword
4 # py.exe mcb.pyw <keyword> - Loads keyword to clipboard
5 # py.exe mcb.pyw list - Loads all keywords to clipboard
6 # py.exe mcb.pyw delete <keyword> - 删除键名为<keyword>的键值对
7 # py.exe mcb.pyw delete - 删除全部的键值对
8
9 import shelve ,pyperclip,sys
10
11 mcbShelf=shelve.open('mcb')
12 #Save clipboard content
13 if len(sys.argv)==3:
14 if sys.argv[1].lower()=='save':
15 mcbShelf[sys.argv[2]]=pyperclip.paste()
16 else:
17 del mcbShelf[sys.argv[1]]
18 elif len(sys.argv)==2:
19 #List keywords and load content
20 if sys.argv[1].lower()=='list':
21 pyperclip.copy(str(list(mcbShelf.keys())))
22 elif sys.argv[1].lower()=='delete':
23 for i in mcbShelve.keys():#通过遍历删除所有的键值对
24 del mcbShelve[i]
25 elif sys.argv[1] in mcbShelf:
26 pyperclip.copy(mcbShelf[sys.argv[1]])
27 else:
28 print('请阅读说明')
29
30 mcbShelf.close()

  使用命令行调用没反应,不会输出“请阅读说明”,明明昨天还好好的,我就只不过改了if逻辑,然后就死了,我以为是pyw格式的问题,改回来还是不行,只好重新新建了了两个文件 mcb-Bate.py 、 mcb-Bate.bat 把原来代码复制进去就好了,这下能运行了但是发现23行的代码中的变量拼错了 mcbShelve 应该是 mcbShelf 修改之后,运行:

mcb-bate delete

  这次运行:

1 mcb-bate list

  返回的是空

  但在shell里检查:

1 >>> for items in mcbShelf.items():
2 items
3
4
5 ('Job', {'name': 'Job', 'sex': 'boy'})
6 ('Karry', {'name': 'Karry', 'sex': 'gril'})
7 >>>

  还是无效啊

  经过严谨的思考和测试,我发现命令行运行和shell运行出来的结果会不相同代码如下:

 1 #! python3
2 # mcb.pyw - Save and load pieces of text to the clipboard.
3 # Usage: py.exe mcb.pyw save <keyword> - Saves clipboard to keyword
4 # py.exe mcb.pyw <keyword> - Loads keyword to clipboard
5 # py.exe mcb.pyw list - Loads all keywords to clipboard
6 # py.exe mcb.pyw delete <keyword> - 删除键名为<keyword>的键值对
7 # py.exe mcb.pyw delete - 删除全部的键值对
8
9 import shelve ,pyperclip,sys
10
11
12 #定义方法来遍历shelve值
13 def traversing(parameter):
14 print('当前shelve值:')
15 for item in parameter.items():
16 print(item)
17
18 mcbShelf=shelve.open('mcb')
19 #Save clipboard content
20 print(len(sys.argv))
21
22 if len(sys.argv)==3:
23 if sys.argv[1].lower()=='save':
24 mcbShelf[sys.argv[2]]=pyperclip.paste()
25 else:
26 del mcbShelf[sys.argv[2]]
27 elif len(sys.argv)==2:
28 #List keywords and load content
29 if sys.argv[1].lower()=='list':
30 pyperclip.copy(str(list(mcbShelf.keys())))
31 elif sys.argv[1].lower()=='delete':
32 for i in mcbShelf.keys():#通过遍历删除所有的键值对
33 del mcbShelf[i]
34 elif sys.argv[1] in mcbShelf:
35 pyperclip.copy(mcbShelf[sys.argv[1]])
36 else:
37 print('请阅读说明')
38 traversing(mcbShelf)
39 mcbShelf.close()

  命令行运行结果:

  shell运行结果

  聪明的分割线


  截好第一个图我明白了,之所以不同,是因为我用的命令行参数,而 F5  不会向shell传参数,本以为 shelve 君就会这样放过我,然而:

1 >>> mcbShelf=shelve.open('mcb')  #这是在shell中,mcb是Shelve值名称
2 >>> list(mcbShelf.values())
3 [{'name': 'Job'}]

  看到这个结果,我胖虎无话可说。。。

吃堑长智的结果:

  要养成严密的逻辑, close() 要随时记得

  要注意休息、多喝热水

是我太天真之被BUG按在地上疯狂摩擦的更多相关文章

  1. swiper内容滚动太长滚动Bug

    swiper内部有个横向滚动的盒子 由于swiper滚动,导致滚动盒子的时候自动跳到了下一页 wiper提供一个 noSwipingClass的属性,用来阻止自带的滚动事件 window.mySwip ...

  2. 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝​

    刚入职的程序员新人,办公桌上,基本上也就一电脑.一键盘.一鼠标,再配个被杯子.然而混迹职场多年的猿老们,办公桌上都有一些彰显身份地位的“好东西”. 这张图两点颇多,最显眼的,是办公桌上那个黄黄的东西, ...

  3. 百度地图ip定位,不算bug的bug

    做为一个入行不足两年的菜鸟,能在博客园写下第一篇博客,是需要多大的勇气啊.主要还是怕大神们喷啊.其次自己文笔实在太差了. 哈哈~还请各位大神,口下留情啊. 首先说下我的需求:一个需要城市分站的手机站. ...

  4. 一不注意,在Unity3D中DllImport 引起的Bug.

    单要说这个Bug是很简单,但是得从头说起. 一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情.所以就需要用到动态 ...

  5. 关于那些难改的bug

    多年的测试经验中,经常发现有这么一种现象:总有些提了的bug不能顺利的被修复.这些bug往往有4个走向: 1.在被发现的版本中最终被解决,但中途花费较多周折. 2.有计划的在后续的版本中被解决. 3. ...

  6. 【Asp.Net】小BUG汇总[更新]

    目录结构 1.Dictionary<T>遍历 2.Asp.net网站部署在C盘无法上传下载文件 3.Asp.Net网站发布后远程无法访问 4.GDI+中发生一般性错误 1.Dictiona ...

  7. 微信小程序和微信H5测试中易出Bug的点和注意事项

    一.微信小程序 易出Bug的点: 小程序的分享转发功能 背景:小程序项目开发基本完毕也都已经测过几轮,功能上基本没有什么问题,但是上线后却被客户发现通过分享转发小程序给别人,别人无法正常打开的情况 原 ...

  8. 谈谈对bug的一点想法,说说做好日志记录的重要性

    说起程序猿,总绕不开的一个话题就是bug,估计每个程序猿听到某某测试跑过来一脸淫笑的告诉你这个功能有个bug的时候,总有种恨不得掐死他的想法.其实程序猿跟bug的关系,感觉有点像父亲和儿子的关系,自己 ...

  9. 记一个男默女泪的 BUG

    姗姗来迟的词频统计代码 BUG 的发现 1. 此前提交的第一次代码作业总结博客 http://www.cnblogs.com/ustczwq/p/8680704.html 2. BUG 本天成,妙手偶 ...

随机推荐

  1. P3809 【模版】后缀排序

    题目背景 这是一道模版题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...

  2. SVN Commit报错 svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted

    svn commit 文件出错 svn: E155037: Commit failed (details follow): svn: E155037: Previous operation has n ...

  3. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  4. Debian9.5系统DHCP服务器ISC DHCP软件配置说明

    DHCP 全称Dynamic Host configuration protocol, 动态主机配置协议.是一个局域网的网络协议,使用UDP协议工作,它可以为客户机自动分配IP地址.子网掩码以及缺省网 ...

  5. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  6. Vue内置指令

    v-text 类型: string用法: 更新元素的 textContent.如果要更新部分的 textContent ,需要使用 {{ Mustache }} 插值. v-html 类型: stri ...

  7. 【codeforces 95C】Volleyball

    [题目链接]:http://codeforces.com/problemset/problem/95/C [题意] 给你n个点,m条边; 每个点有一辆出租车; 可以到达离这个点距离不超过u的点,且在这 ...

  8. 【图灵杯 E也即POJ 3368】简单的RMQ

    Description 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i,j],求其中某个元素重复出现的最大次数. Input 多组数据输入.每组数据的第一行包含两个整数n和q(1< ...

  9. poj3134 Power Calculus IDA*

    好端端的一道搜索题目,,,硬生生的被我弄成了乱搞题,,,枚举当前的maxd,深搜结果,然而想到的剪枝方法都没有太好的效果,,,最后用一个贪心乱搞弄出来了,,, 贪心:每次必用上一次做出来的数字与其他数 ...

  10. C++ 何时使用动态分配(即使用newkeyword)?何时使用指针?

    动态分配 在你的问题里.你用了两种方式创建对象.这两种方式基本的不同在于对象的存储时间. 当运行Object myObject;这句代码时.它作为自己主动变量被创建,这意味着当对象出了作用域时也会自己 ...