Каковы недостатки изменения внутреннего метода python?

#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__() для перебора итератора…