7X24小时服务热线:

020-88888888

您的位置: 主页 > 我们为客户提供解决方案 > 售后服务

如何编写完美的Python命令行程序?|ku酷游网址

发布时间:2024-03-23点击数:

本文摘要:作为Python开发者,我们常常要撰写命令行程序。

作为Python开发者,我们常常要撰写命令行程序。比如在我的数据科学项目中,我要从命令行运营脚本来训练模型,以及计算出来算法的准确率等。

因此,更加便利更加易懂的脚本需要很好地提升生产力,特别是在有多个开发者专门从事同一个项目的场合下。因此,我建议你遵循以下四条规则:尽量获取配置文件参数值所有错误情况必需处置(例如,参数缺陷,类型错误,去找将近文件)所有参数和选项必需有文档不是立刻已完成的任务应该表明进度条荐个非常简单的例子我们把这些规则应用于到一个明确的例子上。这个脚本可以用于凯撒加密法加密和解密消息。

假设早已有个写出好的encrypt函数(构建如下),我们必须创立一个非常简单的脚本,用来加密和解密消息。我们期望让用户通过命令行参数自由选择加密模式(配置文件)和解密模式,并自由选择一个秘钥(配置文件为1)。defencrypt(plaintext,key):cyphertext=''forcharacterinplaintext:ifcharacter.isalpha():number=ord(character)number+=keyifcharacter.isupper():ifnumber>ord('Z'):number-=26elifnumber<ord('A'):number+=26elifcharacter.islower():ifnumber>ord('z'):number-=26elifnumber<ord('a'):number+=26character=chr(number)cyphertext+=characterreturncyphertext我们的脚本必须做到的第一件事就是提供命令行参数的值。

当我搜寻“pythoncommandlinearguments”时,经常出现的第一个结果是关于sys.argv的,所以我们来试试这个方法……“初学者”的方法sys.argv是个列表,包括用户在运营脚本时输出的所有参数(还包括脚本名自身)。例如,如果我输出:>pythoncaesar_script.py--key23--decryptmysecretmessagepbvhfuhwphvvdjh该列表将包括:['caesar_script.py','--key','23','--decrypt','my','secret','message']因此只需迭代该参数列表,寻找'--key'(或'-k')以获得秘钥值,寻找'--decrypt'以设置解密模式(实质上只必须用于秘钥的翻转作为秘钥才可)。最后我们的脚本大体如下:importsysfromcaesar_encryptionimportencryptdefcaesar():key=1is_error=Falseforindex,arginenumerate(sys.argv):ifargin['--key','-k']andlen(sys.argv)>index+1:key=int(sys.argv[index+1])delsys.argv[index]delsys.argv[index]breakforindex,arginenumerate(sys.argv):ifargin['--encrypt','-e']:delsys.argv[index]breakifargin['--decrypt','-d']:key=-keydelsys.argv[index]breakiflen(sys.argv)==1:is_error=Trueelse:forarginsys.argv:ifarg.startswith('-'):is_error=Trueifis_error:print(f'Usage:python{sys.argv[0]}[--key<key>][--encrypt|decrypt]<text>')else:print(encrypt(''.join(sys.argv[1:]),key))if__name__=='__main__':caesar()这个脚本遵循了一些我们前面引荐的规则:反对配置文件秘钥和配置文件模式基本的错误处理(没获取输出文本的情况,以及获取了无法辨识的参数的情况)错误时或者不带上任何参数调用脚本时会表明文档:>pythoncaesar_script_using_sys_argv.pyUsage:pythoncaesar.py[--key<key>][--encrypt|decrypt]<text>但是,这个凯撒加密法脚本过于宽了(39行,其中甚至还没有还包括加密代码本身),而且很难背诵。

解析命令行参数应当还有更佳的办法……试试argparse?argparse是Python用来解析命令行参数的标准库。我们来想到用argparse怎样撰写凯撒加密的脚本:importargparsefromcaesar_encryptionimportencryptdefcaesar():parser=argparse.ArgumentParser()group=parser.add_mutually_exclusive_group()group.add_argument('-e','--encrypt',action='store_true')group.add_argument('-d','--decrypt',action='store_true')parser.add_argument('text',nargs='*')parser.add_argument('-k','--key',type=int,default=1)args=parser.parse_args()text_string=''.join(args.text)key=args.keyifargs.decrypt:key=-keycyphertext=encrypt(text_string,key)print(cyphertext)if__name__=='__main__':caesar()这段代码也遵循了上述规则,而且与前面的手工撰写的脚本比起,可以获取更加精确的文档,以及更加具备交互性的错误处理:>pythoncaesar_script_using_argparse.py--encodeMymessageusage:caesar_script_using_argparse.py[-h][-e|-d][-kKEY][text[text...]]caesar_script_using_argparse.py:error:unrecognizedarguments:--encode>pythoncaesar_script_using_argparse.py--helpusage:caesar_script_using_argparse.py[-h][-e|-d][-kKEY][text[text...]]positionalarguments:textoptionalarguments:-h,--helpshowthishelpmessageandexit-e,--encrypt-d,--decrypt-kKEY,--keyKEY但是,细心看了这段代码后,我找到(虽然有点主观)函数结尾的几行(从7行到13行)定义了参数,但定义方式并不过于高雅:它过于散漫了,而且几乎是程式化的。

应当有更加描述性、更加简练的方法。click能做到得更佳!幸运地的是,有个Python库能获取与argparse某种程度的功能(甚至还能获取更加多),它的代码风格更加高雅。这个库的名字叫click。这里是凯撒加密脚本的第三版,用于了click:importclickfromcaesar_encryptionimportencrypt@click.command()@click.argument('text',nargs=-1)@click.option('--decrypt/--encrypt','-d/-e')@click.option('--key','-k',default=1)defcaesar(text,decrypt,key):text_string=''.join(text)ifdecrypt:key=-keycyphertext=encrypt(text_string,key)click.echo(cyphertext)if__name__=='__main__':caesar()留意现在参数和选项都在标记器里定义,定义好的参数必要作为函数参数获取。

我来解释一下上面代码中的一些地方:脚本参数定义中的nargs参数登录了该参数期望的单词的数目(一个用引号含一起的字符串算数一个单词)。默认值是1。

这里nargs=-1容许接管给定数目的单词。--encrypt/--decrypt这种读音可以定义几乎物理地址的选项(类似于argparse中的add_mutually_exclusive_group函数),它将产生一个布尔型参数。click.echo是该库获取的一个工具函数,它的功能与print完全相同,但相容Python2和Python3,还有一些其他功能(如处置颜色等)。

加到一些隐秘性这个脚本的参数(被加密的消息)应该是最低机密。而我们却拒绝用户必要在终端里输出文本,使得这些文本被记录在命令历史中,这不是很嘲讽吗?解决问题方法之一就是用于隐蔽的提醒。或者可以从输出文件中加载文本,对于较长的文本来说更加实际一些。

或者可以索性让用户自由选择。输入也一样:用户可以留存到文件中,也可以输入到终端。


本文关键词:ku酷游网址

本文来源:ku酷游网址-www.pawleysislandlitchfieldbeach.com

在线客服
服务热线

服务热线

020-88888888

微信咨询
ku酷游网址(中国)有限公司官网
返回顶部