Skip to content

Latest commit

 

History

History
252 lines (183 loc) · 6.25 KB

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

File metadata and controls

252 lines (183 loc) · 6.25 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()
    print("\33[0m",end="")

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=",")

if __name__ == '__main__':
    d_colors = {"green":"32","yellow":"33","white":"0"}
    draw_pine()

命令行参数

图片描述

  • 查找帮助
  • 首先要导入sys模块
  • 然后对于主程序进行修改

主程序

图片描述

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

argparse

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

图片描述

修改代码

图片描述

图片描述

  • 我们去命令行试试

命令行

图片描述

  • 有帮助
  • 参数明确
  • 甚至还有类型检查
  • 尝试和我们的画松树对接

查看帮助

图片描述

图片描述

图片描述

  • 找到对接方式
    • 字典

尝试对接

图片描述

图片描述

  • 调整次序

调整次序

图片描述

  • 这样可以提高程序的可读性
    • Readablity Counts
  • 直接无命令行参数调用可以么?

直接调用

图片描述

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

图片描述

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

问题

图片描述

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

查询文档

图片描述

  • 可以限制命令行参数的选项(choices)
  • choices
    • 可以是列表
    • 也可以是集合
    • 或者其他容器类型

动手

图片描述

图片描述

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

int型参数的choices

图片描述

修改代码

图片描述

  • 成功约束范围
import argparse
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()
    print("\33[0m",end="")

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=",")

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函数中
    • 对于参数有明确要求
      • 类型
      • 默认值
      • 选项
  • 为什么要这么较真严格呢?🤔
  • 我们下次再说👋