Как разобрать параметры функции времени, чтобы принять определенный формат в Python - PullRequest
0 голосов
/ 25 июня 2019

Я создал функцию, как показано ниже, которая будет рассчитывать время для пользователя в зависимости от того, что предоставил пользователь, т. Е. Если пользователь предоставит (1, 'h', '+'), функция обеспечит добавление часа ктекущее время, если пользователь ничего не предоставляет, параметры по умолчанию гарантируют, что пользователю предоставляется текущее время.Тем не менее, я хотел бы, чтобы функция принимала ('-1h'), чтобы пользователь мог вводить в этом формате вместо того формата, который он принимает сейчас.Ниже приведена функция, которую я хотел бы изменить, так как мы видим, что она принимает текущий формат, но я хочу изменить формат.

import datetime
import time

def time_offset(time=None, value='h', ch='-'):
    now = datetime.datetime.now()
    if   time is None:
         raw_time = now
         result = raw_time.strftime("%Y-%m-%d %H:%M:%S")
    elif ch == '+' and value == 'h':
        raw_time = now + datetime.timedelta(hours=time)
        result = raw_time.strftime("%Y-%m-%d %H:%M:%S")
    elif ch == '-' and value == 'h':
        raw_time = now - datetime.timedelta(hours=time)
        result = raw_time.strftime("%Y-%m-%d %H:%M:%S")
    elif ch == '-' and value == 'm':
        raw_time = now - datetime.timedelta(minutes=time)
        result = raw_time.strftime("%Y-%m-%d %H:%M:%S")
    elif ch == '+' and value == 'm':
        raw_time = now + datetime.timedelta(minutes=time)
        result = raw_time.strftime("%Y-%m-%d %H:%M:%S")
    else:
        print("Please provide valid values, we only calculate hours and minutes for now")
    return result

#if nothing is provided
print(time_offset())
print(time_offset(1,'h','-')) 

Ожидаемый результат должен быть таким же, но с другим входом, как я упоминал ранее

2019-06-25 09:34:31 2019-06-25 08:34:31

1 Ответ

0 голосов
/ 25 июня 2019

Как насчет объектно-ориентированного подхода для начала?Вот базовый класс, который может быть подвержен ошибкам в зависимости от использования, но достаточно для начала.Хотя 1h является недопустимым синтаксисом, если вы можете принять 1*h, это должно сделать:

 class mytime:
    def __init__(self,type):
        self.type=type
        self.amount=1
        self.state=1
    def __mul__(self,x):
        self.amount = x
    __rmul__ = __mul__
    def __neg__(self):
        self.state = -1
    def __pos__(self):
        self.state = 1

В функции умножения может быть полезно убедиться, что аргумент действительно является числом.Теперь вы можете использовать:

h = mytime('h')
time_offset(-h) //Or -2*h, or +h, or 3*h etc...

Теперь вам нужно изменить time_offset для обработки с такими вещами, как:

Я создал функцию, как показано ниже, которая будет рассчитывать время для пользователя в зависимости отна том, что предоставил пользователь, т. е. если пользователь предоставит (1, 'h', '+'), функция обеспечит добавление часа к текущему времени, если пользователь ничего не предоставит, параметры по умолчанию гарантируют, что пользовательпредоставляется с текущим временем.Однако я хотел бы, чтобы функция принимала (-1h), чтобы пользователю не приходилось вводить кавычки, и функция все равно будет работать.

Ниже приведена функция, которую я хотел бы изменить, как мы можем видетьон принимает текущий формат, но я хочу изменить формат.

импорт datetime время импорта

def time_offset(thetime):
    value = thetime.type
    time = thetime.amount
    ch = self.state //I use integers since now you can just pass ch*time instead of checking for '-' or '+'

Другой вариант , чтобы сделать h больше одногоиспользуйте вещь, вместо того, чтобы сохранять данные, используя умножение, чтобы просто вернуть данные.Класс становится следующим:

class mytime:
        def __init__(self,type):
            self.type=type
        def __mul__(self,x): 
            return (x,self.type) #x contains the negative sign if needed
        __rmul__ = __mul__
        def __neg__(self):
            return (-1,self.type)
        def __pos__(self):
            return (1,self.type)

В этом методе вы не можете просто иметь h сам по себе, поскольку time_offset(h) будет вести себя по-другому - или вы можете убедиться, что у него правильное поведение кортежа, __getitem__ определенонапример:

def __getitem__(self,i):
    return (1,self.type)[i]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...