事情是这样的,我是一个追求完美的人,特别喜欢锦上添花,去年在学习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. HD-ACM算法专攻系列(11)——Exponentiation

    问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...

  2. Servlet学习(一)——Servlet的生命周期、执行过程、配置

    1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过jav ...

  3. Analysis of the Facebook.app for iOS

    Analysis of the Facebook.app for iOS Posted Oct 18, 2016 Did you ever wonder why the Facebook.app fo ...

  4. IOS设备获取崩溃日志的办法

    除了用xcode 的devices功能获取之外,在windows下面也是可以获取的.首先安装itools.下载地址: http://www.itools.cn/ 安装好后将设备(iphone或ipad ...

  5. 使用rman恢复数据小结

    恢复前提有数据备份 以 alter database open resetlogs 开机以后多要做一次全备(以前的备份失效了) 恢复参数文件: restore spfile from '/home/o ...

  6. Volatile variables

    Volatile variables apply another type of memory constraint to individual variables. The compiler oft ...

  7. HTML、CSS规范

    作为一名前端开发者,至少要对HTML.CSS规范有个了解,然后尝试在项目是使用,以便别人阅读你代码的时候,也相对轻松点. HTML.CSS规范,参见:编码规范 by @mdo JavaScript 参 ...

  8. NOIp模拟赛二十九

    又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...

  9. Edward Frenkel关于几何化朗兰兹纲领的采访

    本文来自:菲尔兹奖座谈会 博客 Edward Frenkel教授的主要研究方向是数学与量子物理中的对称.他现在在做的许多问题都与朗兰兹纲领有关.他现在是加州大学伯克利分校的数学教授. 在今年的菲尔兹奖 ...

  10. Python+Appium来写app自动化脚本

    1...........................我有空再补