[Edu-sig] On case sensitivity

David Scherer dscherer@cmu.edu
Fri, 4 Feb 2000 12:23:07 -0500


> Actually, I want to create an IDE that is sufficiently aware of the
> syntax that it can tell assignment from use in most cases.

What is the desired behavior in this case?

t = 5
if t<0:
  T = -t
print t

It seems that T should be corrected to t, but in that case there is little
need to distinguish assignment from use.

Separately, I think the following heuristic would be valuable (and does
require the distinction):  Assignment to a variable which is never used
should generate a warning in the IDE.  This helps with a vast class of
typographical errors which are not limited to case errors.

A single typo in use will usually generate an exception:

position = 5
position = posiiton + 1  # error
print position

At present, though, a typo in an lvalue is silently ignored:

position = 5
posiiton = position + 1  # silent failure
print position

> It would parse the module source code (caching results to make the
> time expenditure acceptable).

Reasonable, provided it can deal successfully with dynamic importing
(worst-case is acceptable, but see below).

> For extension modules it could simply
> import the module and report the names it defines.  We may also create
> special interface description files in a dialect of Python to describe
> extensions; the work being done in the Python type-sig on optional
> static typing is relevant here.

Importing a module might have side effects.  One thing I think is axiomatic
is that the IDE must not crash.  Never ever ever, no matter what the user
program does.  If a program loads itself or another broken program as a
module, the IDE must not go off trying to solve the halting problem.

> This is not very common (usually the from M import * is executed
> unconditionally) so it will rarely be a problem.  The IDE could always
> compute a worst case outcome.

Even worst-case is hard when there are calls to __import__ like this
(somewhere obscure in \python\Lib):

for _name in _names:
    try:
        _mod = __import__(_name)
    except ImportError:
        continue
    if not _defaultmod:
        _defaultmod = _mod
    _errors.append(_mod.error)

Fortunately, these symbols will not end up in the global namespace unless
the user takes extraordinary measures.  There are cases where they can, like
os.py:

elif 'nt' in names:
    from nt import *
    for i in ['_exit']:
        try:
            exec "from nt import " + i
        except ImportError:
            pass

The standard libraries could be special-cased or altered; the real worry is
something like an extension module that does this sort of thing in C.  I
doubt that's very common, but the IDE can never prove that an identifier is
undefined.

It would be nice to say, "if the IDE can't figure out a module, it just
doesn't do case correction in that module's namespace."  The presence of
from ... import * breaks this approach.

OTOH, it is probably not an entirely bad thing to encourage people to avoid
from ... import * for modules that define names dynamically!

Dave Scherer

p.s.  I just read Gerrit's post, and the point about the

foo = Foo()

idiom is disturbing.  What can the IDE do about that?