Функция с различным поведением в зависимости от количества вводимых аргументов - PullRequest
0 голосов
/ 22 марта 2019

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

def report_time(greater_than1=0, lower_than1=24, 
                greater_than2=0, lower_than2=24, 
                greater_than3=0, lower_than3=24, 
                ...
                greater_thanN=0, lower_thanN=24):    
    if greater_than1 < datetime.now().hour < lower_than1:
        logger.info('Hour is correct')
        return True

    if greater_than2 < datetime.now().hour < lower_than2:
        logger.info('Hour is correct')
        return True

    if greater_than3 < datetime.now().hour < lower_than3:
        logger.info('Hour is correct')
        return True

    ...

    if greater_thanN < datetime.now().hour < lower_thanN:
        logger.info('Hour is correct')
        return True

Примеры использования:

foo = report_time(16, 18)
foo = report_time(16, 18, 23, 24)
foo = report_time(16, 18, 23, 24, ..., 3, 5)

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Лучшая альтернатива - заставить функцию принимать только пару параметров, а затем выполнить итерацию по всем парам вне функции и проверить, был ли на каком-либо шаге возвращен True:

def report_time(greater_than=0, lower_than=24):
    return greater_than < datetime.now().hour < lower_than


start_times = [10, 12, 20]
end_times = [11, 15, 22]

for start, end in zip(start_times, end_times):
    if report_time(start, end):
        logger.info('Hour is correct')
        break

Это можно сократить, используя map и any:

valid_times = map(report_time, start_times, end_times)
if any(valid_times):
    logger.info('Hour is correct')

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

def within_limits(limits=(0, 24)):
    return limits[0] < datetime.now().hour < limits[1]


time_limits = [(10, 11), (12, 15), (20, 22)]
if any(filter(within_limits, time_limits)):
    logger.info('Hour is correct')
1 голос
/ 22 марта 2019

Вам нужно посмотреть на *args:

def multi_arg_pairs(*args):
    if len(args) % 2 == 1:
        raise ValueError("arguments must be an even number")
    for v1, v2 in zip(args[0::2], args[1::2]):
        print(v1, v2)
        # Do something with your value pairs

multi_arg_pairs(1, 2, 3, 4)

Выходы:

1 2
3 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...