• Python Fire:更加灵活的命令行参数


    之前介绍过PythonFire库,一个用来生成命令行工具的的库。
    请参考:Python Fire:自动生成命令行接口

    今天,针对命令行参数,补充两种更加灵活的设置方式。

    1. *args 型参数

    *args型的参数可以接受任意长度的参数。
    比如,模拟一个学校发送通知的功能:

    import fire
    
    def notions(school, *names):
        for name in names:
            print(f"[{school} 通知] hello {name}")
    
    
    if __name__ == "__main__":
        fire.Fire(notions)
    

    使用起来很灵活,

    $  python.exe .\fire-sample.py NJ大学 小红 小李 小张 小华
    [NJ大学 通知] hello 小红
    [NJ大学 通知] hello 小李
    [NJ大学 通知] hello 小张
    [NJ大学 通知] hello 小华
    
    $  python.exe .\fire-sample.py --school NJ大学 小红 小李 小张
    [NJ大学 通知] hello 小红
    [NJ大学 通知] hello 小李
    [NJ大学 通知] hello 小张
    
    $  python.exe .\fire-sample.py --school NJ大学 小红 小李 小张 小华
    [NJ大学 通知] hello 小红
    [NJ大学 通知] hello 小李
    [NJ大学 通知] hello 小张
    [NJ大学 通知] hello 小华
    
    $  python.exe .\fire-sample.py 小红 小李 --school NJ大学 小张 小华
    [NJ大学 通知] hello 小红
    [NJ大学 通知] hello 小李
    [NJ大学 通知] hello 小张
    [NJ大学 通知] hello 小华
    

    从上面使用的示例可看出,

    1. 可以不输入参数名称(比如第一个例子),按照顺序第一参数赋值给school,其余的赋值给*names
    2. *names参数支持不定长度的值
    3. school参数指定参数名的话,可以放在任意的位置(比如上面第四个例子)。

    2. **kwargs 型参数

    **kwargs 型参数也是不定长度的,和*args型参数不同的地方在于,
    使用**kwargs型参数时,需要指定参数名称

    比如,模拟一个显示学生成绩的功能:

    import fire
    
    def scores(cls, **students):
        for k, v in students.items():
            print(f"[{cls} 成绩] {k}: {v}")
    
    
    if __name__ == "__main__":
        fire.Fire(scores)
    

    使用示例如下:

    $  python .\fire-sample.py 初三1--小红 98 --小李 89 --小王 100
    [初三1班 成绩] 小红: 98
    [初三1班 成绩] 小李: 89
    [初三1班 成绩] 小王: 100
    
    $  python .\fire-sample.py --小红 98 --小李 89 --小王 100  初三1班
    [初三1班 成绩] 小红: 98
    [初三1班 成绩] 小李: 89
    [初三1班 成绩] 小王: 100
    
    $  python .\fire-sample.py --小红 98 --小李 89 --小王 100 --cls 初三1班
    [初三1班 成绩] 小红: 98
    [初三1班 成绩] 小李: 89
    [初三1班 成绩] 小王: 100
    

    cls参数可以不指定名称,也可以放在任意位置上。
    **students参数则必须指定参数名称,但参数名称不固定,参数的个数也不固定。

    3. 总结

    *args型和**kwargs型参数可以有效的缓解命令行工具灵活性不足的问题。
    开发命令行工具时,根据自己的场景,使用这两种类型的参数可让命令行工具的接口更加简洁灵活。

  • 相关阅读:
    Java SPI(Service Provider Interface)
    Spring Boot 最佳实践
    揭秘newSingleThreadExecutor:深度解析与源码探秘
    【Linux线程】一、什么是线程
    华为机试 - 判断一组不等式是否满足约束并输出最大差
    素问·八正神明论原文
    <5>【深度学习 × PyTorch】“自动微分”机制 | 通俗理解 pytorch中的autograd、backward | 实例详解tensors、grad_tensors
    运行vite项目报错:await import(‘source-map-support‘).then((r) => r.default.install())
    18.3 NPCAP 构建中间人攻击
    SpringMVC之自定义注解
  • 原文地址:https://www.cnblogs.com/wang_yb/p/18007891