• 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型参数可以有效的缓解命令行工具灵活性不足的问题。
    开发命令行工具时,根据自己的场景,使用这两种类型的参数可让命令行工具的接口更加简洁灵活。

  • 相关阅读:
    C语言折半查找算法及代码实现
    国产操作系统之中科方德桌面系统安装
    日增数据超10PB!揭秘沃尔玛Lakehouse架构选型之路
    【网络安全】实操XSS订单系统漏洞(利用盲打)
    第4 章 变更管理
    JAVA毕业设计开放式教学评价管理系统计算机源码+lw文档+系统+调试部署+数据库
    Using Cloud Functions
    【数据结构】堆排序和top-k问题
    俩个不同对象的List获取交集通过属性来判断,JDK8Stream的使用
    基于Java的电影院管理系统设计与实现
  • 原文地址:https://www.cnblogs.com/wang_yb/p/18007891