В настоящей версии модуль расширения на 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):
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