Вот отличный МК для того, чтобы узнать, как просто сделать новогоднюю елку своими руками быстро и просто. Рассмотрим три разных способа.


Вот отличный МК для того, чтобы узнать, как просто сделать новогоднюю елку своими руками быстро и просто. Рассмотрим три разных способа.

Попробуем вместе сделать красивый новогодний шар со снегом из самой обычной стеклянной банки. Эти шарики были моими любимыми в детстве, да и по сей день я с удовольствием разглядываю подобные в магазине, пытаясь отыскать тот, который похож на оригинал из моего детства. Читайте урок и пробуйте сами.
Деревянная мебель является на сегодняшний день одной из самых популярных. Связано это со многими факторами. Многие выбирают дерево, так как это натуральный материал, который является экологически чистым. Как правило, натуральное дерево оказывает положительное влияние на здоровье и самочувствие человека.
Читать
Владельцу загородного дома приходится выполнять различные виды работ, где невозможно обойтись без лестницы. Это и ремонт дома, и уборка яблок. На каждый случай здесь используется своя лестница. Порой хранить всю эту «коллекцию» лестниц бывает просто негде. Вот и появилась идея сделать универсальную лестницу, которую можно было бы использовать для ремонта кровли и стен, в качестве стремянки, и даже как строительные козлы.
Изобретать здесь ничего не пришлось, т.к. в журнале «Левша» за 1999 год мне встретилась статья Ю. Антонова, где автор подробно рассказывает, как самостоятельно сделать такую универсальную лестницу. Идея оказалась настолько интересной, что, я думаю, она заинтересует читателей моего сайта.
Отсутствие перегрузки функций — это то что мне всегда не нравилось в python. Не то что бы без них невозможно было жить, да и виртуальные методы типа __len__ сглаживают проблему, но все-таки. И пусть есть PEAK.rules, но его синтаксис всегда раздражал. Ну вот как можно без боли смотреть на это:
from peak.rules import abstract, when
@abstract()
def pprint(ob):
"""A pretty-printing generic function"""
@when(pprint, (list,))
def pprint_list(ob):
print "pretty-printing a list"
@when(pprint, (int,))
def pprint_int(ob):
print "pretty-printing an integer"
#......
from peak.rules import abstract, when
@abstract()
def pprint(ob):
"""A pretty-printing generic function"""
@when(pprint, (list,))
def pprint_list(ob):
print "pretty-printing a list"
@when(pprint, (int,))
def pprint_int(ob):
print "pretty-printing an integer"
#......
Во-первых опять нужно придумывать для каждого типа свои имена функций, во-вторых не по-питоновски много лишних нажатий клавиш, даже в С++ это — лишнее: @when(pprint, ( :).
Но как-то ничего принципиально лучше придумать не удавалось. В python 3+ можно будет в конце концов сделать отличную перегрузку методов через метаклассы, но до его массового использования в продакшене пока далековато. И вот недавно, при написании статьи про метаклассы в python 3 и находясь под влияние пересмотра одного видео с последнего pycon-videos, пришла в голову мысль которая оказалась рабочей ( впрочем я бы три раза подумал перед тем как положить такой код в файл, который будет использовать кто-то другой).
Ну собственно угадайте как работает написанное ниже (какая магия зашита в method_overloader.overloadable):
from method_overloader import overloadable
@overloadable()
class A(object):
def overloaded_func(self, x):
"int"
return "Integer func called {0}".format(x)
def overloaded_func(self, x):
"str"
return "String func called {0!r}".format(x)
def overloaded_func(self, x):
"float"
return "Float func called {0!r}".format(x)
def overloaded_func(self, x):
"list"
return "List func called {0!r}".format(x)
t = A()
print "t.overloaded_func(1) =", t.overloaded_func(1)
print "t.overloaded_func('asas') =", t.overloaded_func("asas")
print "t.overloaded_func(1.1) =", t.overloaded_func(1.1)
print "t.overloaded_func([1, 2, 3]]) =", t.overloaded_func([1, 2, 3])
from method_overloader import overloadable
@overloadable()
class A(object):
def overloaded_func(self, x):
"int"
return "Integer func called {0}".format(x)
def overloaded_func(self, x):
"str"
return "String func called {0!r}".format(x)
def overloaded_func(self, x):
"float"
return "Float func called {0!r}".format(x)
def overloaded_func(self, x):
"list"
return "List func called {0!r}".format(x)
t = A()
print "t.overloaded_func(1) =", t.overloaded_func(1)
print "t.overloaded_func('asas') =", t.overloaded_func("asas")
print "t.overloaded_func(1.1) =", t.overloaded_func(1.1)
print "t.overloaded_func([1, 2, 3]]) =", t.overloaded_func([1, 2, 3])
Запускаем —
.........$ python tracer.py
t.overloaded_func(1) = Integer func called 1
t.overloaded_func('asas') = String func called 'asas'
t.overloaded_func(1.1) = Float func called 1.1
t.overloaded_func([1, 2, 3]]) = List func called [1, 2, 3]
Все это на обычном python без подмены механизма импорта, без ковыряния в ast и т.п. Ответы можно на koder.mail@gmail.com.
P.S. Если что — в python2.X метаклассе невозможно узнать что происходило в теле класса, можно только узнать что вышло в итоге, т.е.:
class M(object):
s = 1
s = 2
class M(object):
s = 1
s = 2
в метакласс класса прийдет в качестве словаря класса {s : 2} и узнать что еще было s = 1 в метаклассе нельзя.
Ссылки:
pypi.python.org/pypi/PEAK-Rules
blip.tv/pycon-us-videos-2009-2010-2011
docs.python.org/library/ast.html
Исходники этого и других постов со скриптами лежат тут — github.com/koder-ua. При использовании их, пожалуйста, ссылайтесь на koder-ua.blogspot.com.
Автор: konstantin danilov
При написании не тривиальных приложений возникает вопрос: над какими библиотеками делать еще один абстрактный слой, а над какими — нет? Какие абстракции делать?
Стоит ли делать прослойку над, например, SQLAlchemy? Это же и так прослойка над SQL и DBAPI. Имеет ли смысл делать уровни абстракций над такими достаточно хорошими и отточенными в смысле интерфейсов библиотеками? Читать