[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()
我想知道是否可以根据是否给定值来更改参数的行为。
通常,我想提供一种交互式方式来输入密码。
用法示例:
$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()