[Python argparse]如果没有给定值,则将参数的行为设置为交互

[Python argparse]set the behaviour of an argument to be interactive if no value is given

我想知道是否可以根据是否给定值来更改参数的行为。

通常,我想提供一种交互式方式来输入密码。

用法示例:

$script.py => use the default argument value for argument 'p'

$script.py -p mypass => use 'mypass' as value for 'p'

$script.py -p => get password interactively

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-p", nargs='?', const="mypass", default="default")

args = parser.parse_args()

if args.p:
    print args.p

然后您可以检查 p 的值并以交互方式获取密码

一个简单的class:

class AskUser:
    def __init__(self, type, func, *args, **kwargs):
        self.type = type
        self.func = func
        self.args = args
        self.kwargs = kwargs
    def __call__(self, value):
        if value == '':
            value = self.func(*self.args, **self.kwargs)
        return self.type(value)

你可以直接插入 argparse:

parser = argparse.ArgumentParser()
parser.add_argument('user', nargs='?', type=AskUser(str, input, 'Enter user name: '), default='')
parser.add_argument('file', nargs='?', type=AskUser(Path, filedialog.asksaveasfilename,
    title='Select a file', filetypes=(('CSV files', '*.csv'),), defaultextension='.csv'), default='')
args = parser.parse_args()