3

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]

the code diagram is :given

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: required

1 Answer 1

2

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]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.