Typer 构建命令行应用

1. 摘要

Typer 是一个构建命令行程序的python包,它具有一下几个优点:

  1. 设计简单,学习成本低,花费更少的时间debug
  2. 用户使用便捷,自动构建帮助文档并适配所有shell
  3. 代码量低,减少大量重复
  4. 起步简单,只需两行代码即可构建一个app

2. 安装

pip install "typer[all]"

3. 实例

  • 创建一个test_app命令,打印Hello + 参数
import typer

app = typer.Typer()


@app.command()
def test_app(name: str):
    print(f"Hello {name}")


if __name__ == "__main__":
    app()
  • 打印帮助文档

  • 测试

4. 用法简介

4.1. 命令

typer中,只要给每一个函数加上@app.command()装饰器,那么这个函数就成为了一个命令。

import typer

app = typer.Typer()


@app.command()
def test_1(name: str):
    print(f"Hello {name}")

@app.command()
def test_2(age: int):
    print(f"{age} years old")    

if __name__ == "__main__":
    app()
  • help

  • 测试

需要多少个命令,写多少个函数即可。

4.2. 参数

typer中,命令函数中的参数,就自动变成了命令的参数,因此用户很容易设置参数。

  • 将上面两个命令合并为一个
import typer

app = typer.Typer()


@app.command()
def test_cli(name: str, age: int):
    print(f"Hello {name} \n age: {age}")


if __name__ == "__main__":
    app()
  • help文档

  • 测试

需要多少个命令参数,设置多少个函数参数即可

4.3. 子命令

例如git命令还存在git addgit commit 等,因此typer也支持给命令设置子命令。

  • 两个子命令
import typer

app = typer.Typer()

sub1 = typer.Typer()

app.add_typer(sub1, name="sub1")

sub2 = typer.Typer()
app.add_typer(sub2, name="sub2")


@sub1.command("sub1")
def sub1_item(space1: str):
    print(f"Creating sub1: {sub1}")


@sub2.command("sub2")
def sub2_item(space1: str):
    print(f"Creating sub1: {sub2}")


if __name__ == "__main__":
    app()
  • help文档

  • 子命令 sub1

以上只是对typer的基础介绍,typer还支持:

  1. 参数类型检查,默认设置,区间设置,交互式命令

  1. 彩色打印等

  1. 进度条

  1. 错误提醒

5. 小结

Typer的优点和功能远不于此,本文主要对typer, 一个python中构建命令行程序的包,做了一个简要介绍,主要起抛砖引玉的作用,如果有这方面需求的小伙伴可以自行研究。

本文转载于网络 如有侵权请联系删除

相关文章

  • 位运算符

    简介从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。口说无凭,举一个简单的例子来看下CPU是如何进行计算的,比如这行代码:inta=35; intb=47; intc=a+b;复制计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:35:00100011 47:00101111 ———————————————————— 82:01010010复制所以,相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。符号描述运算规则&与两个位都为1时,结果才为1|或两个位都为0时,结果才为0^异或两个位相同为0,相异为1~取反0变1,1变0<<左移各二进位全部左移若干位,高位丢弃,低位补0>>右移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)按位与运算符(&)定

  • JSON Web Token攻击

    JSONWebToken(JWT)对于渗透测试人员而言,可能是一个非常吸引人的攻击途径。因为它不仅可以让你伪造任意用户获得无限的访问权限且还可能进一步发现更多的安全漏洞,如信息泄露,越权访问,SQLi,XSS,SSRF,RCE,LFI等。 首先我们需要识别应用程序正在使用JWT,最简单的方法是在代理工具的历史记录中搜索JWT正则表达式:[=]ey[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*-网址安全的JWT版本 [=]ey[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]*-所有JWT版本(可能误报)复制确保选中“区分大小写”和“正则表达式”选项:当你获得一个JSONwebtoken,如何利用它们绕过访问控制并入侵系统?1、敏感信息泄露由于Header和Payload部分是使用可逆base64方法编码的,因此任何能够看到令牌的人都可以读取数据。 要读取内容,您只需要将每个部分传递给base64解码函数,以下是一些示例: Linuxbase64工具(带有-d标志用于解码):$echoeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1N

  • 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍戳我 这里我们只做所有最短路的具体分析。那么同是求解最短路,这些算法到底有什么区别和联系:对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时间复杂度绝对是在大型图中难以接受的,所以BFS题目设计很精巧,数据限制,更重要的是他可以处理一些条件很麻烦的联通情况,比如在途中,每步长相同求到达某一地的时间,那么我们要用最短路,就需要建图,但是借助BFS就不需要建图,这么麻烦的事情了。对于其他最短路,核心思想是松弛,那么先说Floyd,其核心思想是插点法松弛借助动态规划,这就是重点,那么既然是插点而且是动态规划,那么他就可以解决过某一点的最短最长路,或最什么什么的问题了,因为DP会不重复的枚举每一种情况,相当于插了尽可能的点,那么插点的问题就可以解决,比如不经过某一点的最短路问题,不经过超得过某个值的点的最短路。对于最短路的其他算法,先讨论Ford家族,Bellman-Ford与SPFA的区别,emmm,名字不一样,速度不一样,但是使用情况都一样,都是可处理负边权,但是复杂度最恶劣为O(V*E)顶点数乘边数,那么稠密图直接挂掉。都能能判负环,

  • 日常踩坑实录

    前言在coding的过程中,难免会遇到各种问题,我把踩过/填满的坑记录下来,一方面有助于今后查缺补漏,也希望能够帮到其它小伙伴。——byGitOPEN 碎片过滤字符串中的emoji表情和符号[Python]最近在抓取了几十万条微博数据,目的是对其进行情感分析,这就需要过滤掉内容中表情等特殊符号。在Google了一圈以后,发现很多方法过滤的效果不好,因此自己记录一下,如何更加全面的过滤掉表情符号。这个方法综合使用了正则表达式和emoji库。importemoji deffilter_emoji(text): """ 过滤表情。 Author:GitOPEN """ try: regex=re.compile(u'[\U00010000-\U0010ffff]') exceptre.error: regex=re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') text=regex.sub(u'',text) return&#

  • 使用文本框TextView/EditText的清单

    在实际的开发中TextView和EditText是非常基本的控件。这两个控件的使用也是十分简单。而TextView/EditText的功能其实也是非常强大,例如简单的图文就可以使用TextView配合Spannable来实现,以及TextView的drawableTop属性。而使用以下的这些库则可以帮我们很方便实现各种需求,例如标签云、支持各种字体、文本动画、富文本编辑框等等需求。AndroidTagGroup 一个漂亮的标签控件,可以动态添加和删除标签 https://github.com/2dxgujun/AndroidTagGroup AutoFitTextView 可以让Text自适应父View的大小,父View有多大就显示多少Text https://github.com/grantland/android-autofittextview HTextView 拥有各种酷炫动画的TextView https://github.com/hanks-zyh/HTextView Calligraphy 支持各种字体显示文本 https://github.com/chrisjenx/C

  • 深度学习之TensorFlow:第五次印刷最新勘误表

    《深度学习之TensorFlow:入门、原理与进阶实战》一书至2018年3月1号上架后,广受读者欢迎。由于编写时的匆忙与疏忽。书中也会存在些纰漏,在此诚恳的向读者们道个歉。并将第五次印刷勘误提供出来,供读者们参考。也欢迎读者对后续的内容继续斧正。勘误详情如下:1.第44页中勘误,见下图。2.第52页中勘误,见下图。 3.第54页中勘误,见下图 4.第113页中勘误,见下图 5.第168页中勘误,见下图 6.第297页中勘误,见下图 7.第314页中勘误,见下图8.第325页中勘误,见下图9.第350页中勘误,见下图

  • 两数之和(三)

    题目:设计一个类,包含如下两个成员函数: Save(intinput) 插入一个整数到一个整数集合里。 Test(inttarget) 检验是否存在两个数和为输入值。如果存在这两个数,则返回true;否则返回false。 注意:允许有相同的元素。伪代码:这里写代码片复制R语言:two_numbers_3<-function(a) { s=unique(a) for(iin1:length(s)) { if(is.element(new_input-s[i],s)) { k=k+1 res=append(res,TRUE) } else { k=k+1 res=append(res,FALSE) } } if(sum(res)>0) { print("true") } else { print("false") } } >res=c() >new_input<-scan() 1:6 2: Read1item >k=0 >a=c(1,4,9,23) >two_numbers_3(a) [1]&quo

  • Java 容器 接口

    Java中容器框架的内容可以分为三层:接口(模型),模板和具体实现。在开发中使用容器正常的流程是,首先根据需求确定使用何种容器模型,然后选择一个符合性能要求的容器实现类或者自己实现一个容器类。例如://这是我们最经常用的方式了 ListstringList=newArrayList<String>();复制这种方式的好处在于:模型与实现分开可以复用一部分实现类;屏蔽了实现逻辑的细节,可以更专注模型的操作;接口为操作添加了约束,避免误操作。上面所说的模型在容器框架中对应的是接口。在容器框架中根据它的特征可以作如下划分。Collection,Map高度抽象的容器接口。可以作为构造函数的参数,实现一个容器到另一个容器的复制Iterator,ListIterator,Enumeration迭代器接口List,Set,Queue,SortedSet,NavigatorSet,SortedMap,NavigatorMap容器模型Comparator,Comparable比较器接口RandomAccess标记接口,没有操作他们之间的关系如下:Java容器接口类图接口的所有操作都包含在类图

  • 多线程与高并发(四)—— 根据 HotSpot 源码讲透 Java 中断机制

    前言 我们首先介绍中断的三个APPI及其底层代码,在对方法的实现有了清晰的认知后,再结合场景谈谈什么是中断,以及中断该如何正确使用? 一、中断方法 1.isInterrupted publicbooleanisInterrupted(){ //调用isInterrupted方法,中断标记设置为true returnisInterrupted(false); } 复制 这个方法很简单,就是返回当前线程的中断标记值,这个方法是由native方法实现。 /** *TestsifsomeThreadhasbeeninterrupted.Theinterruptedstate *isresetornotbasedonthevalueofClearInterruptedthatis *passed. */ privatenativebooleanisInterrupted(booleanClearInterrupted); 复制 根据Thread类找到对应路径下Thread.c,可以看到该方法的底层实现方法JVM_IsInterrupted: 在hotspot源码jvm.c文件中,可以看到JVM

  • 身体检查 生化全套 血常规 微量元素

    身体检查 生化全套血常规 微量元素哪个比较好?? 血常规22.00血脂四项[胆固醇/甘油三酯/高,低密度脂蛋白]41.00肝功十六项109.00 腹部彩超(含报告)159.00 消化系统彩超(肝胆脾胰)105 微量元素[铁/镁/锌/铜]26.00检测微量元素

  • 自己封装的http.client get请求

    由于requests的get请求有各种各样的缺陷,所以我自己用http.client封装了一个client_get支持设置代理、ssl验证、是否重定向 importurllib.parse importhttp.client defclient_get(url,headers=None,proxies=None,verify=True,allow_redirect=True): url=urllib.parse.urlparse(url) hostname=url.hostname port=80 ifproxies!={}orNone: hostname,port=proxies["http"].split(":") conn=http.client.HTTPSConnection(hostname,port) ifverify==False: conn=http.client.HTTPSConnection(hostname,port,context=ssl._create_unverified_context()) ifproxies!={}orNone: conn.set_t

  • BEC和托业的区别 公共英语等级考试

    I.考试简介 考试简介 BEC剑桥商务英语证书考试 TOEIC托业考试 研发机构 剑桥大学外语考试中心ESOL,研发过雅思考试 美国教育考试服务中心ETS,研发过托福考试 进入中国 1993年进入中国 2002年进入中国 享有盛誉 外企通行证 全球最大商务和职业英语考试 •进入沪江BEC分站>>  •进入沪江托业分站>>   •进入BEC中国20周年专题>>  II.考试难度 说明:从本质上来说,BEC和托业考试与四六级、专四专八和托福雅思都不具有比较性。但是为了方便大家衡量自己的水平,选择适合的考试与考试级别,这里还是大致做一个比较。当然每个人对于考试的难易度都有自己的判断,这里仅提供参考标准。 考试难度 BEC剑桥商务英语证书考试 TOEIC托业考试 与四六级比较 BEC中级要求四级高分及以上水平;BEC高级要求六级高分及以上水平 托业750分以上要求四级高分及以上水平;托业850分以

  • 洛谷p1217—回文质数(默默宣传打表法)

    今天做题时碰到了关于素数的相关题目,正在冥思苦想巧妙的方法时,看到了后面大佬的题解,其中的三个字牢牢吸引了我的眼睛——打表法。 打表法就是将题目中需要的答案集合提前算出来,存到代码里,根据题目所需取答案,这种方法通常只需要将程序挂着,在表打完后进行加工,最终取答案程序时间复杂度为O(1),空间复杂度为O(n)(n为答案规模)。——沃兹·基朔德 打表法需要有两个阶段的操作: 一、利用机器暴力求解问题的所有可能解的集合 二、把它们搞成一个数组,然后根据条件来输出解 这样做的好处是时间复杂度极低,坏处是没有很好的思考问题的正确解法,有点投机的嫌疑。。。。(雾) 话不多说,上代码: /* *题目要求:写一个程序来找出范围a-b的所有回文质数 *方法一:打表,提前计算出所有可能的答案,直接根据题目打表 */ #include<bits/stdc++.h> usingnamespacestd; /*boolisPalindromes(intkey)//判断回文数 { intnum=0; inttmp=key; while(tmp!=0) { num=num*10+tmp%10;

  • Jquery获取当前时间

    $(function(){ varmyDate=newDate; varyear=myDate.getFullYear();//获取当前年 varmon=myDate.getMonth()+1;//获取当前月 vardate=myDate.getDate();//获取当前日 //varh=myDate.getHours();//获取当前小时数(0-23) //varm=myDate.getMinutes();//获取当前分钟数(0-59) //vars=myDate.getSeconds();//获取当前秒 varweek=myDate.getDay(); varweeks=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]; console.log(year,mon,date,weeks[week]) $("#time").html(year+"年"+mon+"月"+date+"日"+weeks[week]); })输出结果:2019年12月16日星期一复制

  • codeforces 3D Least Cost Bracket Sequence

    贪心,从左到右扫描,每个问号默认都变成右括号,如果左括号不够,那么就用前面的右括号去换左括号代价是-b+a,找代价最小的(set或者堆维护)。 #include<bits/stdc++.h> usingnamespacestd; intconstN=50000+10; chars[N]; structnode{ intp,v; booloperator<(constnode&rhs)const{ if(v!=rhs.v)returnv<rhs.v; elsereturnp<rhs.p; } }; set<node>se; intvis[N],a[N],b[N]; intmain(){ scanf("%s",s); intn=strlen(s); intm=0,num=0; longlongans=0; for(inti=0;i<n;i++){ if(s[i]=='(')num++; elseif(s[i]==')'){ if(num==0){ if(se.size()==0){

  • [Spring MVC] - view的redirect和forward

    可以通过redirect/forward:url方式转到另一个Action进行连续的处理。可以通过redirect:url防止表单重复提交。写法如下:return"forward:/order/add";return"redirect:/index.jsp";   带参数重定向--RedirectAttributes用户保存或修改后,为了防止用户刷新浏览器(F5)导致表单重复提交,一般在保存或修改操作之后会redirect到一个结果页面(不是forward),同时携带参数,如操作成功的提示信息。因为是Redirect,Request里的attribute不会传递过去。Spring在3.1才提供了这个能力--RedirectAttributes。反复按F5,操作成功的提示信息也不会再次出来(总共只出现一次),效果很理想。   Java代码 publicStringsave(@ModelAttribute("group")Groupgroup,RedirectAttributesredirectAttributes){ accountManager.saveGroup

  • 关于DexOpt: not all deps represented

    最近在做androidBSP4.2的时候遇到一个BUG,编译user版本的时候,系统刷进手机里面去,无限循环在开机动画,编译userdebug刷机进去的时候发现正常,于是我先回滚到正常的版本,进系统打开adb调试,然后刷异常的版本,发现无限循环的log如下 I/dalvikvm( 823):DexOpt:notalldepsrepresented   E/dalvikvm( 823):/system/framework/android.test.runner.jarodexhasstale  dependencies  为啥会出现这个BUG呢,看了一下git,发现我新增加的FM收音机里面有一个qcom.fmradio.jar这个并且做了如下处理 exportBOOTCLASSPATH${BOOTCLASSPATH}:/system/framework/changhong.jar 于是我google了一下错误信息,找到了一个相关帖子 https://groups.google.com/forum/#!topic/android-

  • TransE的程序实现——学习,查阅,注释

    代码来源:https://github.com/thunlp/KB2E/blob/master/TransE/ 很久没碰C++了,为了实验成功,还是要仔仔细细抠一抠代码才行。没有对原代码进行改动,基于个人的理解,在划分代码段落的基础之上进行较为详尽的注释。 第一部分:头文件的引入以及常量定义 1#include<iostream>/*输入输出流*/ 2#include<cstring>/*C字符串操作函数*/ 3#include<cstdio>/*标准输入输出的C++形式*/ 4#include<map>/*定义了一种关联容器,数据结构*/ 5#include<vector>/*顺序容器,常用于表示向量*/ 6#include<string>/*字符串操作函数*/ 7#include<ctime>/*日期时间结构体*/ 8#include<cmath>/*数学操作*/ 9#include<cstdlib>/*提供一些函数和符号常量,如第二部分出现的RAND_MAX*/ 10us

  • ORACLE查询使用ORDER BY变慢的问题

     https://www.cnblogs.com/yinliang/p/13577564.html https://blog.csdn.net/weixin_36034883/article/details/116481130   1、以dba方式登陆数据库,由于我创建了多个数据库,登陆时需要指定具体数据库 sqlplus账号/密码@localhost:1521/数据库名复制 2、查看sort_area_size showparametersort_area_size;复制 sort_area_size默认为65536;复制 3、查看workarea_size_policy showparameterworkarea_size_policy;复制 workarea_size_policy默认为auto,即自动分配。如需修改sort_area_size,需要同时将workarea_size_policy设置为MANUAL,否则sort_area_size不起作用。复制 4、修改sort_area_size altersystemsetsort_ar

  • mongodb-4.4.10版本数据导入、导出、备份、恢复

    数据备份 mongodump    ./mongodump-hlocalhost:27022-dlison-o/usr/local/mongodb/mongodb-linux-x86_64-3.4.18/backup      -h:指定ip和端口;-d:备份的数据库名称;-o:指定备份的路径       其本质为:执行查询,然后写入文件; 数据恢复 mongorestore ./mongorestore-hlocalhost:27022 -dlison/usr/local/mongodb/mongodb-linux-x86_64-3.4.18/backup/lison--drop     --drop已存在lison库则删除原数据库,去掉--drop则是合并 数据导出 mongoexport(针对集合) ./mongoexport-hlocalhost:27022-d

  • 算法小题

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 classSolution{ public: boolFind(inttarget,vector<vector<int>>array){ intm=array.size();//行数 intn=array[0].size();//列数 intx=m-1,y=0; while(x>=0&&y<n){ if(array[x][y]==target){ returntrue; } elseif(array[x][y]>target) { x--; continue; } elseif(array[x][y]<target) { y++; continue; } } returnfalse; } };复制 Find 输入一个链表,从尾到头打印链表每个节点的值 /** *structListNode{ *intval; *structListNode*n

相关推荐

推荐阅读