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