2016-12-28 3 views
0

Я новичок в Python и цементным приложение,объект не имеет атрибута _meta в питона Cement App

Я просто проходящие через документации, предоставленной в цементном приложении, и я столкнулся следующий вопрос

Traceback (most recent call last): 
    File "/Users/Amith/python/learning/inter.py", line 80, in <module> 
    app.handler.register(MyHandler) 
    File "/Users/Amith/python/learning/connectors/lib/python2.7/site-packages/cement/core/handler.py", line 195, in register 
    if not hasattr(obj._meta, 'label') or not obj._meta.label: 
AttributeError: 'MyHandler' object has no attribute '_meta' 

Я не нашел много помощи от документации и проверил несколько других wesites.

Пожалуйста, найти свой код ниже

from cement.core.foundation import CementApp 
from cement.core.interface import Interface, Attribute 
from cement.core import interface 
from cement.core.handler import CementBaseHandler 

def my_validator(klass, obj): 
    members = [ 
     '_setup', 
     'do_something', 
     'my_var', 
     ] 
    interface.validate(MyInterface, obj, members) 

class MyInterface(Interface): 
    class IMeta: 
     label = 'myinterface' 
     validator = my_validator 
    # Must be provided by the implementation 
    Meta = Attribute('Handler Meta-data') 
    my_var = Attribute('A variable of epic proportions.') 

    def _setup(app_obj): 
     """ The setup function """ 

    def do_something(): 
     """  This function does something. """ 

class MyHandler(CementBaseHandler): 
    class Meta: 
     interface = MyInterface 
     label = 'my_handler' 
     description = 'This handler implements MyInterface' 
     config_defaults = dict(
      foo='bar' 
      ) 

    my_var = 'This is my var' 

    def __init__(self): 
     self.app = None 

    def _setup(self, app_obj): 
     self.app = app_obj 

    def do_something(self): 
     print "Doing work!" 


class MyApp(CementApp): 
    class Meta: 
     label = 'myapp' 
     define_handlers = [MyInterface] 
     handlers = [MyHandler] 

app = CementApp('myapp') 
# define interfaces after app is created 
app.setup() 
print app.config.keys('myapp') 
app.config.set('myapp', 'debug', True) 
print app.config.keys('myapp') 
app.handler.define(MyInterface) 
app.handler.register(MyHandler) 
app.run() 

Любая помощь будет намного appriciated

+0

Справка из http://builtoncement.com/2.10/dev/interfaces_and_handlers.html – amith

ответ

1

Проблема заключается в том, что MyHandler не правильно подклассу CementBaseHandler. Любые методы должны быть под-классифицирован с super() ... например:

class MyHandler(CementBaseHandler): 
    class Meta: 
     interface = MyInterface 
     label = 'my_handler' 
     description = 'This handler implements MyInterface' 
     config_defaults = dict(
      foo='bar' 
     ) 
    my_var = 'This is my var' 

    def __init__(self, *args, **kw): 
     super(MyHandler, self).__init__(*args, **kw) 

     # add your code here (if necessary) 

    def _setup(self, app_obj): 
     super(MyHandler, self)._setup(app_obj) 

     # add your code here if necessary 

    def do_something(self): 
     print "Doing work!" 

Обратите внимание на изменения в MyHandler.__init__() и MyHandler._setup() использованием super() ... это исправили проблему для меня.

Приносим извинения за доставленные неудобства в документации и благодарю вас за то, что вы указали правильный/рабочий/воспроизводимый пример. Я добавил проблему в проект в Github, чтобы зафиксировать его в следующей версии.

+0

Удивительная это работает – amith

Смежные вопросы