Argparse для обозначения периода времени в часах или днях - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь написать аргумент (для 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 единственный путь?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Функция, подобная этой, может использоваться как type в 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'
0 голосов
/ 28 июня 2018

Майя может работать для вас:

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

P.S. Maya работает на dateparser . Хотя вы можете использовать dateparser прямо из биты, чтобы справиться со всем, я думаю, что Maya окажется более полезным.

...