Steven D'Aprano wrote:

Because of
Python's interpreted nature, names can't be compiled away as in C, they
need a concrete runtime existence, but does the language definition need
to assume that?

Of course. It wouldn't be Python if they didn't. However, remember that objects don't have names.

Actually, Python pretty much does compile away names for function bodies. (They are replaced by array indexes.) It only needs to manifest them for locals(). CPython Dis.dis also accesses them, but that is obviously implementation specific. I suspect that the names are stored as C char sequences rather than as Python string objects unless and until the latter are needed for locals().

...
class EqualsAll(object):
...     def __eq__(self, other):
...             return True
...
5 == EqualsAll()
True


The methods of 5 don't even get called.

Why do you say that? As I read the manual, type(left-operand).__eq__ is called first.

This of course is a special case, because 5 is a built-in,

If true, this would be CPython-specific optimization, not language definition.

> but in general, the result of x==y depends on  *both* x and y.

True.  But type(x) gets first crack at the answer.

...
You're assuming that == compares values, which is often a safe assumption, but not always.

The default is to compare by identity, so assuming otherwise is only safe when one knows the classes of x and y to over-ride the default.

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to