在argparse中使用默认值而不是用户输入

时间:2018-05-14 19:33:00

标签: python argparse

我在编写以下参数时遇到问题:我正在尝试:

  • 如果用户输入日期(例如20180514),请使用用户输入的日期
  • 如果没有用户定义的日期,请使用参数中所述的默认选项。

这是我的代码部分:

parser.add_argument(
    '--date',
    #type=str,
    action='store_true'
    default=datetime.now()-timedelta(days=5))
)

if args.date:
    # Use the User-inputted date
else:
    # Use the default date as stated

如果我使用action标记,则会收到引用__init__() got an unexpected keyword argument 'type'的错误消息。如果我不使用action并使用我最初使用的type标志,则代码会回到使用默认值而不是用户输入的值。

欣赏任何建议。非常感谢提前!

2 个答案:

答案 0 :(得分:1)

为什么你有action='store_true'

这意味着argparse将忽略--date之后发生的任何内容,而是根据args.date是否TrueFalse设置为--dateif提供与否。

您也不需要parser.add_argument( '--date', default=datetime.now()-timedelta(days=5)) )

args.date

基本上就是你所需要的一切。只是在您需要时忘记将ComboBox转换为日期时间对象。

答案 1 :(得分:1)

有两个问题:

  • store_true 始终为真,因为它是默认值用户输入的值,两者都不是假的 - y(日期时间对象和非空字符串永远不会)。
  • argparse是错误的操作,因为它告诉args.past此切换没有任何价值(当用户将True设置为--date时使用开关,'store'之后的任何内容都不会被视为此参数的一部分)。将其保留为默认str

此外,datetime是默认类型,如果要将用户输入解析为parser.add_argument( '--past', default=datetime.now() - timedelta(days=5)) 实例,则为错误类型。

这有效:

args.past

但现在datetime将是字符串(用户输入)或type=实例(默认值)。您可能希望使用def to_datetime(s): return datetime.strptime(s, '%Y%m%d') parser.add_argument( '--past', type=to_datetime, default=datetime.now() - timedelta(days=5)) 参数将用户输入转换为日期时间对象。如:

>>> from argparse import ArgumentParser
>>> from datetime import datetime, timedelta
>>> def to_datetime(s):
...     return datetime.strptime(s, '%Y%m%d')
...
>>> parser = ArgumentParser(prog='demo')
>>> parser.add_argument(
...     '--past',
...     type=to_datetime,
...     default=datetime.now() - timedelta(days=5))
_StoreAction(option_strings=['--past'], dest='past', nargs=None, const=None, default=datetime.datetime(2018, 5, 9, 20, 42, 34, 806341), type=<function to_datetime at 0x10bf422f0>, choices=None, help=None, metavar=None)
>>> args = parser.parse_args()
>>> args.past
datetime.datetime(2018, 5, 9, 20, 42, 34, 806341)
>>> args = parser.parse_args(['--past', '20180514'])
>>> args.past
datetime.datetime(2018, 5, 14, 0, 0)

接受您订明的YYYYMMDD格式的日期。

演示:

var match = Regex.Match("välue", @"^[a-zA-Z0-9_-]+$", RegexOptions.CultureInvariant);
//match.Success is flase!!!