【发布时间】:2017-08-25 08:43:28
【问题描述】:
我有一个小的 python 脚本,它使用argparse 让用户定义选项。它使用两个用于不同模式的标志和一个参数来让用户定义文件。请参阅下面的简化示例:
#!/usr/bin/python3
import argparse
from shutil import copyfile
def check_file(f):
# Mock function: checks if file exists, else "argparse.ArgumentTypeError("file not found")"
return f
def main():
aFile = "/tmp/afile.txt"
parser = argparse.ArgumentParser(description="An example",formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-f", "--file", help="A file, used with method A.", default=aFile, type=check_file)
parser.add_argument("-a", "--ay", help="Method A, requires file.", action='store_true')
parser.add_argument("-b", "--be", help="Method B, no file required.", action='store_true')
args = parser.parse_args()
f = args.file
a = args.ay
b = args.be
if a:
copyfile(f, f+".a")
elif b:
print("Method B")
if __name__ == "__main__":
main()
方法 A 需要该文件。
方法 B 没有。
如果我使用方法 A 运行脚本,我将使用默认文件或使用-f/--file 定义的文件。该脚本检查文件是否存在并且一切正常。
现在,如果我使用方法 B 运行脚本,它不应该需要该文件,但会检查默认选项,如果它不存在,则 argparse 函数会引发异常并退出脚本。
如果定义了-b 并要求它,如果定义了-a,我如何配置argparse 以使-f 可选?
编辑: 我刚刚意识到让-f 和-b 互斥就足够了。但是,如果我只运行-b,则无论如何都会执行check_file。有没有办法防止这种情况发生?
#!/usr/bin/python3
import argparse
from shutil import copyfile
def check_file(f):
# Mock function: checks if file exists, else "argparse.ArgumentTypeError("file not found")"
print("chk file")
return f
def main():
aFile = "/tmp/afile.txt"
parser = argparse.ArgumentParser(description="An example",formatter_class=argparse.RawTextHelpFormatter)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("-f", "--file", help="A file, used with method A.", default=aFile, type=check_file)
parser.add_argument("-a", "--ay", help="Method A, requires file.", action='store_true')
group.add_argument("-b", "--be", help="Method B, no file required.", action='store_true')
args = parser.parse_args()
f = args.file
a = args.ay
b = args.be
if a:
print("File: "+str(f))
elif b:
print("Method B")
print("file: "+str(f))
if __name__ == "__main__":
main()
输出:
chk file
Method B
file: /tmp/afile.txt
【问题讨论】:
-
你可能想看看 [stackoverflow.com/questions/4466197/… 问题。
-
4466197对于这种情况来说是一个糟糕的答案。 “组”不是为嵌套而设计的,它们也不能解决这里的“默认”评估问题。
标签: python arguments parameter-passing argparse optional-parameters