2017-05-30 2 views
2

Ich versuche, die Auswertung von Funktionen mit Hilfe von Dekoratoren zu steuern. Also ich erstelle eine Instanz von MyClass und dann Funktionen unter der Bedingung mode Eigenschaften bewerten.Python-Handler zur Überprüfung der Bedingung

class MyClass: 
    def __init__(self): 
     self.mode = None 

    def mode_handler(self, mode): 
     def wrap(func): 
      def inner(*args, **kwargs): 
       if mode == self.mode: 
        return func(*args, **kwargs) 
       else: 
        pass 
      return inner 
     return wrap 

a = MyClass() 


@a.mode_handler(mode='repeat') 
def print_args(*args): 
    print(args) 


@a.mode_handler(mode='nuff_saif') 
def nuff_said(): 
    print('NUFF SAID') 

# 1 
a.mode = 'nuff_said' 
print_args(1, 2, 3) 
nuff_said() 

# 2 
a.mode = 'repeat' 
print_args(4, 5, 6) 
nuff_said() 

# 3 
a.mode = 'something_else' 
print_args(7, 8, 9) 
nuff_said() 

Ich erwartete

NUFF SAID 
(4, 5, 6) 

wie bei Block 1 mode=='nuff_said' und bei Block 2 mode=='repeat' zu bekommen.

Ich habe

(4, 5, 6) 

statt. Wie sollte ich meinen Code verbessern?

+1

Interessante Verwendung von Dekorateuren – Har

Antwort

1

Das Problem ist mit dem Modus-Handler selbst:

@a.mode_handler(mode='repeat') 
def print_args(*args): 
    print(args) 


@a.mode_handler(mode='nuff_saif') ### Here it is "nuff_saif" 
def nuff_said(): 
    print('NUFF SAID') 

# 1 
a.mode = 'nuff_said' ### Here it is "nuff_said" 
print_args(1, 2, 3) 
nuff_said() 

# 2 
a.mode = 'repeat' 
print_args(4, 5, 6) 
nuff_said() 

Sie Ihren Code bearbeiten können, und es sollte dann funktionieren. Prost.

+0

Ich gehe hier davon aus, dass Sie den genauen Code gaben, den Sie verwenden. – TheDarkKnight

1

Sie haben einfach einen Tippfehler in Ihrem Code. Der Dekorator der nuff_said Funktion ist mit dem Modus nuff_sai f, aber Sie ändern den Modus der Instanz vor dem Aufruf der Funktion zu nuff_sai d.

Verwandte Themen