#python
Вопрос:
Я считаю, что в последнее время у меня появилась плохая привычка при работе с python. Иногда внутренний метод не обладает всеми необходимыми функциями, поэтому я переопределяю метод локально. Например, я хотел использовать метод filter() для поиска методов в модуле.
items=(x if 'query' in x.lower() else False for x in dir(module))
что возвращает огромный список. Я хотел отфильтровать это с помощью filter(), но метод казался странно ограниченным. Первоначальным решением было:
items_filtered=filter(lambda x: x,items) print([x for x in items_filtered.__iter__()])
Что кажется большим количеством строк, чем я хочу. Кроме того, мне не понравилось, что iter() очищает массив, что расстраивает такие среды ноутбуков, как Jupiter. Я переопределил метод фильтра следующим образом:
_filter = filter class filter(_filter): def __init__(self,*args,**kwargs): _filter.__init__(*args,**kwargs) itr = self.__iter__ self.values = [x for x in self.__iter__()] self.__itr__ = itr
что позволяет одному лайнеру быть
items=filter(lambda x,(x if 'query' in x.lower() else False for x in dir(module))).values
Очевидно, что это не «правильный» способ справиться с этими ситуациями, но сломает ли он что-нибудь при неправильном использовании?
Ответ №1:
Похоже, вам просто нужен список всех имен методов (данного модуля), идентификаторы которых содержат определенную подстроку. Почему бы просто не:
print([x for x in dir(module) if "query" in x.lower()])
Что касается объекта фильтра, то фильтр является итератором — он лениво оценивается, и его содержимое потребляется по мере их получения/повторения. Вместо привязки объекта фильтра к переменной просто создайте анонимный объект фильтра в строке, в которой вы собираетесь его использовать:
print([x for x in filter(...)])
или даже лучше:
print(list(filter(...)))
Пожалуйста, не используйте явно __iter__()
для перебора итератора…