如何使用argparse实现条件可选位置参数,免除额外校验if块
实现方案
你可以通过动态设置add_argument的required参数和default参数,完全去掉额外的校验if块,核心逻辑是根据当前stdin是否为终端交互场景,动态决定参数是否为必填:
import sys import argparse parser = argparse.ArgumentParser() parser.add_argument( 'infile', nargs='?', type=argparse.FileType('r'), # 有管道输入时默认读取stdin,无管道输入时default无意义 default=sys.stdin if not sys.stdin.isatty() else None, # 仅当无管道输入(终端交互场景)时要求必须传入文件参数 required=sys.stdin.isatty(), help='输入文件,存在标准输入时可省略' ) args = parser.parse_args() with args.infile as file: print(file.read())
逻辑说明
- 当有管道/重定向输入时(例如
cat test.txt | python script.py、python script.py < test.txt),sys.stdin.isatty()返回False,此时参数为非必填,默认值设为sys.stdin,自动读取标准输入内容 - 当在终端直接运行无输入时,
sys.stdin.isatty()返回True,此时参数设为必填,若用户未传入文件路径,argparse会自动触发参数缺失报错,无需手动判断退出 - 执行
-h/--help查看帮助时,argparse会跳过必填校验直接输出帮助文本,不影响正常使用
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

