Здравствуйте, IROV.., Вы писали:
IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов, IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?
А зачем вам шаблоны в Python?
Приведите пример, что умеют делать шаблоны и не умеет Python?
IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов, IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?
— В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.
— Не надо писать pass через строку. Конкретно в вашем коде pass не нужен ни разу.
Конечно, этот костыль имеет право на жизнь. Только, пожалуйста, используйте его только в том коде, который будут поддерживать только такие же фанаты крестов (без обид).
Естественно, вы плохо знаете питон, если только начали на нём программировать, это нормально. Если вопрос был не про знание, а про альтернативные способы достижения тех же целей, для которых вы будете использовать эти шаблоны, конечно, всегда есть миллион разных путей. Дайте конкретную задачу — вам подскажут как её решать более питонными способами.
Здравствуйте, IROV.., Вы писали:
IRO>Начал программировать на питоне, разочеровался отсутсвием Шаблонов, IRO>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?
Плохо. Тебе нужно посмотреть на штатное средство метапрограммирования в питоне — метакласссы:
Здравствуйте, 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
T>Приведите пример, что умеют делать шаблоны и не умеет Python?
делать шаблон умеет — инстанциировать класс с какимто зарание предефайненым параметром/параметрами
Здравствуйте, Temoto, Вы писали:
T>- В питоне есть функции. Нет необходимости на каждый чих писать десятки строк класса. Имеется в виду template_new.
Буду рад если покажешь как можно было проще без классов
T>- Не надо писать pass через строку. Конкретно в вашем коде pass не нужен ни разу.
Спасибо, знаем. считай, что это кодестайл (есть на то пару оснований, одно из них, мне так красивше)
T>Конечно, этот костыль имеет право на жизнь. Только, пожалуйста, используйте его только в том коде, который будут поддерживать только такие же фанаты крестов (без обид).
спасибо кэп, это правило относиться ко всем костылям/велосипедам.
T>Естественно, вы плохо знаете питон, если только начали на нём программировать, это нормально. Если вопрос был не про знание, а про альтернативные способы достижения тех же целей, для которых вы будете использовать эти шаблоны, конечно, всегда есть миллион разных путей. Дайте конкретную задачу — вам подскажут как её решать более питонными способами. http://www.rsdn.ru/forum/dynamic/4089666.1.aspx
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, IROV.., Вы писали:
IRO>>Начал программировать на питоне, разочеровался отсутсвием Шаблонов, IRO>>вот написал себе костыль, имеет ли оно право на жизнь? или я плохо знаю питон?
FR>Плохо. Тебе нужно посмотреть на штатное средство метапрограммирования в питоне — метакласссы:
FR>http://www.ibm.com/developerworks/ru/library/l-pymeta/
смотрел, но не придумал как сделать более менее удобный синтаксис
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
IRO>вот тут я указал использование, думаю задача понятна, сделать возможность шаблонизировать классы
Шаблонизировать классы это либо такое теоретическое упражнение, типа посчитать пи до N-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи.
Здравствуйте, 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-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи.
Задача как всегда проста, уменшить количество кода, оптимизация.
Вот наверное постановка задачи:
Добавить возможность задавать классу локальные константы
T>>Шаблонизировать классы это либо такое теоретическое упражнение, типа посчитать пи до N-ого знака (что менее вероятно). Либо, что более вероятно, — попытка применить подход крестов в другом языке. То есть всё-таки это не задача, а кусок решения какой-то неизвестной задачи. IRO>Задача как всегда проста, уменшить количество кода, оптимизация.
Нет. Простота, малое количество строк это требование к решению какой-то задачи. Хотите пример что я подразумеваю под задачей? Найти 1000 самых маленьких чисел в файле, числа записаны в таком-то формате.
Когда в формулировке звучит вообще хоть что-то про классы, функции и прочие языковые особенности, которых может не быть в другом языке — это либо задача на анализ конкретного языка, либо это не задача, а видение решения.
Это всё может звучать очень занудно, но поверьте, в этом есть смысл, осознание придёт позже. Нужно обозначить задачу и вам покажут как её решать по-питонячьи.
IRO>Вот наверное постановка задачи:
IRO>Добавить возможность задавать классу локальные константы
Это тоже инструмент для решения какой-то задачи.
Но он в питоне делается намного проще, чем акробатика с type.
Здравствуйте, Temoto, Вы писали:
T>Нет. Простота, малое количество строк это требование к решению какой-то задачи. Хотите пример что я подразумеваю под задачей? Найти 1000 самых маленьких чисел в файле, числа записаны в таком-то формате.
Оговорился не простота и минимум кода, я даже против минимализма кода на самом деле.
я хотел сказать "дубликат" кода
T>Это всё может звучать очень занудно, но поверьте, в этом есть смысл, осознание придёт позже. Нужно обозначить задачу и вам покажут как её решать по-питонячьи.
Может, может
IRO>>Вот наверное постановка задачи:
IRO>>Добавить возможность задавать классу локальные константы
T>Это тоже инструмент для решения какой-то задачи.
T>Но он в питоне делается намного проще, чем акробатика с type.
T>
Здравствуйте, 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>
{
...
}
Здравствуйте, 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
Я пас переводить, извини, но я у тебя наблюдаю синдром "настоящего программиста, который может написать
программу на ФОРТРАНе на любом языке"
Выше уже просили формулировку задачи присоединюсь.