如何将Argparse参数的默认值设置为位置参数的值?

dea*_*eau 5 python argparse

我有一个发送GET请求的python脚本.它使用Argparse来获取三个参数:

  1. 地址:发送GET请求的位置
  2. 主机:在GET请求中声明的主机
  3. 资源:正在请求哪个资源

示例用法可能是:

$ python get.py 198.252.206.16 stackoverflow.com /questions/ask

但是,在大多数情况下,只需要提供主机和资源,因为主机将解析为该地址:

 $ host -t a stackoverflow.com
 stackoverflow.com has address 198.252.206.16
Run Code Online (Sandbox Code Playgroud)

所以期望的用法可能是:

$ python get.py stackoverflow.com /questions/ask
Run Code Online (Sandbox Code Playgroud)

如何设置Argparse以使Address参数的默认值为Host参数的值?


我被要求显示当前解析参数的代码.这里是:

import argparse

parser = argparse.ArgumentParser(description=
         'Send a GET request and obtain the HTTP response header and/or body.')

parser.add_argument("-v", "--verbose",
                    help="Turn on verbose mode.",
                    action="store_true")
parser.add_argument("-p", "--port",
                    type=int,
                    default=80,
                    help="Which port to use when sending the GET request."
parser.add_argument("address",
                    help="Where to send the GET request to.")
parser.add_argument("host",
                    help="Which Host to declare in the GET request.")   
parser.add_argument("resource",
                    help="Which resource to request.")

parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 9

nargs='?'很好地处理这种情况.如果只有2个字符串,则将它们分配给hostresource,并address获取其默认值(None).如果3个字符串,它们会分配给所有3.如果有帮助,认为行为?re模式.

解析器完成后很容易将host值赋值给address.尝试在内部进行该任务没有意义parse_args(因为主机值尚不知道).

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("address", nargs='?')
parser.add_argument("host")
parser.add_argument("resource")
args = parser.parse_args()

if args.address is None:
    args.address = args.host
print(args)
Run Code Online (Sandbox Code Playgroud)

用法是:

usage: get.py [-h] [address] host resource
Run Code Online (Sandbox Code Playgroud)

[]整齐的标记可选的位置参数.