Default scope of variables

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Jul 4 12:38:28 EDT 2013


On Thu, 04 Jul 2013 15:47:57 +1000, Chris Angelico wrote:

> On Thu, Jul 4, 2013 at 3:32 PM, Steven D'Aprano
> <steve+comp.lang.python at pearwood.info> wrote:
>> Accidental shadowing can be a problem, but I've never heard of anyone
>> saying that they were *forced* to shadow a global they needed access
>> to. Just pick a different name.
> 
> Here's one example of shadowing that comes from a C++ project at work. I
> have a class that represents a database transaction (constructing it
> begins a transaction, it has methods for doing queries, and its
> destructor rolls back). 

When the object finally gets garbage collected, doesn't that mean the 
last transaction will be rolled back?

> There's also a class for a subtransation (same
> thing, but it uses savepoints within the transaction). So to bracket a
> piece of code in a subtransaction, I want to declare a new
> subtransaction object with the same name as the outer transaction
> object, and then dispose of it and "reveal" the original. There will
> always be an object called "trans", and it will always be the
> appropriate transaction to do queries on, but it'll change what it is.

You don't need to introduce such scoping rules for variables for that use-
case. We have namespaces (classes) for that sort of thing :-) 

Python 3.3's ChainMap is probably a better solution, but here's another 
way to get the same sort of behaviour:


def function():
    class Namespace:
        # Set a class attribute.
        trans = Transaction()
    ns = Namespace()
    do_stuff_with(ns.trans)
    # Enter a subtransaction.
    ns.trans = Subtransaction()
    do_stuff_with(ns.trans)
    del ns.trans
    do_stuff_with(ns.trans)


Yes, it looks weird to see ns.trans used immediately after deleting it, 
but that's because it is a weird (or at least unusual) use-case.


-- 
Steven



More information about the Python-list mailing list