[Python-Dev] A few small issues
Ka-Ping Yee
ping@lfw.org
Tue, 27 Feb 2001 03:53:08 -0800 (PST)
Hi. Here are some things i noticed tonight.
1. The error message for UnboundLocalError isn't really accurate.
>>> def f():
... x = 1
... del x
... print x
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 4, in f
UnboundLocalError: local variable 'x' referenced before assignment
>>>
It's not a question of the variable being referenced "before
assignment" -- it's just that the variable is undefined. Better
would be a straightforward message such as
UnboundLocalError: local name 'x' is not defined
This message would be consistent with the others:
NameError: name 'x' is not defined
NameError: global name 'x' is not defined
2. Why does imp.find_module('') succeed?
>>> import imp
>>> imp.find_module('')
(None, '/home/ping/python/', ('', '', 5))
I think it should fail with "empty module name" or something similar.
3. Normally when a script is run, it looks like '' gets prepended to
sys.path so that the current directory will be searched. But if
the script being run is a symlink, the symlink is resolved first to
an actual file, and the directory containing that file is prepended
to sys.path. This leads to strange behaviour:
localhost[1004]% cat > spam.py
bacon = 5
localhost[1005]% cat > /tmp/eggs.py
import spam
localhost[1006]% ln -s /tmp/eggs.py .
localhost[1007]% python eggs.py
Traceback (most recent call last):
File "eggs.py", line 1, in ?
import spam
ImportError: No module named spam
localhost[1008]% python
Python 2.1a2 (#23, Feb 11 2001, 16:26:17)
[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> import spam
>>>
(whereupon the confused programmer says, "Huh? If *i* could
import spam, why couldn't eggs?"). Was this a design decision?
Should it be changed to always prepend ''?
4. As far as i can tell, the curses.wrapper package is inaccessible.
It's obscured by a curses.wrapper() function in the curses package.
>>> import curses.wrapper
>>> curses.wrapper
<function wrapper at 0x80ebe14>
>>> import sys
>>> sys.modules['curses.wrapper']
<module 'curses.wrapper' from '/home/ping/dev/python/dist/src/Lib/curses/wrapper.pyc'>
I don't see any way around this other than renaming curses.wrapper.
-- ?!ng
"If I have not seen as far as others, it is because giants were standing
on my shoulders."
-- Hal Abelson