Re: [Zope-dev] when did transaction lose the ability to be usable as a context manager?

2013-02-06 Thread Duncan Booth
Chris Withers ch...@simplistix.co.uk wrote:

 Hi All,
 
 I used to do this:
 
  import transaction
  with transaction:
 ...   print 'hello'
 ...
 Traceback (most recent call last):
File console, line 1, in module
 AttributeError: __exit__
 
 When did that stop working and what should I now do instead?
 
 cheers,
 
 Chris
 

You can use pure hackery to work around this:
- t.py -
def __enter__(*args):
print 'enter', args

def __exit__(*args):
print 'exit', args

def fixup():
import sys, types
self = sys.modules[__name__]
mymod = type(__name__, (types.ModuleType,), globals())
sys.modules[__name__] = mymod(__name__)
fixup()


-- t1.py ---
#!python2.7
import t
with t:
print transaction


and the output is:

C:\Tempt1.py
enter (module 't' (built-in),)
transaction
exit (module 't' (built-in), None, None, None)

This is hackery though, and watch out for globals as the globals() dict 
known to the functions in t.py is no longer the same dict visible to 
modules that import it so changes to one won't be visible in the other 
and any functions in the module will behave like methods (so you have to 
give them a 'self' parameter).

Much better just to change the code to define an object and import that 
from the module.

___
Zope-Dev maillist  -  Zope-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists -
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] when did transaction lose the ability to be usable as a context manager?

2013-02-06 Thread Wichert Akkerman

On Feb 6, 2013, at 11:54 , Duncan Booth duncan.bo...@suttoncourtenay.org.uk 
wrote:

 Chris Withers ch...@simplistix.co.uk wrote:
 
 Hi All,
 
 I used to do this:
 
 import transaction
 with transaction:
 ...   print 'hello'
 ...
 Traceback (most recent call last):
   File console, line 1, in module
 AttributeError: __exit__
 
 When did that stop working and what should I now do instead?
 
 cheers,
 
 Chris
 
 
 You can use pure hackery to work around this:
 - t.py -
 def __enter__(*args):
print 'enter', args
 
 def __exit__(*args):
print 'exit', args
 
 def fixup():
import sys, types
self = sys.modules[__name__]
mymod = type(__name__, (types.ModuleType,), globals())
sys.modules[__name__] = mymod(__name__)
 fixup()

You can also use the transaction manager directly instead of the bound methods 
transaction lifts out of it:

import transaction
with transaction.manager:
pass

Wichert.
___
Zope-Dev maillist  -  Zope-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists -
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] when did transaction lose the ability to be usable as a context manager?

2013-02-06 Thread Chris Withers

On 06/02/2013 11:47, Wichert Akkerman wrote:


You can also use the transaction manager directly instead of the bound methods 
transaction lifts out of it:

import transaction
with transaction.manager:
 pass


yeah, this is what I'll do.

Chris

--
Simplistix - Content Management, Batch Processing  Python Consulting
- http://www.simplistix.co.uk
___
Zope-Dev maillist  -  Zope-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists -
https://mail.zope.org/mailman/listinfo/zope-announce
https://mail.zope.org/mailman/listinfo/zope )