Сообщения

Сообщения за июль, 2017

Область видимости и замыкания в Python

Прежде чем переменной можно будет воспользоваться, ей необходимо присвоить значения. Область видимости переменной определяется местом, где ей было присвоено значение. Правило LEGB L ocal локальная область функции E nclosing область внешней функции G lobal глобальное пространство B uilt-in встроенном (модуль builtis) Если не указаны инструкции, то поиск переменных по пространствам имен происходит с низу верх local->enclosing->global->built-in x = 10 print ( 'Global x =' , x) def fun_enclosing (): print ( 'Enclosing x =' , x) def fun_local (): print ( 'Local x =' , x) fun_local() fun_enclosing() Global x = 10 Enclosing x = 10 Local x = 10 Любое присвоение переменной в функции создает новую локальную переменную x = 10 print ( 'Global x =' , x) def fun_enclosing (): x = 20 # создания новой переменной в пространстве имен fun_enclosing print ( 'Enclosing x =' , x) de

UnicodeDecodeError при pip install в rus Windows

Если при установки пакета возникает UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 3: invalid continuation byte Находим файл lib\site-packages\pip\compat\__init__.py Ориентировочно на 71 строке находим функцию console_to_str(s) В консоли вводим команду chcp . К примеру она показала  866 В функции console_to_str(s) меняем return s.decode(' utf_8 ') на return s.decode(' 866 ')

Кратко про SQLAlchemy Core

SQLAlchemy Engine это слой абстракции над DB-API. Он содержит DB-API драйвера для разных СУБД, их можно указать в строке подключения. Engine.execute() и Engine.connect() два основных метода. Так же у него есть свой пул соединений. create_engine() - фабричная функция для создания Engine. Metadata это логическая структура базы данных. Она содержит список таблиц(Table), их отношения и другие объекты. Table абстракция таблицы. Содержит колонки(Column) и другие свойства. Таким образом можно иметь одновременно несколько engine с разными драйверами и коннектами, разные metadata, и совместно их использовать. примеры на github from sqlalchemy import MetaData, Table , Column , Integer , Numeric , String, DateTime from datetime import datetime metadata = MetaData() users = Table ( 'users' , metadata, Column ( 'user_id' , Integer (), primary_key = True ), Column ( 'username' , String( 15 ), nullable = False , unique = True ),

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

Фактически это конспект 37 главы книги Марка Лутца "Изучаем Python" Код на  github Управления доступом к атрибутам в Python может осуществляться несколькими способами: __getattr__ __set__ __getattribute__ __delete__ property дескриптор property и дескрипторы применяются к отдельным атрибутам. Свойства attribute = property(fget, fset, fdel, doc) Все аргументы по умолчанию None, при обращение приводят к исключению Примеры # пример использования property # attribute = property(fget, fset, fdel, doc) class Person : def __init__ ( self , name): self . _name = name def get_name ( self ): return self . _name def set_name ( self , name): self . _name = name def del_name ( self ): print ( 'del name' , self . name) del self . _name name = property (get_name, set_name, del_name) class SubPerson (Person): pass bob = Person( 'bob' ) print (bob . name) bob . name = &

Асинхронное выполнение процедур или триггера в MS SQL Server

После изменений данных иногда требуется дополнительно произвести какие то действия, это может быть пересчет каких то агрегаций, отправка сообщения и пр. Процессу вносившему изменения как правило важно знать только результат транзакции и не очень интересно ожидать выполнения дополнительных операций. Асинхронный вызов можно организовать через очередь. В следующий раз напишу как это сделать через обычную таблицу и job, а сегодня о компоненте Service Broker. У Service Broker много возможностей, он позволяет взаимодействовать и между сервера, но местами не так удобен и гибок, в итоге часто эффективней выносить такую логику за СУБД. Но для простых и понятных задач вполне годная штука. 1. Создаем БД IF DB_ID (N 'DB_001' ) IS NOT NULL DROP DATABASE DB_001; GO CREATE DATABASE DB_001 2. Включаем Service Broker ALTER DATABASE [DB_001] SET ENABLE_BROKER with rollback IMMEDIATE ; 3. Создаем два типа сообщений CREATE MESSAGE TYPE [AsyncRequest] VA