The code of simple tree
class A_1: saveable =True class A_2: saveable =False class B_1: saveable =True class B_2: saveable =False class C_1: saveable =False class C_2: saveable =True class A: saveable = True inline = [A_1,A_2] class B: saveable = False inline = [B_1,B_2] class C: saveable = True inline = [C_1,C_2] class Main: inline =[A,B,C]
I want a function or a method that order the node according saveable attribute. I want the output like:
>>Main.inline [B, C, A] >>A.inline [A_2,A_1]
and so on
if we plot the output is same like:
Advertisement
Answer
While I disagree with the approach, this is what you need to do: (I’ve modified the code as little as possible, and added tests at the bottom to prove it works)
import operator class A_1: saveable =True class A_2: saveable =False class B_1: saveable =True class B_2: saveable =False class C_1: saveable =False class C_2: saveable =True class Ordered(type): def __new__(cls, name, bases, attr): new_klass = super(Ordered, cls).__new__(cls, name, bases, attr) # Uncomment the line bellow after you've read the comment in all the # way at the bottom of the code. # # new_klass.inline.sort(key=lambda x: x.__name__, reverse=True) new_klass.inline.sort(key=operator.attrgetter('saveable')) return new_klass class A(metaclass=Ordered): saveable = True inline = [A_1,A_2] class B(metaclass=Ordered): saveable = False inline = [B_1,B_2] class C(metaclass=Ordered): saveable = True inline = [C_1,C_2] class Main(metaclass=Ordered): inline =[A,B,C] # this differs from your example slightly, since you asked # for `[B, C, A]`, in order to get that working, is just a # matter of changing the `sort()` above, and uncommenting # the commented line in the function. I left it there in # case you REALLY wanted it. I figured this would be enough # and the alternative just complicates things further assert Main.inline == [B, A, C] # assert Main.inline == [B, C, A] assert A.inline == [A_2, A_1]