Добавление классов-оберток в простые библиотеки Python

dobavlenie klassov obertok v prostye biblioteki python Интеграция Python/C

В настоящей версии модуль расширения на C экспортирует интерфейс, основанный на функциях, но его функции можно обернуть программным кодом Python, который придаст интерфейсу любой желаемый вид. Например, в примере 20.10 осуществляется доступ к функциям через словарь и реализуется интеграция с объектом os.environ — это гарантирует сохранение объекта в актуальном состоянии даже после внесения изменений вызовом функций нашего расширения на C.

Пример 20.10. PP4E\Integrate\Extend\Cenviron\envmap.py

import os

from cenviron import getenv, putenv # получить методы модуля на C

class EnvMapping: # обернуть классом Python

def __setitem__(self, key, value):

os.environ[key] = value # при записи: Env[key]=value

putenv(key, value) # записать в os.environ

def __getitem__(self, key):

value = getenv(key) # при чтении: Env[key]

os.environ[key] = value # проверка целостности

return value

Env = EnvMapping() # создать один экземпляр

Чтобы задействовать этот модуль, клиенты могут импортировать его объект Env и использовать синтаксис Env[‘var’] обращения к словарям для обращения к переменным окружения. Класс в примере 20.11 делает еще один шаг вперед и экспортирует функции как квалифицированные имена атрибутов вместо вызовов или ключей — он позволяет обращаться к переменным окружения, используя синтаксис Env.var доступа к атрибутам.

Пример 20.11. PP4E\Integrate\Extend\Cenviron\envattr.py

import os

from cenviron import getenv, putenv # получить методы модуля на C

class EnvWrapper: # обернуть классом Python

def __setattr__(self, name, value):

os.environ[name] = value # при записи: Env.name=value putenv(name, value) # записать в os.environ

def __getattr__(self, name):

подпись: при чтении: env.name проверка целостности

подпись: env = envwrapper() подпись: # создать один экземпляр


value = getenv(name) os.environ[name] = value return value

Ниже показано, как действуют наши обертки, опирающиеся на использование функций доступа к переменным окружения из нашего модуля расширения на C. Самое важное, на что следует обратить внимание, это то, что функции расширений можно обернуть самыми разными интерфейсами, реализовав обертки на языке Python в дополнение к расширениям на C:

>>> from envmap import Env

>>> Env[‘USER’]

‘skipper’

>>> Env[‘USER’] = ‘professor’

>>> Env[‘USER’]

‘professor’

>>> 

>>> from envattr import Env

>>> Env.USER

‘professor’

>>> Env.USER = ‘gilligan’

>>> Env.USER

gilligan

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий