Python надежная мин. / Макс. Функция с Нет - PullRequest
2 голосов
/ 14 июля 2020

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

Это то, что я создал до сих пор:

def min_null(q, *args):
    if isinstance(q, Iterable):
        return min(filter(lambda x: x is not None, q)) if any(q) else None
    else:
        return min_null([q, *args])

вы видите, как это может потерпеть неудачу? Или как это можно улучшить?

Буду рад любым отзывам :)

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Да, один случай сбоя - min_null([0, 0]), который возвращает None, а не то, что я ожидал, а именно 0. Это можно исправить разными способами, но можно было бы вынести filter(lambda x: x is not None, q) в переменную и затем проверить ее длину, а не просто проверять какие-либо истинные значения.

0 голосов
/ 14 июля 2020

Похоже, вы можете использовать функцию min / max с key= и настраиваемым объектом сравнения, который обрабатывает None специально:

class Predicate:
    def __init__(self, item):
        self.item = item

    def __lt__(self, other):
        try:
            return self.item < other.item
        except TypeError:
            return False


print(min([0, 1, 2, None, 3, 4], key=Predicate))
print(min([None], key=Predicate))

print(max([0, 1, 2, 3, None, 4, 5], key=Predicate))
print(max([None], key=Predicate))

Вывод:

0
None
5
None
0

Do у вас есть еще несколько примеров или тестов относительно ожидаемых результатов?

...