Skip to content

Latest commit

 

History

History
312 lines (234 loc) · 7.54 KB

220-542984-终端命令行实参解析_argparse.sy.md

File metadata and controls

312 lines (234 loc) · 7.54 KB
show version enable_checker
step
1.0
true

嵌套调用

回忆

  • 上次完成了彩色松树的显示
  • 使用表驱动设置颜色与色彩代码的字典
  • 使用默认参数确保原来只有一个参数的调用仍然好使
  • 但是始终要修改源代码才能打印出松树
  • 可以利用命令行的参数(arguement)么?

图片描述

上次代码

def draw_pine(n=5,color="white"):
    draw_pine_head(n,color)
    draw_pine_body()

def draw_pine_head(n,color="white"):
    print(color)
    print("\33["+d_colors[color]+"m",end="")
    draw_pine_triangle()
    draw_pine_triangle()

def draw_pine_triangle():
    for i in range(6):
        for j in range(6-i):
            print(" ",end="",sep="")
        for k in range(2*i+1):
            print("*",end="",sep="")
        print()


def draw_pine_body():
    for i in range(5):
        for j in range(5):
            print(" ",end="",sep="")
        for k in range(3):
            print("*",end="",sep="")
        print()
    for i in range(6):
        for j in range(6-i):
            print(" ",end="",sep=",")
    print("\33[0m",end="")

if __name__ == '__main__':
    d_colors = {"green":"32","yellow":"33","white":"0"}
    draw_pine()
  • 我想从命令行中接受参数
    • 设置 颜色 和 大小

命令行参数

  • 查找帮助
  • 导入sys模块
    • 可以得到 命令行中的参数

图片描述

  • 导入 argparse 模块
    • 可以 更加体系化地 使用 命令行参数
import argparse
import sys
  • 准备 对于主程序
    • 进行修改

主程序

图片描述

  • 确实可以运行处很好的效果
  • 不过我想让参数含义更明确一点

argparse

  • argparse分成两块
    • arguement shell给的实参
    • parse 语法分析

图片描述

修改代码

if __name__ == '__main__' :
	parser = argparse.ArgumentParser ( 
		prog='pine',
		description='Show pine on screen') 
	parser.add_argument('-n', '-num', type=int, default=5) 
	parser.add_argument('-c', '-color', type=str, default="white") 	
	args = parser.parse_args() 
	print(type(args),args) 
	d_colors = {"green": "32", "yellow": "33", "white": "0"}
	#draw_pine(num,color)
  • 修改 主函数 执行部分

图片描述

  • 我们去命令行试试

命令行

  • 使用了 此命令后
    • 命令行 添加了 帮助
    • 参数名 必须明确
    • 参数类型 也必须符合要求

图片描述

  • 尝试和我们的画松树对接

查看帮助

图片描述

if __name__ =='__main__':
	parser = argparse.ArgumentParser ( 
		prog='pine',
		description='Show pine on screen') 
	parser.add_argument('-n', '-num', type=int, default=5) 
	parser.add_argument('-c', '-color', type=str, default="white") 	
	args = parser.parse_args() 
	print(type(args),args) 
	print(type(vars(args)),vars(args)) 
	d_colors = {"green": "32", "yellow": "33", "white": "0"}
	#draw_pine(num,color)
  • 找到对接方式
    • 字典

图片描述

尝试对接

if __name__ =='__main__':
	parser = argparse.ArgumentParser 
		prog='pine',
		description='Show pine on screen') 
	parser.add_argument('-n', '-num', type=int, default=5) 
	parser.add_argument('-c', '-color', type=str, default="white") 	
	args = parser.parse_args() 
	print(type(args),args) 
	print(type(vars(args)),vars(args))
	color = vars(args)["c"]
	num = vars(args)["n"]
	d_colors = {"green": "32", "yellow": "33", "white": "0"}
	draw_pine(num,color)
  • 这样可以提高程序的可读性
    • Readablity Counts
:w|!python3 % -n 3 -c yellow
  • 效果

图片描述

  • 直接无命令行参数调用可以么?

直接调用

图片描述

  • 直接调用是可以的
  • 因为有默认参数

图片描述

  • 遇到了字典里没有的颜色
  • 怎么办?

问题

图片描述

  • 这个"blue"字典里面没有

查询文档

  • 可以限制命令行参数的选项(choices)

图片描述

  • choices
    • 可以是列表
    • 也可以是集合
    • 或者其他容器类型

动手

图片描述

  • 确实可以限定
    • 参数必须为字典的key

图片描述

  • 整数num可以限制输入范围么?

int型参数的choices

图片描述

修改代码

图片描述

  • 成功约束范围
import argparse

def draw_pine(n=5,color="white"):
    draw_pine_head(n,color)
    draw_pine_body(n)

def draw_pine_head(n,color="white"):
    print(color)
    print("\33["+d_colors[color]+"m",end="")
    draw_pine_triangle(n)
    draw_pine_triangle(n)

def draw_pine_triangle(n,color="white"):
    for i in range(n):
        for j in range(n-i):
            print(" ",end="",sep="")
        for k in range(2*i+1):
            print("*",end="",sep="")
        print()

def draw_pine_body(n):
    for i in range(5):
        for j in range(5):
            print(" ",end="",sep="")
        for k in range(3):
            print("*",end="",sep="")
        print()
    for i in range(6):
        for j in range(6-i):
            print(" ",end="",sep=",")
    print("\33[0m",end="")

if __name__ == '__main__':
    d_colors = {"green":"32","yellow":"33","white":"0"}
    parser = argparse.ArgumentParser(
        prog='pine',
        description='Show pine on screen')
    parser.add_argument("-num", "-n", type=int, default=5, choices=range(2,10))
    parser.add_argument("-color","-c", type=str, default="white", choices=d_colors.keys())
    args = parser.parse_args()
    print(type(args),args)
    print(type(vars(args)),vars(args))
    color = vars(args)["color"]
    num = vars(args)["num"]
    draw_pine(num,color)

封装成函数

  • 把取得命令行参数的过程封装成为一个函数
  • 我们可以看到函数的返回值是一个元组类型
    • 经过解包(unpacking)的过程
    • 赋给两个变量

图片描述

  • 这样我们主函数里面就只有3句话了
    • 定义颜色字典
    • 从命令行得到相关参数
    • 进行屏幕输出

总结

  • 我们这次学习了argparse这个包(module)
    • 这个包可以接受一些命令行传过来的参数
    • 可以编写命令帮助
    • 可以定制参数名称和缩写
    • 还可以对于参数设置
      • 类型
      • 默认值
      • 可选项
  • 我们最终把参数输入封装成了一个函数
    • 这样主函数看起来就清爽多了
      • 总共就3行
      • 每行干什么很清晰
  • get_argument函数中
    • 对于参数有明确要求
      • 类型
      • 默认值
      • 选项
  • 为什么要这么较真严格呢?🤔
  • 我们下次再说👋