在Python的argparse模块中未指定时使用另一个变量

时间:2013-08-16 22:30:17

标签: python argparse

当在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参数可以设置默认值,但设置从另一个参数派生的默认值是否可行?

感谢。

3 个答案:

答案 0 :(得分:0)

执行此操作的传统方式(人们在C中返回旧的Unix getopt的方式)是给outputDB一个无用的“哨兵”默认值。然后,在您进行解析后,如果outputDB与哨兵匹配,请使用outputfile的值。


有关所有可用选项的完整详细信息,请参阅文档中的default。但最简单的 - 只要它不会破坏你的任何其他障碍 - 似乎是将它关闭,并通过argument_default=SUPPRESS。如果您这样做,args.outputDB如果没有通过任何内容就不会存在,因此您只需使用hasattrintry检查即可。


或者,你可以传递一个空字符串作为默认字符串,但当然用户总是可以用--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'。