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

[Python argparse]如果没有给出值,则将参数的行为设置为交互式,python,default-value,argparse,interactive,Python,Default Value,Argparse,Interactive,我想知道是否有可能根据是否给定值来改变参数的行为 通常,我希望提供一种交互式方式来输入密码 示例用法: $script.py=>使用参数“p”的默认参数值 $script.py-p mypass=>使用“mypass”作为“p”的值 $script.py-p=>以交互方式获取密码 然后,您可以检查p的值并以交互方式获取密码 然后,您可以检查p的值,并通过一个简单的类以交互方式获取密码: class AskUser: def __init__(self, type, func, *args

我想知道是否有可能根据是否给定值来改变参数的行为

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

示例用法:

$script.py=>使用参数“p”的默认参数值

$script.py-p mypass=>使用“mypass”作为“p”的值

$script.py-p=>以交互方式获取密码

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

然后,您可以检查p的值,并通过一个简单的类以交互方式获取密码:

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()
一个简单的类:

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()

AskUser来自哪里?AskUser来自哪里?