[Python]Template class
От: IROV..  
Дата: 22.12.10 17:02
Оценка: 1 (1) :)))
Начал программировать на питоне, разочеровался отсутсвием Шаблонов,
вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

class temlate_new(object):
    def __init__( self, cl, params ):
        self.cl = cl
        self.params = params
        pass
    
    def __call__( self, **kw ):
        name = self.cl.__name__ + repr(self.params)
        bases = self.cl.__bases__     
        
        for key, value in self.params.iteritems():
            if type( kw[key] ) is not value:
                print "Template", name, "is invalid param", key, "need type", repr( value )
                return
                
        dicts = {}
        dicts.update( self.cl.__dict__ )
        dicts.update( kw )                
        
        return type( name, bases, dicts )
        pass
   
class template_declaration(object):
    def __init__( self, **params ):
        self.params = params
        pass
        
    def __call__( self, cl ):
        return temlate_new( cl, self.params )
        pass
    pass

def template( **kw ):
    return template_declaration(**kw)
    pass

    
@template(T = str)
class Test(object):
    def __init__(self):
        pass
        
    def foo(self):
        print self.T
    pass
    
    
test_t = Test(T = "1")
test = test_t()

print test

test.foo()


места использования как и в С++, для Монад

я не волшебник, я только учусь!
Re: [Python]Template class
От: telek1024  
Дата: 22.12.10 17:13
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов,

IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

А зачем вам шаблоны в Python?

Приведите пример, что умеют делать шаблоны и не умеет Python?
Re: [Python]Template class
От: Temoto  
Дата: 22.12.10 18:25
Оценка:
IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов,
IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

— В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.
— Не надо писать pass через строку. Конкретно в вашем коде pass не нужен ни разу.

Конечно, этот костыль имеет право на жизнь. Только, пожалуйста, используйте его только в том коде, который будут поддерживать только такие же фанаты крестов (без обид).

Естественно, вы плохо знаете питон, если только начали на нём программировать, это нормально. Если вопрос был не про знание, а про альтернативные способы достижения тех же целей, для которых вы будете использовать эти шаблоны, конечно, всегда есть миллион разных путей. Дайте конкретную задачу — вам подскажут как её решать более питонными способами.
Re: [Python]Template class
От: FR  
Дата: 22.12.10 18:50
Оценка: +1
Здравствуйте, IROV.., Вы писали:

IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов,

IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

Плохо. Тебе нужно посмотреть на штатное средство метапрограммирования в питоне — метакласссы:

http://www.ibm.com/developerworks/ru/library/l-pymeta/
Re[2]: [Python]Template class
От: IROV..  
Дата: 22.12.10 19:33
Оценка:
Здравствуйте, telek1024, Вы писали:

T>Здравствуйте, IROV.., Вы писали:


IRO>>Начал программировать на питоне, разочеровался отсутсвием Шаблонов,

IRO>>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

T>А зачем вам шаблоны в Python?

я пришел из С++, там есть такое понятие как шаблоны

моя задача была такая, написать саб класс(монаду) для иерархии классов.
@template(TypeElement = str)
class MonadChild(Object):
    def __init__(self, **params):
        super(MonadChild, self).__init__( **params )

        self.elements = []
        pass

    def addElement(self, **params):
        params["Group"] = self.group

        element = ObjectManager.createObject( self.TypeElement, **params )

        self.elements.append(element)
        pass

    def getElements(self):
        return self.elements
        pass

    def _onActivate(self, scene):
        Object._onActivate( self, scene )

        for element in self.elements:
            element.activate( scene )
        pass


используеться както так
class ObjectPuff(MonadChild(TypeElement = "ObjectPuffElement"), Object):
    def __init__(self, **params):
        super(ObjectPuff, self).__init__( **params )

        self.params["Deep"] = self.params.get("Deep", 0)
        pass
    pass


T>Приведите пример, что умеют делать шаблоны и не умеет Python?

делать шаблон умеет — инстанциировать класс с какимто зарание предефайненым параметром/параметрами

я не нашел такой возможности в Python
я не волшебник, я только учусь!
Re[2]: [Python]Template class
От: IROV..  
Дата: 22.12.10 19:36
Оценка:
Здравствуйте, Temoto, Вы писали:

T>- В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.

Буду рад если покажешь как можно было проще без классов

T>- Не надо писать pass через строку. Конкретно в вашем коде pass не нужен ни разу.

Спасибо, знаем. считай, что это кодестайл (есть на то пару оснований, одно из них, мне так красивше)

T>Конечно, этот костыль имеет право на жизнь. Только, пожалуйста, используйте его только в том коде, который будут поддерживать только такие же фанаты крестов (без обид).

спасибо кэп, это правило относиться ко всем костылям/велосипедам.

T>Естественно, вы плохо знаете питон, если только начали на нём программировать, это нормально. Если вопрос был не про знание, а про альтернативные способы достижения тех же целей, для которых вы будете использовать эти шаблоны, конечно, всегда есть миллион разных путей. Дайте конкретную задачу — вам подскажут как её решать более питонными способами.

http://www.rsdn.ru/forum/dynamic/4089666.1.aspx
Автор: IROV..
Дата: 22.12.10

вот тут я указал использование, думаю задача понятна, сделать возможность шаблонизировать классы

я не волшебник, я только учусь!
Re[2]: [Python]Template class
От: IROV..  
Дата: 22.12.10 19:50
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, IROV.., Вы писали:


IRO>>Начал программировать на питоне, разочеровался отсутсвием Шаблонов,

IRO>>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?

FR>Плохо. Тебе нужно посмотреть на штатное средство метапрограммирования в питоне — метакласссы:


FR>http://www.ibm.com/developerworks/ru/library/l-pymeta/

смотрел, но не придумал как сделать более менее удобный синтаксис

подскажешь?
я не волшебник, я только учусь!
Re[3]: [Python]Template class
От: Temoto  
Дата: 22.12.10 19:57
Оценка: 6 (2) +3
T>>- В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.
IRO>Буду рад если покажешь как можно было проще без классов

def template_new(klass, params):
  def fun(**kwargs):
    name = klass.__name__ + repr(self.params)
    bases = klass.__bases__

    for k, v in params.iteritems():
      # вот эта проверка типов аукнется гемором
      if type(kwargs[k]) is not value:
        raise TypeError("Template {0}. Invalid parameter: {1}, need type: {2!r}".format(name, k, v))

    attrs = dict(klass.__dict__, **kwargs)
    return type(name, bases, attrs)
  return fun

def template(**params):
  def fun(klass):
    return template_new(klass, params)
  return fun


T>>Естественно, вы плохо знаете питон, если только начали на нём программировать, это нормально. Если вопрос был не про знание, а про альтернативные способы достижения тех же целей, для которых вы будете использовать эти шаблоны, конечно, всегда есть миллион разных путей. Дайте конкретную задачу — вам подскажут как её решать более питонными способами.

IRO>http://www.rsdn.ru/forum/dynamic/4089666.1.aspx
Автор: IROV..
Дата: 22.12.10

IRO>вот тут я указал использование, думаю задача понятна, сделать возможность шаблонизировать классы

Шаблонизировать классы это либо такое теоретическое упражнение, типа посчитать пи до N-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи.
Re[4]: [Python]Template class
От: IROV..  
Дата: 22.12.10 20:18
Оценка:
Здравствуйте, Temoto, Вы писали:

T>>>- В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.

IRO>>Буду рад если покажешь как можно было проще без классов

T>
T>def template_new(klass, params):
T>  def fun(**kwargs):
T>    name = klass.__name__ + repr(self.params)
T>    bases = klass.__bases__

T>    for k, v in params.iteritems():
T>      # вот эта проверка типов аукнется гемором
T>      if type(kwargs[k]) is not value:
T>        raise TypeError("Template {0}. Invalid parameter: {1}, need type: {2!r}".format(name, k, v))

T>    attrs = dict(klass.__dict__, **kwargs)
T>    return type(name, bases, attrs)
T>  return fun

T>def template(**params):
T>  def fun(klass):
T>    return template_new(klass, params)
T>  return fun
T>

Хм, "замыкание"
ок, допустим, но мне както тот код пока ближе.

По поводу проверки — тоже думал, стоит не стоит
вся беда в том что в скобки красиво можно передать kwds а там нужно вейлю, вот я и подумал почему бы не сделать тип в С++ тоже это есть

template<class C> — шаблонизируем классом
template<int I> — шаблонизируем значением

T>Шаблонизировать классы это либо такое теоретическое упражнение, типа посчитать пи до N-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи.

Задача как всегда проста, уменшить количество кода, оптимизация.

Вот наверное постановка задачи:

Добавить возможность задавать классу локальные константы
я не волшебник, я только учусь!
Re[5]: [Python]Template class
От: Temoto  
Дата: 22.12.10 23:15
Оценка: +2
T>>Шаблонизировать классы это либо такое теоретическое упражнение, типа посчитать пи до N-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи.
IRO>Задача как всегда проста, уменшить количество кода, оптимизация.

Нет. Простота, малое количество строк это требование к решению какой-то задачи. Хотите пример что я подразумеваю под задачей? Найти 1000 самых маленьких чисел в файле, числа записаны в таком-то формате.

Когда в формулировке звучит вообще хоть что-то про классы, функции и прочие языковые особенности, которых может не быть в другом языке — это либо задача на анализ конкретного языка, либо это не задача, а видение решения.

Это всё может звучать очень занудно, но поверьте, в этом есть смысл, осознание придёт позже. Нужно обозначить задачу и вам покажут как её решать по-питонячьи.

IRO>Вот наверное постановка задачи:


IRO>Добавить возможность задавать классу локальные константы


Это тоже инструмент для решения какой-то задачи.

Но он в питоне делается намного проще, чем акробатика с type.

class Identity(object):
  DUMMY, PASSWORD, OPENID, OAUTH = range(4)

  #... attributes, methods


ident.kind = Identity.OPENID
ident.url = "garbage"
Re[6]: [Python]Template class
От: IROV..  
Дата: 22.12.10 23:36
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Нет. Простота, малое количество строк это требование к решению какой-то задачи. Хотите пример что я подразумеваю под задачей? Найти 1000 самых маленьких чисел в файле, числа записаны в таком-то формате.

Оговорился не простота и минимум кода, я даже против минимализма кода на самом деле.
я хотел сказать "дубликат" кода

T>Это всё может звучать очень занудно, но поверьте, в этом есть смысл, осознание придёт позже. Нужно обозначить задачу и вам покажут как её решать по-питонячьи.

Может, может

IRO>>Вот наверное постановка задачи:


IRO>>Добавить возможность задавать классу локальные константы


T>Это тоже инструмент для решения какой-то задачи.


T>Но он в питоне делается намного проще, чем акробатика с type.


T>
T>class Identity(object):
T>  DUMMY, PASSWORD, OPENID, OAUTH = range(4)

T>  #... attributes, methods


T>ident.kind = Identity.OPENID
T>ident.url = "garbage"
T>

Тоесть ты считаешь что результаты моего и твоего кода идентичны?
моя задача сделать любой мною выбраный класс "параметризированым" извне.
я не волшебник, я только учусь!
Re[6]: [Python]Template class
От: IROV..  
Дата: 22.12.10 23:37
Оценка:
Здравствуйте, Temoto, Вы писали:

Нескромный вопрос а ты хорошо знаком с шаблонами в С++?
может у нас диалог "слепого с глухим"
я не волшебник, я только учусь!
Re[7]: [Python]Template class
От: FR  
Дата: 23.12.10 06:30
Оценка: 1 (1) +2
Здравствуйте, IROV.., Вы писали:

IRO>Нескромный вопрос а ты хорошо знаком с шаблонами в С++?

IRO>может у нас диалог "слепого с глухим"

Я неплохо знаю шаблоны C++, но до меня так и не доходит что именно ты хочешь.
Приведи пример на C++ я попробую перевести на питон.
Re[8]: [Python]Template class
От: IROV..  
Дата: 23.12.10 10:44
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, IROV.., Вы писали:


IRO>>Нескромный вопрос а ты хорошо знаком с шаблонами в С++?

IRO>>может у нас диалог "слепого с глухим"

FR>Я неплохо знаю шаблоны C++, но до меня так и не доходит что именно ты хочешь.

FR>Приведи пример на C++ я попробую перевести на питон.

template<class T>
class MonadChild
{
public:
  MonadChild()
  {
  }

public:
  void addElements( Params & _params )
  {
    T * element = Factory.createObject<T>( _params )

    m_elements.push_back(element)
  }

...

protected:
  std::vector<T *> m_elememts;
}

class Node
 : public MonadChild<Node>
{
...
}


я не волшебник, я только учусь!
Re: [Python]Template class
От: IROV..  
Дата: 23.12.10 13:16
Оценка:
вот небольшой(необходимый ) апдейт

class template_new(object):
    s_template = {}

    def __init__( self, cl, params ):
        self.cl = cl
        self.params = params

        if self.cl not in template_new.s_template:
            template_new.s_template[self.cl] = {}

        self.cache = template_new.s_template[self.cl]
        pass

    def __call__( self, **kw ):
        name = self.cl.__name__ + repr(self.params)

        if name in self.cache:
            return self.cache[name]
            pass

        bases = self.cl.__bases__

        for key, value in self.params.iteritems():
            if type( kw[key] ) is not value:
                raise TypeError("Template {0}. is invalid parameter: {1}, need type: {2!r}".format(name,key,value) )
                return

        attrs = dict(self.cl.__dict__, **kw)
        
        template_type = type( name, bases, attrs )

        self.cache[name] = template_type
        
        return template_type
        pass

class template_declaration(object):
    def __init__( self, **params ):
        self.params = params
        pass

    def __call__( self, cl ):
        return template_new( cl, self.params )
        pass
    pass

def template( **kw ):
    if kw is None:
        raise TypeError( "template decorator need template params" )
        pass

    return template_declaration(**kw)
    pass
я не волшебник, я только учусь!
Re[9]: [Python]Template class
От: Senyai Россия http://www.arseniy.net
Дата: 23.12.10 13:44
Оценка:
Здравствуйте, IROV..
IRO>
IRO>template<class T>
IRO>class MonadChild
IRO>{
IRO>...
IRO>}
IRO>


Тоже не могу понять что вам нужно, но этот с++ код, возможно, похож на этот:
class MonadChild(object):
    def __init__(self):
        self.elements = []
    def add_element(self, *params):
        element = self.T(*params)
        self.elements.append(element)

class Node(MonadChild):
    def __init__(self, *whatever):
        super(Node, self).__init__()
        self.T = Node
        self.whatever = whatever
    def __repr__(self):
        return '<Node "' + `self.whatever` +'">'

n = Node()
n.add_element(42)
n.add_element(42, 13)
print 'root', n
print 'nodes', n.elements
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
Re[10]: [Python]Template class
От: IROV..  
Дата: 23.12.10 14:15
Оценка:
Здравствуйте, Senyai, Вы писали:

S>Тоже не могу понять что вам нужно, но этот с++ код, возможно, похож на этот:

S>
S>class MonadChild(object):
S>    def __init__(self):
S>        self.elements = []
S>    def add_element(self, *params):
S>        element = self.T(*params)
S>        self.elements.append(element)

S>class Node(MonadChild):
S>    def __init__(self, *whatever):
S>        super(Node, self).__init__()
S>        self.T = Node
S>        self.whatever = whatever
S>    def __repr__(self):
S>        return '<Node "' + `self.whatever` +'">'

S>n = Node()
S>n.add_element(42)
S>n.add_element(42, 13)
S>print 'root', n
S>print 'nodes', n.elements
S>


Похож, но есть нюанс, каждый экземпляр(обьект) типа Node будет иметь атрибут T.
Теперь представим что у нас их 10к — получаем ненужный расход памяти.

я не волшебник, я только учусь!
Re[11]: [Python]Template class
От: Senyai Россия http://www.arseniy.net
Дата: 23.12.10 14:49
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Похож, но есть нюанс, каждый экземпляр(обьект) типа Node будет иметь атрибут T.

IRO>Теперь представим что у нас их 10к — получаем ненужный расход памяти.

Если нюанс только в этом, то предложу так:

class MonadChild(object):
    def __init__(self):
        self.elements = []
    def add_element(self, *params):
        element = self.T(*params)
        self.elements.append(element)

class Node(MonadChild):
    def __init__(self, *whatever):
        super(Node, self).__init__()
        self.whatever = whatever
    def __repr__(self):
        return '<Node "' + `self.whatever` +'">'

Node.T = Node

n = Node()
n.add_element(42)
n.add_element(42, 13)
print 'root', n
print 'nodes', n.elements

Наверное можно и красивее.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
Re[12]: [Python]Template class
От: IROV..  
Дата: 23.12.10 14:57
Оценка:
Здравствуйте, Senyai, Вы писали:

S>
S>class MonadChild(object):
S>    def __init__(self):
S>        self.elements = []
S>    def add_element(self, *params):
S>        element = self.T(*params)
S>        self.elements.append(element)

S>class Node(MonadChild):
S>    def __init__(self, *whatever):
S>        super(Node, self).__init__()
S>        self.whatever = whatever
S>    def __repr__(self):
S>        return '<Node "' + `self.whatever` +'">'

S>Node.T = Node

S>n = Node()
S>n.add_element(42)
S>n.add_element(42, 13)
S>print 'root', n
S>print 'nodes', n.elements
S>

S>Наверное можно и красивее.

нюансов много даже не смотря на кривость записи.

усложняем, нужно наследоваться от двух и более монад MonadChild с разными типами

я не волшебник, я только учусь!
Re[9]: [Python]Template class
От: FR  
Дата: 23.12.10 17:00
Оценка:
Здравствуйте, IROV.., Вы писали:

Я пас переводить, извини, но я у тебя наблюдаю синдром "настоящего программиста, который может написать
программу на ФОРТРАНе на любом языке"
Выше уже просили формулировку задачи присоединюсь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.