[Python-Dev] misbehaving contains (original) (raw)

Guido van Rossum guido at python.org
Tue Jan 22 20:55:19 CET 2008


The issue is that the sq_contains slot is defined as returning an int, while the tp_richcompare slot is defined as returning a PyObject *.

Your first opportunity for changing this will be Py3k. Please submit a patch!

On Jan 22, 2008 11:26 AM, tomer filiba <tomerfiliba at gmail.com> wrote:

i'm using python to create expression objects, for more intuitive usage as predicates, for instance: x = (Arg(0) > 17) & (Arg(1).foo == "bar") instead of x = And(Gt(Arg(0), 17), Eq(GetAttr(Arg(1), "foo"), "bar"))

so now i can use x.eval(18, "spam") and get the result of the expression. i'm doing it by overriding all the operators to return expression objects, instead of evaluating the result immediately. it works fine, but i encountered a problem with making contains behave so. it turns out contains coerces the return value into a bool. this might seem logical at first, but is not consistent with the result of the language. consider the following code: >>> class Foo(object): ... def contains(self, key): ... return 17 ... def eq(self, other): ... return 19 ... >>> >>> f=Foo() >>> f == 8 19 >>> 8 in f True as you can see, eq does not coerces the result to bool, so why should contains do that? i've looked at PySequenceContains in objects/abstract.c, but i can't quite understand where the coercion is made. is because the function is typed as int? if so, i believe it should either be changed to PyObject, or have cmpoutcome (in ceval.c) not use this API directly, and rather return the result as it is returned from contains. i see no reason it should behave differently than eq and the rest of comparison operators.

-tomer


Python-Dev mailing list Python-Dev at python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list