[Tutor] Perl vs. Python's way of handling references.

Michael Janssen Janssen@rz.uni-frankfurt.de
Fri Apr 11 20:46:02 2003


On Fri, 11 Apr 2003, Scott Chapman wrote:

> I wasn't trying to show the list anything relating to Perl vs. Python.  I was
> demonstrating how Perl does references and how Python does them.  The Perl
> advocate on the Perl Tutorial list was the fellow I was quoting on the
> original post.  He said that you must use vars() in python to do the trick
> like you do in Perl with it's reference syntax.  He said that this is a
> drawback to Python when you get into deeply nested structures.
>
> I wanted some opinions from the Python list as to whether or not this is a
> drawback or not from a Python programmers perspective and if there are any
> easier solutions than using vars() or eval() that might work better for
> deeply nested structures, or is there a better way to do the data structures
> altogether.

eval() and ${ } is both as simple, isn't it?


##What happens actually?

d1 = {"a": "one"} set up a string value "one" for a string key "a".

*given* that "one" is a variable (in global namespace) you can do:

eval(d1["a"])
eval("one")
---> eval() evaluates the python expression "one" in global namespace.

vars()[d1["a"]]
vars()["one"]
---> this looks up "one" in a dictionary returned by vars() (try
"print vars()" to get an impression what vars() does).


But although you *can* do it, this is not the python way of handling data.
In other words: you seldom find a python scripts that relies on this kind
of hack. Honest: The best way to reduce problems with eval()/vars() is to
reduce its usage no matter how deep you data structure is.


##Deep data structure with strings to call related variables with eval()

[Disclaimer: this is a complete test scenario. This is *not* the way you
should wite python scripts]

# data at the bottom.
one = 1
two = 2

# a collection
aDict = {1: "one", 2:"two"}

# next level of nesting (upper)
caller = "aDict"

# next level of nesting (deeper)
DeepDict = {"wert": "asdf"}
three = "DeepDict"
aDict[3] = "three"


----> is this what you have meant (If not you should provide your own
example, because it's very likly that no python programmer can provide
one from her/his background)?

eval(eval(caller)[1]) --> 1

eval(eval(caller)[3]) --> "three"
eval(eval(eval(caller)[3]))["wert"] --> "asdf"

Beside the need to count the amount of evals, I can't see a problem with
call-data-not-by-name-but-with-eval(string).

Note: hopefully nobody actually does this.

##

It's not clear to me, what's the subject of the example:
A) the way of retrieving data from deep-nested structures?
B) the effect that "one" is modified and the updated value is found via
   ${ %dict{a} }?

A): python does it another way. Shall we give you some examples?
B): why modify a value and retrieve it from somewhere else? When you want
to organize "shared data" you propably better organize it with classes.

Michael