Lexical scope: converting Perl to Python

Andrew Savige ajsavige at yahoo.com.au
Sat Jun 13 07:02:53 CEST 2009

I'd like to convert the following Perl code to Python:

 use strict;
   my %private_hash = ( A=>42, B=>69 );
   sub public_fn {
     my $param = shift;
     return $private_hash{$param};
 print public_fn("A");        # good:  prints 42
 my $x = $private_hash{"A"};  # error: good, hash not in scope

The real code is more complex; the above is a simplified example.

Notice that this code uses Perl's lexical scope to hide the
%private_hash variable, but not the public_fn() function.

While I could convert this code to the following Python code:

 private_hash = dict( A=42, B=69 )
 def public_fn(param):
   return private_hash[param]
 print public_fn("A")     # good:  prints 42
 x = private_hash["A"]    # works: oops, hash is in scope

I'm not happy with that because I'd like to limit the scope of the
private_hash variable so that it is known only inside public_fn.

Of course, I could hide the hash like so:

 def public_fn(param):
   private_hash = dict( A=42, B=69 )
   return private_hash[param]

yet I'm not happy with that either because of the repeated
initialization the hash each time the function is called.

What is the Pythonic equivalent of Perl's lexical scope, as
illustrated by the code snippet above?


      Need a Holiday? Win a $10,000 Holiday of your choice. Enter now.http://us.lrd.yahoo.com/_ylc=X3oDMTJxN2x2ZmNpBF9zAzIwMjM2MTY2MTMEdG1fZG1lY2gDVGV4dCBMaW5rBHRtX2xuawNVMTEwMzk3NwR0bV9uZXQDWWFob28hBHRtX3BvcwN0YWdsaW5lBHRtX3BwdHkDYXVueg--/SIG=14600t3ni/**http%3A//au.rd.yahoo.com/mail/tagline/creativeholidays/*http%3A//au.docs.yahoo.com/homepageset/%3Fp1=other%26p2=au%26p3=mailtagline

More information about the Python-list mailing list