[Tutor] DATA TYPES
Kent Johnson
kent37 at tds.net
Wed Feb 20 22:21:40 CET 2008
Michael Langford wrote:
>you can
> print out the type of the local variables at the end of your
> functions.
>
> i.e.:
>
> for var in locals().copy():
> print "varname: %s type: %s" (var,type(var))
I was thinking more or less along the same lines, but
- you don't need the copy()
- locals is a dict mapping names to values, so something like
for name, value in locals().iteritems():
print "varname: %s type: %s" (name,type(value))
would work better
- Since the OP is trying to find cases where the same variable is
assigned different types, presumably in a single scope, checking just at
the end of a function won't help.
> After you've done that, you can see what type is referred to by each
> name at the end of the function, then with some unit tests you should
> be able to tell if you temporarily changed to a different data type in
> the middle. If nothing else, you should be able to write the unit
> tests in jython/cpython compatable code so you don't have to write
> them twice.
Not sure how you would do that with unit tests?
> Or you can absolutely litter your code with this loop and
> go through the output for lines that are wrong.
That is basically what you could do with settrace(). Rather than
printing a bunch of output, perhaps maintaining a dict that maps name to
a set of types would work. settrace() notifies it's target when a scope
is entered or exited so you could monitor values in each scope
separately. It gets tricky though, with things like this:
def square(x):
return x*x
square(1) # x is an integer
square(1+1j) # x is a complex number
or
def foo():
for i in range(3):
print i # integer
for j in range 3:
i = j/2.0 # different type in a different block but same scope
print i # float, is this an error?
Bottom line: if you can define clearly what you want, there is probably
a way to get it with settrace() and locals() but it is not a simple problem.
Kent
More information about the Tutor
mailing list