Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Проблема с BoostPythonMetaclass


Автор: Aliance 18.9.2008, 23:18
Странно, но вот такой код выдает ошибку:

Код

...
# The base Boost.Python class
BoostPythonMetaclass = Coord.__class__

class _injector(object):
    class __metaclass__(BoostPythonMetaclass):
        def __init__(self, name, bases, dict):
            for b in bases:
                if type(b) not in (self, type):
                    for k,v in dict.items():
                        setattr(b,k,v)
            return type.__init__(self, name, bases, dict)

class _Coord(Coord,_injector):
    def __repr__(self):
        return 'Coord(%s,%s)' % (self.x, self.y)
...


Ошибка:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "...test.py", line 19, in <module>
    BoostPythonMetaclass = Coord.__class__
NameError: name 'Coord' is not defined


Помогите.

Автор: Aliance 20.9.2008, 21:18
В интернете нашел похожую http://www.linux.org.ru/view-message.jsp?msgid=2447167, там решение свелось к удалению лишней пустой строки - не очень понимаю где она. 

Автор: Fenrir13 21.9.2008, 09:41
По ссылке проблема всего лишь в кривых отступах, а не мифических пустых строках.

А в вашем коде не видно, чтобы класс Coord был уже определен на момент строки BoostPythonMetaclass = Coord.__class__ Проверьте, точно ли он описан/подключен ранее.

Автор: Aliance 21.9.2008, 12:35
В том-то и дело, что он ранее не определен. Но тем ни менее, если написать так:
Код

# The base Boost.Python class
BoostPythonMetaclass = _Coord.__class__

Работать по-прежнему ничего не будет.

Автор: Fenrir13 21.9.2008, 18:37
И что же тут странного? Откуда будет работать то, чего нет? И BoostPythonMetaclass = _Coord.__class__ ты небось тоже пишешь ДО определения _Coord?

Автор: Aliance 22.9.2008, 11:59
Либо я чего-то не понимаю, либо ты ошибаешься.
Смотри http://www.boost.org/doc/libs/1_31_0/libs/python/doc/tutorial/doc/extending_wrapped_objects_in_python.html, вот рабочий код:
Код

    ##The one Boost.Python uses for all wrapped classes. 
    ##You can use here any class exported by Boost instead of "point"
    BoostPythonMetaclass = point.__class__ 

    class injector(object):
        class __metaclass__(BoostPythonMetaclass):
            def __init__(self, name, bases, dict):
                for b in bases:
                    if type(b) not in (self, type):
                        for k,v in dict.items():
                            setattr(b,k,v)
                return type.__init__(self, name, bases, dict)

    ##inject some methods in the point foo
    class more_point(injector, point):
        def __repr__(self):
            return 'Point(x=%s, y=%s)' % (self.x, self.y)
        def foo(self):
            print 'foo!'

В нем ведь тот же синтаксис - но все работает.

Автор: Fenrir13 23.9.2008, 10:17
Цитата(Aliance @  22.9.2008,  14:59 Найти цитируемый пост)
Смотри сюда, вот рабочий код:

Тобой приведен кусок кода. Он не работает сам по себе. Класс point там берется из кода ранее:
Код
from _geom import *

А где берешь Coord ты?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)