The Road to Python 3 Arguments and Argparse

Everything about args you should know

Posted by Huajian on August 23, 2022
Viewed times

Reference - Liaoxuefeng: Arguments

Reference - args & kwargs

Reference - Argparse official tutorial

Reference - Argparse official tutorial - CN

序言

这篇文章将更新一些关于 args(Argument) 的基础知识

Positional Arguments 位置参数

  • 位置参数即最基本的参数,如下的x就是位置参数

      def func(x):
          return x + x
    

Default Arguments 默认参数

  • 调用以下函数

      def func(x, y=2):
          return x + y
    
      >>> func(5)
      7
      >>> func(5,3)
      8
    
  • 如果不给定参数值,默认参数就会用默认值填补
  • 位置参数在前,默认参数在后
  • 默认参数需要用不变的对象来定义

*args and **kwargs 可变参数和关键字参数

当我们不知道传入arguments的长度时,我们使用 *args  和  **kwargs

  • 当传入的参数是 listtuple 时,使用 *args

      def adder(*number):
          sum = 0
            
          for n in number:
              sum = sum + n
    
          print("Sum:",sum)
    
      adder(3,5)
      adder(4,5,6,7)
      adder(1,2,3,5,6)
    
      # direct transfer list or tuple
    
      nums = [1, 2, 3]
      adder(*nums) # 类似于传数组的指针
    

    在调用时,使用*args可以直接指定数据结构中的所有元素

  • 当传入的参数是 dict 时,使用 **kwargs (**kwargs用于可选参数)

      def person(name, age, **kwargs):
          print('name:', name, 'age:', age, 'other:', kwargs)
    
      # other is optional
    
      >>> person('Michael', 30)
      name: Michael age: 30 other: {}
    
      >>> person('Bob', 35, city='Beijing')
      name: Bob age: 35 other: {'city': 'Beijing'}
    
      # direct transfer
    
      extra = {'city': 'Beijing', 'job': 'Engineer'}
      person('Jack', 24, **extra) # 类似于传数组的指针
    

keyword-only 命名关键字参数

  • 在参数中只有一个 *,之后的参数都被认为是keyword-only

      def person(name, age, *, city, job):
          print(name, age, city, job)
    
      >>> person('Jack', 24, city='Beijing', job='Engineer') # 输入时,city 和 job 必须显示表达
      Jack 24 Beijing Engineer
    

参数顺序

Positional -> Default -> *args -> keyword-only -> **kwargs

函数的任意表达

任何函数都可以写为 func(*args, **kwargs)

Argparse 命令行接口编写

  • 创建步骤
    • 创建ArgumentParser() 对象
      • description= 用于说明功能
    • 添加参数 add_argument()
    • 解析参数 parse_args()
      import argparse
    
      parser = argparse.ArgumentParser(decription='usage')
    
      parser.add_argument("echo")
    
      args = parser.parse_args()
    
  • ArgumentParser的关键字
    ArgumentParser.add_argument(
    name or flags...
    [, action]
    [, nargs]
    [, const]
    [, default]
    [, type]
    [, choices]
    [, required]
    [, help]
    [, metavar]
    [, dest])
    

    name or flags - 选项字符串的名字或者列表,例如 foo (位置参数)或者 -f, –foo (可选参数)。
    action - 命令行遇到参数时的动作,默认值是 store_true。 其他选项见 Reference - Argparse official tutorial - CN
    nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数. const - action 和 nargs 所需要的常量值。
    default - 不指定参数时的默认值。
    type - 命令行参数应该被转换成的类型。
    choices - 参数可允许的值的一个容器。
    required - 可选参数是否可以省略 (仅针对可选参数)。
    help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
    metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
    dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

  • 常见写法

      parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
      parser.add_argument('--seed', type=int, default=72, help='Random seed.')
      parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')
    
  • 可以将argparse封装起来使用:

      def parseArgs():
          parser = argparse.ArgumentParser()
          parser.add_argument("echo")
          return parser.parse_args()
    
      ...
    
      args = parseArgs()
    
    

Top
Down