• 是我太天真之被BUG按在地上疯狂摩擦


      事情是这样的,我是一个追求完美的人,特别喜欢锦上添花,去年在学习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() 要随时记得

      要注意休息、多喝热水

  • 相关阅读:
    js浏览器对象
    js对象
    js基础
    css的常见操作
    css 盒子模型
    css定位与浮动
    汇编三(习题)
    pyEcharts安装及使用指南(最新)
    pyEcharts安装及使用指南
    Anaconda安装第三方库与pip和conda 添加国内源
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10444722.html
Copyright © 2020-2023  润新知