当在argparse中没有指定第一个参数时,使用一个也是另一个参数变量的变量是否可行?
所以在下面的代码中:
import argparse
parser = argparse.ArgumentParser()
parser.add_option('-f', '--file', dest='outputfile')
parser.add_option('-d', '--db', dest='outpufDB')
当我通过script.py -f file_name
运行上述脚本,并且未在outputDB
上指定参数时,我想在outputDB
上设置与{{1}相同的值}}。我知道使用outputfile
参数可以设置默认值,但设置从另一个参数派生的默认值是否可行?
感谢。
答案 0 :(得分:0)
执行此操作的传统方式(人们在C中返回旧的Unix getopt的方式)是给outputDB
一个无用的“哨兵”默认值。然后,在您进行解析后,如果outputDB
与哨兵匹配,请使用outputfile
的值。
有关所有可用选项的完整详细信息,请参阅文档中的default
。但最简单的 - 只要它不会破坏你的任何其他障碍 - 似乎是将它关闭,并通过argument_default=SUPPRESS
。如果您这样做,args.outputDB
如果没有通过任何内容就不会存在,因此您只需使用hasattr
或in
或try
检查即可。
或者,你可以传递一个空字符串作为默认字符串,但当然用户总是可以用--outputDB=''
触发相同的东西,你可能不想允许它。
要解决这个问题,你不能给它一个type
,这意味着你可以给出任何不是字符串的默认值,并且用户无法向你传递同样的东西。当None
或相应类型的假值不可用时获取标记的pythonic方法是:
sentinel = object()
x = do_stuff(default_value=sentinel)
# ...
if x is sentinel:
# x got the default value
但在这里,我不认为这是必要的。默认的None
应该非常好(用户无法指定它,因为它们只能指定字符串)。
(很有可能argparse
有一种更酷的方式可以做到这一点我还没有发现,所以你可能想等一会儿等待其他答案。)
答案 1 :(得分:0)
简单的方法 - 在parse_args之后自己检查。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', dest='outputfile')
parser.add_argument('-d', '--db', dest='outpufDB')
args = parser.parse_args()
if args.outpufDB is None:
args.outpufDB = args.outputfile
默认默认值为None
,可以轻松测试。
如果argparse
中反映了help
或您想要标准化错误消息,则完全在{{1}}内执行某些操作非常有用。但是你只是在解析后填写默认值。
我可以想象使用自定义'-f'动作做同样的事情,但逻辑会更复杂。
答案 2 :(得分:0)
我不确定这是不是一个好习惯,但我尝试了类似的问题。我为您的代码修改了以下代码段,希望它有所帮助。
import argparse
parser = argparse.ArgumentParser()
parser.add_option('-f', '--file', dest='outputfile', default='dummy_file')
parser.add_option('-d', '--db', dest='outputDB', default=parser.parse_args().outputfile)
如果你没有传递任何参数的名字,那么'输出文件'和' outputDB'将是' dummy_file'。