2016-12-11 4 views
0

Ich habe eine Menge von Python-Code zu schreiben, die wie das aussehen wird folgende:Python eval innerhalb einer Klasse

class MyClass(object): 
    ... 
    ... 
    ... 
    def handle_request(self, request): 
     attr1 = self.__get_attr1(request) 
     self.__validate_attr1(attr1) 

     attr2 = self.__get_attr2(request) 
     self.__validate_attr2(attr2) 

     attr3 = self.__get_attr3(request) 
     self.__validate_attr1(attr3) 
     ... 
     ... 
     ... 
     attrn = self.__get_attrn(request) 
     self.__validate_attrn(attr1) 

Um mein Leben einfacher mache ich dachte, dass ich folgendes tun könnte:

class MyClass(object): 
    ... 
    ... 
    ... 
    def handle_request(self, request): 
     attr_list = ('attr1', 'attr2', 'attr3', ..., 'attrn'); 
     for a in attr_list: 
      locals()[a] = eval('self.__get_{}(request)'.format(a)) 
      eval('self.__validate_{}'.format(a) 

jedoch, wenn ich diesen Code ausführen ich einen folgenden Fehler bekommen:

AttributeError: 'MyClass' object has no attribute '__get_attr1' 

klar bin ich etwas fehlt groß, aber ich bin nicht sur Was genau?

+0

Sie versuchen eindeutig nicht den Wert von '__get_attr1' definiert, bevor es zu benutzen. –

+0

@ ÉbeIsaac Angenommen, __get_attr-Methoden sind definiert. – flashburn

+0

Ich kann, aber schade, Ihr Programm könnte nicht das Gleiche tun. Könnten Sie '__get_attr1' auf andere Weise als' eval' aufrufen? –

Antwort

0

Um die Frage zu beantworten, die Sie nicht gefragt, stattdessen eval verwenden, könnten Sie so etwas wie

class MyClass(object): 
    ... 
    def __init__(self): 
     self.attr_list = [self.__get_attr1, ..., self.__get_attrn] 
     self.validate_list = [self.__validate_attr1, ..., self.__validate_attrn] 
    ... 
    def handle_request(self, request): 
     attrs = [get(request) for get in self.attr_list] 
     for validate in self.validate_list: 
      validate(request) 
+1

Oder nur 'getattr (self, attribute_name)'. –

Verwandte Themen