Lexical scope: converting Perl to Python
Nick Craig-Wood
nick at craig-wood.com
Sat Jun 13 08:29:35 EDT 2009
Andrew Savige <ajsavige at yahoo.com.au> wrote:
>
> 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?
Either
_private_hash = dict( A=42, B=69)
def public_fn(param):
return _private_hash[param]
Or
def public_fn(param, _private_hash = dict( A=42, B=69)):
return _private_hash[param]
Is probably the pythonic equivalents. Note that private_hash starts
with an underscore which means it won't be exported from a module by
default and it is a convention that it is private and shouldn't be
fiddled with. I'd probably go with the latter of the two examples.
--
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick
More information about the Python-list
mailing list