Почему нельзя использовать list (filter (boolean, python_list)) внутри __new__ при определении класса в python? - PullRequest
0 голосов
/ 28 января 2019

Я понял, что невозможно применить list(filter(_,_)) в __new__ при определении класса.Однако возможно использовать фильтр или список отдельно.

Консоль выдает эту ошибку:

TypeError: 'list' object is not callable

Это не работает:

class test():    
   def __init__(self):     
       self.mean = [1,2,3,4]
bool_list=[True,False,True,True]     

class tracegrad_set():     
   def __new__(cls,obj,bool_list):     
       list(filter(bool_list,obj.mean))     
       obj.mean= obj.mean[:2]     
       return obj       
a=test()     
b=tracegrad_set(a,bool_list)

Между тем это

class test():    
   def __init__(self):     
       self.mean = [1,2,3,4]
bool_list=[True,False,True,True]     

class tracegrad_set():     
   def __new__(cls,obj,bool_list):     
       filter(bool_list,obj.mean)   
       obj.mean= obj.mean[:2]     
       return obj       
a=test()     
b=tracegrad_set(a,bool_list)

Или это

class test():    
   def __init__(self):     
       self.mean = [1,2,3,4]
bool_list=[True,False,True,True]     

class tracegrad_set():     
   def __new__(cls,obj,bool_list):     
       list(bool_list,obj.mean)   
       obj.mean= obj.mean[:2]     
       return obj       
a=test()     
b=tracegrad_set(a,bool_list)

1 Ответ

0 голосов
/ 28 января 2019

filter ожидает в качестве первого аргумента либо вызываемый, либо None (просто отфильтровывать элементы, оцениваемые как false-ish);вы предоставили list логических значений, и, следовательно, когда вы попытались получить доступ к результатам фильтрации, TypeError было поднято.Фильтр пытался вызвать что-то вроде bool_list(obj.mean[0])

Поскольку я могу только предположить, что вы хотите сохранить элементы списка, для которых индексы в списке bool были True, будет легче достичьэто с использованием понимания списка, что-то вроде:

my_new_list = [value for keep, value in zip(bool_list, obj.mean) if keep]

Или, если вы настаиваете на использовании map / filter, вы можете использовать что-то вроде:

from operator import itemgetter
...
my_new_list = map(itemgetter(1), filter(itemgetter(0), zip(bool_list, obj.mean))
# or use lambda: t: t[<index>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...