Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

python и ленивые(lazy) атрибуты

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

class lazy(object):
        def __init__(self, function):
                self._function = function

        def __get__(self, instance, owner = None):
                if instance == None:
                        return self
                val = self._function(instance)
                setattr(instance, self._function.func_name, val)
                return val

class line(object):
        def __init__(self, line = None):
                self._line = line

        @lazy
        def items(self):
                return self._line.split()

Объяснение: items, коль скоро он декорируется, становится объектом класса lazy, и начинает восприниматься как дескриптор(descriptor). Поэтому __get__, __set__ и __delete__ могут быть определены у класса lazy. Конкретная реализация __get__ вычисляет значение функции и привязывает объект с результатом в качестве атрибута вместо себя на свое имя. Значит, последующие обращения к items — уже не вызов функции, а просто операции со списком, что вернулся при первом вызове.

boost.python

Для сборки чего-либо с использованием boost.python его авторы рекомендуют использовать bjam, угрожая при этом в документации, что если что-то и отвалится, то исключительно по причине не использования оного.

Если не использовать bjam, то существует подсказка для выбора правильных параметров для компиляции и линковки: идем в ./libs/python/example/quickstart и просим bjam -n (т.е. распечатать команды вместо того, чтобы их запускать)

Кроме того, у меня работал вот такой Makefile:
all: test1.so

test1.so: test1.o
 $(CXX) -shared $< -o $@ -lboost_python

test1.o: test1.cpp
 $(CXX) `python-config --includes` -fPIC $< -c -o $@

Внешние скрипты и Django

Когда в следующий раз понадобится запускать какой-то внешний скрипт для облегчения пакетного менеджмента сайтов, пригодится этот пример:

import os
import sys

# укажем путь к нашему django-сайту
sys.path.append('/var/www/mydjango')

# укажем какие настройки следует использовать
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

# импортируем модели
from myapp import models

# используем

Альтернативный вариант, который не предполагает никаких дополнительных изменений в самом скрипте. Просто запустим наш скрипт, установив нужное окружение:

PYTHONPATH=/var/www/mydjango DJANGO_SETTINGS_MODULE=settings python my-script.py

django + lighttpd

Как заставить вместе работать lighttpd и django. Готовый пример конфигурации, которую необходимо складывать в vhosts.d:

$SERVER["socket"] == "0.0.0.0:8888" {
        server.document-root = "/srv/www/django/htdocs"

        url.access-deny = ( "~", ".inc", ".svn/" )

        fastcgi.server = (
                "/dispatch.fcgi" => (
                "main" => (
                        "socket" => "/srv/www/django/run/fcgi.sock",
                        "bin-path" => "/srv/www/django/manage.py runfcgi --pythonpath=/srv/www/django --settings=djangoapp.settings-production method=threaded",
                        "max-procs" => 2,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
                )
                ),
        )

        alias.url = ( "/static" => "/srv/www/django/htdocs", )

        url.rewrite-once = (
                "^(/static.*)$" => "$1",
                "^/favicon\.ico$" => "/static/favicon.ico",
                "^(/.*)$" => "/dispatch.fcgi$1"
        )
}

Предполагается, что проект лежит в /srv/www/django/, где для него существует рабочая версия настроек в файле settings-production.py. lighttpd сам запустит fcgi-сервер в количестве max-procs экземпляров. Опция check-local необходима для того, чтобы отключить проверку существования файлов на локальной машине, которую делает lighttpd; так как запрашиваемые URL существуют лишь в логике django, а не в файловой системе.

Для правильной работы тегов типа {% url %} необходимо добавить строчку FORCE_SCRIPT_NAME = '' в настройки проекта написанного на django, иначе ко всем ссылкам в начало будет добавляться название /dispatch.fcgi.