1

当 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并且不指定参数 on 时outputDB,我想设置与 on 相同的outputDBoutputfile。我知道使用default参数可以设置默认值,但是设置从另一个参数派生的默认值是否也可行?

谢谢。

4

3 回答 3

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或您想要标准化错误消息中,则完全在内部做某事是有用的。但是您只是在解析后填写默认值。

我可以想象用自定义的“-f”动作做同样的事情,但逻辑会更复杂。

于 2013-08-16T23:49:29.387 回答
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)

如果你不传递任何参数,那么'outputfile'和'outputDB'将是'dummy_file'。

于 2015-04-29T22:01:08.403 回答
0

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


有关所有可用选项的完整详细信息,请参阅default文档。但最简单的——只要它不破坏你的任何其他参数——似乎是把它关掉,然后通过argument_default=SUPPRESS. 如果你这样做,args.outputDB如果什么都没通过,就不会存在,所以你可以用hasattrorin或来检查try


或者,您可以传递一个空字符串作为默认值,但当然用户总是可以使用 触发相同的事情--outputDB='',您可能不想允许这样做。

为了解决这个问题,您不能给它 a type,这意味着您可以提供任何不是字符串的默认值,并且用户无法将相同的东西传递给您。None当相应类型的错误值或错误值不可用时,获取哨兵的 Pythonic 方法是:

sentinel = object()
x = do_stuff(default_value=sentinel)
# ... 
if x is sentinel:
    # x got the default value

但在这里我认为没有必要。默认值None应该很好(用户无法指定,因为他们只能指定字符串)。


(很可能argparse有一种我还没有发现的更酷的方法来做到这一点,所以你可能要等一会儿才能得到其他答案。)

于 2013-08-16T22:58:46.997 回答