Python Argparse表示时间段,以小时或天为单位

Python Argparse表示时间段,以小时或天为单位,python,argparse,Python,Argparse,我试图编写一个参数(用于argparse),其中,我试图以小时或天为单位定义输入 例如: def setup_args(): .... parser.add_argument( "--time", type=str, help="Define the time period (only hours or days). Eg. 3h or 3d" ) def time_input(user_input): if u

我试图编写一个参数(用于argparse),其中,我试图以小时或天为单位定义输入

例如:

def setup_args():
    ....
    parser.add_argument(
        "--time",
        type=str,
        help="Define the time period (only hours or days). Eg. 3h or 3d"
    ) 

def time_input(user_input):
    if user_input.endswith('h'):
        ...
        # using datetime module to forward current time X hours later
    elif user_input.endswith('d'):
        ...
        # I may specify it to a max 2 days.
        # using datetime module to forward current time X days later
虽然我编写的函数可以工作,但我想知道是否有更好的方法来实现这一点,或者使用
endswith
是唯一的方法?

可能适合您:

>>> maya.when("in 1H").datetime()
datetime.datetime(2018, 6, 27, 22, 16, 42, 371621, tzinfo=<UTC>)
>>> maya.when("in 1 day").datetime()
datetime.datetime(2018, 6, 28, 21, 16, 42, 371621, tzinfo=<UTC>)
>>maya.when(“1H”).datetime()
datetime.datetime(2018,6,27,22,16,42,371621,tzinfo=)
>>>maya.when(“在1天内”).datetime()
datetime.datetime(2018,6,28,21,16,42,371621,tzinfo=)
您甚至可以指定任意的时间值,而不限于小时或天,这使得您的应用程序更加灵活:

>>> maya.when("now").datetime()
datetime.datetime(2018, 6, 27, 21, 20, 7, 409348, tzinfo=<UTC>)
>>> maya.when("in 1 hour 2 minutes").datetime()
datetime.datetime(2018, 6, 27, 22, 22, 7, 825372, tzinfo=<UTC>)
>>maya.when(“now”).datetime()
datetime.datetime(2018,6,27,21,20,7,409348,tzinfo=)
>>>maya.when(“1小时2分钟内”).datetime()
datetime.datetime(2018,6,27,22,22,7,825372,tzinfo=)

另请注意,Maya的电源为。尽管您可以直接使用dateparser来处理所有事情,但我认为Maya将证明更有用。

这样的函数可以用作
argparse
中的
类型。也可以在解析后使用:

def period(astr):
    if astr.lower().endswith('h'):
        units = 'timedelta64[h]'
    elif astr.lower().endswith('d'):
        units = 'timedelta64[D]'
    else:
        raise argparse.ArgumentTypeError('wrong time units')
    return np.array(astr[:-1], dtype=units)
我将它定义为返回一个
numpy
timedelta64
数组,部分原因是我对它比Python
timedelta
更熟悉,而且很容易指定时间单位:

In [249]: period('4h')
Out[249]: array(4, dtype='timedelta64[h]')
In [250]: period('3d')
Out[250]: array(3, dtype='timedelta64[D]')
tolist
将从数组中提取它并返回
timedelta
对象

In [251]: period('3d').tolist()
Out[251]: datetime.timedelta(3)
In [253]: period('3h').item()
Out[253]: datetime.timedelta(0, 10800)
该功能可以更改为直接与
timedelta
一起使用

解析器可以是:

In [239]: parser = argparse.ArgumentParser()
In [240]: parser.add_argument('--time', type=period, help='time delta');
测试:

In [241]: parser.parse_args('--time 3d'.split())
Out[241]: Namespace(time=array(3, dtype='timedelta64[D]'))
In [255]: parser.parse_args('--time 4h'.split())
Out[255]: Namespace(time=array(4, dtype='timedelta64[h]'))
错误:

In [256]: parser.parse_args('--time 4m'.split())
usage: ipython3 [-h] [--time TIME]
ipython3: error: argument --time: wrong time units
In [257]: parser.parse_args('--time 4.34d'.split())
usage: ipython3 [-h] [--time TIME]
ipython3: error: argument --time: invalid period value: '4.34d'

我可能会定义两个argparse参数,
--hours
--days
。您可以使用user_input.lower().endswith('h')允许用户输入大写或小写字符。@OregonJim他们正试图通过命令行上的参数来实现这一点。通过控制台进行用户输入似乎不是一个好办法。@AdamSmith这听起来也是个好主意!我抛出我的问题,看看是否有可能将这两个参数组合成1…@AdamSmith,我知道。这两种情况都适用。我不确定添加一个新的依赖项是否是处理这种情况的最佳方法,但它确实是一个解决方案,直到您的回答,我才知道Maya。看起来很酷@谢谢你!虽然它可能不是最好的,但我相信它使它更干净、更灵活。这正是依赖项的用途:-)谢谢,但是正如@AdamSmith所提到的,有没有其他方法(pythonicforms)来代替安装一些新的东西以使事情顺利进行?