Архив рубрики: Python

приватные атрибуты в python

Ну нет приватных членов в питоне, ну нет…
Не надо писать С++/Java подобный код:

class C(object):
    def __init__(self):
        self.__name = 'default'

    def set_name(self, name):

        self.__name = name

    def get_name(self):

        return self.__name

Пробуем
>>>С().__name

Traceback (most recent call last):
  …
    C().__name

AttributeError: C instance has no attribute '__name'

Посмотрим на список атрибутов объекта

>>>С().__dict__
{'_C__name': 'default'}

Ну и в догонку меняем атрибут

>>>С()._C__name = 'new_name'

Двойное подчеркивание всего лишь соглашение, интерпретатор ничего не прячет,

он лишь переименовывает атрибут. То же самое касается и приватных методов, единственно получать новое название метода нужно через dir().

Да и, если хотите управлять доступом к атрибутам, смотрите в сторону свойств.


Ссылки

https://docs.python.org/2/library/stdtypes.html#object.__dict__
http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private

Автор: Евгений Курочкин

ограничение lambda

Ограничение на использование лямбда-выражений

lambda x, y: assert x==y

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

Можно режить конкретную проблему

def assert_eq(x, y): 
    assert x == y

f = lambda x, y: assert_eq(x, y)


Но особого смысла в этом нет, т.к. мы лямбдой просто вызываем новую функцию assert_eq


Ссылки



Автор: Евгений Курочкин

aiopg и SQLAlchemy

Выпустил новую версию aiopg 0.2 — библиотеки для работы с PostgreSQL из asyncio.

aiopg использует асинхронные вызовы и в этом похож на txpostgres и momoko — библиотеки для работы с PostgreSQL под twisted и tornado соответственно.

В новой версии aiopg появилась опциональная поддержка SQLAlchemy Core Expressions.

Проще один раз показать.

Создаем описание структуры базы данных:

import sqlalchemy as sa

metadata = sa.MetaData()

users = sa.Table('users', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String(255)),
sa.Column('birthday', sa.DateTime))

emails = sa.Table('emails', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('user_id', None, sa.ForeignKey('users.id')),
sa.Column('email', sa.String(255), nullable=False),
sa.Column('private', sa.Boolean, nullable=False))

Как видите — две таблицы, связанные отношением один-ко-многим. Для тех, кто не знаком — алхимия позволяет описать любую модель данных, которая только может прийти в голову. Индексы, constraints, пользовательские типы данных такие как array и hstore — тоже.

Теперь нужно сделать engine:

from aiopg.sa import create_engine

engine = yield from create_engine(user='aiopg',
database='aiopg',
host='127.0.0.1',
password='passwd')

engine содержит внутри connection pool.

Для работы с БД нужно получить connection и что-нибудь выполнить:

with (yield from engine) as conn:
uid = yield from conn.scalar(
users.insert().values(name='Andrew', birthday=datetime(1978, 12, 9)))

Обратите внимание: диалект знает о INSERT ... RETURNING и позвращает primary key для вставляемой записи.

Работа с транзакциями:

with (yield from engine) as conn:
tr = yield from conn.begin()

# Do something

yield from tr.commit()

Получение данных:

with (yield from engine) as conn:
res = yield from conn.execute(users.select())
for row in res:
print(res)

Сложный запрос:

with (yield from engine) as conn:
join = sa.join(emails, users, users.c.id == emails.c.user_id)
query = (sa.select([users.c.name])
.select_from(join)
.where(emails.c.private == 0)
.group_by(users.c.name)
.having(sa.func.count(emails.c.private) > 0))

print("Users with public emails:")
ret = yield from conn.execute(query)
for row in ret:
print(row.name)

Вызов SQL функций:

with (yield from engine) as conn:
query = (sa.select([sa.func.avg(sa.func.age(users.c.birthday))])
.select_from(users))
ave = (yield from conn.scalar(query))
print("Average age of population is", ave,
"or ~", int(ave.days / 365), "years")

sa.func.avg и sa.func.age выполняются на стороне SQL сервера.

Полный код примера здесь, документация здесь.

Автор: Andrew Svetlov

Работаем с pip

Думаю, все применяют pip и знают основы:

$ pip install -U sqlalchemy
$ pip install -r requirements.txt
$ pip freeze > requirements.txt
$ pip uninstall sqlalchemy

Давайте посмотрим, что ещё полезного умеет эта команда

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

$ pip install --user pep8

Т.е. если мы не в виртуальном окружении (virtualenv/virtualenvwrapper), то пакет pep8 будет установлен куда-то вроде ~/.local/lib/python3.4/lib.

Главная прелесть метода — не нужны права суперпользователя для установки пакетов (не надо писать sudo pip install ..., К тому же так гораздо аккуратней.

Создаем конфигурационный файл

Т.к. опция --user нужна часто, стоит записать её в конфиге как значение по умолчанию. Создаем файл ~/.pip/pip.conf и пишем в него

[install]
user = true

Готово.

Внимание: user=true не работает с виртуальными окружениями.

Принудительно переустанавливаем пакет

Реальный пример: я поставил pyzmq. Библиотека скачалась и скомпилировалась. Потом я заметил что она скомпилировалась со неправильной версией libzmq. libzmq я переставил, теперь нужно пересобрать pyzmq:

$ pip install -U --force-reinstall pyzmq

Для работы --force-reinstall обязательно нужно указывать -U(--upgrade).

Смотрим на список установленных (доступных) библиотек

$ pip list

Выясняем, какие библиотеки можно обновить

$ pip list -o
$ pip list --outstanding

Для выполнения команды pip неоднократно делает зазыр в интернет, так что придется подождать.

Устанавливаем библиотеку для работы над ней

Находясь в корне проекта, в той же папке где лежит setup.py:

$ pip install -e .

Этот способ лучше вызова

python setup.py develop

хотя бы тем что работает даже если setup.py не использует setuptools.

Установка необязательных зависимостей

Если setup.py содержит extras_requireто дополнительные зависимости можно установить так:

$ pip install -e .[PDF,reST]

Получаем информацию об установленной библиотеке

$ pip show pyflakes

Так можно узнать версию, местонахождение на диске и зависимости.

Ищем в PyPI

msgpack имеет неудобное имя библиотеки (msgpack-python), которое я постоянно забываю.

$ pip search msgpack

покажет список всех пакетов, в названии которых есть msgpack.

Только не делайте:

$ pip search django

Дуплит пару минут, выдает 5754 результата 🙂

Автодополнение

И, наконец, последнее. Я люблю пользоваться bash completion. Чтобы настроить эту удобную штучку для pip выполните:

$ pip completion --bash >> ~/.bashrc

или для zsh:

$ pip completion --zsh >> ~/.zprofile

Как ни странно pip --help стесняется рассказать о том, что у него есть команда pip completion — но оно работает.

Автор: Andrew Svetlov

DevConf 2014

14 июня будет ежегодная конференция разработчиков DevConf 2014.

Там есть и питоновская секция.

Посещал конфу последние четыре года, собираюсь и в этот раз.

Если хотите послушать доклады и пообщаться с коллегами — покупайте билеты.

Желающим выступить — заявки на доклады принимаются еще две недели.

Автор: Andrew Svetlov

Мыслить как программист. Учимся с Python

Представляю вашему вниманию книгу «Мыслить как программист. Учимся с Python», 2-е издание. Это книга для тех, кто хочет научиться программировать. Книга учит программированию, используя язык Python как средство обучения.

Это открытая книга, по аналогии с открытым кодом.

Написанная Джеффри Элкнером (Jeffrey Elkner), Алленом Б. Дауни (Allen B. Downey) и Крисом Мейерсом (Chris Meyers), книга несколько лет использовалась учениками старшей школы как учебное пособие для изучения программирования. За это время она вобрала в себя замечания и дополнения сотен ее читателей. В 2010 — 2012 годах я перевел книгу на русский язык и незначительно переработал ее. Читать