2015-03-04 1 views
2

Я сейчас работаю над классом Session, который следует запускать как нормально, так и с помощью инструкции with. Я также должен поделиться некоторыми псевдо-глобальное значение для каждой сессии:Метод Python @contextmanager, который имитирует метод открытых файлов?

session1 = Session(a, b ,c) 
session2 = Session(x, y, z) 
session1.start() 
# Using session1 with a global value here 

with session2.start(): 
    # Using session2 with global value copy 

# Coming back in session1 with the initial global value 

Для управления глобальной ценности вещи, я в конечном итоге с помощью Contextual библиотеки. (https://pypi.python.org/pypi/Contextual).

Чтобы управлять start() как @contextmanager, я пытался разобраться с стекю Python. Но я знаю, что это может быть сложно в зависимости от версии Python и интерпретатора.

Я хотел бы сделать то же самое, как open(), которые вы можете использовать оба способа:

f = open('...') 
with open('...') as f: 
    # Read the file here. 

Возможно ли это? Как вы это делаете?

Спасибо за ваши идеи!

+0

Как вы обращаетесь к этим глобальным ценностям? Кроме того, ваш пример с использованием 'open' приведет к тому, что исходное значение f будет перезаписано оператором with и будет забыто. То есть значение f после оператора with является закрытым вторым файлом, а не открытым первым. – Dunes

+0

Это не похоже на '@ contextmanager', но вы можете реализовать' __enter __/__ exit__' в классе сеанса (так оно делается для файлов). – bereal

ответ

2

Я не думаю, что это возможно с @contextmanager, но вы можете сделать свой Session класс менеджер контекста прямо так:

class Session: 
    # ... 
    def __enter__(self): 
     return self 

    def __exit__(self, exc_type, exc_value, traceback): 
     self.close() 
    #... 

Подробности here. Вот как это делается для файлов. Для 3-х партийных классов также может оказаться полезным contextlib.closing.

Смежные вопросы