[pypy-dev] Looking into numpy ndarray.flags.writeable

Eli Stevens (Gmail) wickedgrey at gmail.com
Thu May 19 16:36:52 EDT 2016


Looks like I need to do something along the lines of:

    def descr_set_writeable(self, space, w_value):
        if space.is_true(w_value) != bool(self.flags & NPY.ARRAY_WRITEABLE):
            self.flags ^= NPY.ARRAY_WRITEABLE

(Though I probably need more robust checking to see if the flag *can*
be turned off)

    def descr_setitem(self, space, w_item, w_value):
        # This function already exists, but just contains the last
line with the raise
        key = space.str_w(w_item)
        value = space.bool_w(w_value)
        if key == "W" or key == "WRITEABLE":
            return self.descr_set_writeable(space, value)
        raise oefmt(space.w_KeyError, "Unknown flag")

...
    writeable = GetSetProperty(W_FlagsObject.descr_get_writeable,
W_FlagsObject.descr_set_writeable),

However I'm not entirely confident about things like space.bool_w,
etc. I've read http://doc.pypy.org/en/latest/objspace.html but am
still working on internalizing it.

Setting the GetSetProperty still results in the TypeError, which makes
me wonder how to tell if I'm getting the right flagsobj.py. I don't
think that I am. The results of the tests should be the same no matter
what python interpreter I'm using, correct? Would running the tests
with a virtualenv that has a stock pypy/numpy installed cause issues?
What if the virtualenv is cpython?

When I run py.test, I see:

pytest-2.5.2 from /Users/elis/edit/play/pypy/pytest.pyc

Which looks correct (.../play/pypy is my source checkout). But I get
the same thing when using cpython to run test_all.py, and there the
test passes, so I don't think it's indicative. When I print out
np.__file__ inside the test, I get

    /Users/elis/venv/droidblue-pypy/site-packages/numpy/__init__.pyc

Which is the pypy venv I am using to run the tests in the first place,
but I'm not sure what the on-disk relationship between numpy and
micronumpy actually is. Is there a way from the test_flagobjs.py file
to determine what the on-disk location of micronumpy is?

I strongly suspect I've got something basic wrong. I also think that
the information at
http://doc.pypy.org/en/latest/getting-started-dev.html#running-pypy-s-unit-tests
and http://doc.pypy.org/en/latest/coding-guide.html#command-line-tool-test-all
conflict somewhat, or are at least unclear as to which approach is the
right way in what situation. I'll attempt to clarify whatever it is
that's tripping me up once I've got it sorted out.

Some other questions I have, looking at micornumpy/concrete.py line 37:

class BaseConcreteArray(object):
    _immutable_fields_ = ['dtype?', 'storage', 'start', 'size', 'shape[*]',
                          'strides[*]', 'backstrides[*]', 'order', 'gcstruct',
                          'flags']
    start = 0
    parent = None
    flags = 0

Does that immutable status cascade down into the objects, or is that
saying only that myInstance.flags cannot be reassigned (but
myInstance.flags.foo = 3 is fine)?

interpreter/typedef.py 221:

@specialize.arg(0)
def make_objclass_getter(tag, func, cls):
    if func and hasattr(func, 'im_func'):
        assert not cls or cls is func.im_class
        cls = func.im_class
    return _make_objclass_getter(cls)

What's the purpose of the tag argument? It doesn't seem to be used
here or in _make_descr_typecheck_wrapper, both of which are called
from GetSetProperty init. Based on docstrings on _Specialize, it seems
like they might be JIT hints. Is that correct?

Matti: If it's okay, I'd like to keep the discussion on the list, as
I've actively searched through discussions here to avoid asking
questions a second time. Hopefully this thread can help the next
person.

Sorry for the mega-post; thanks for reading.
Eli

On Thu, May 19, 2016 at 8:23 AM, Armin Rigo <arigo at tunes.org> wrote:
> Hi Eli,
>
> On 19 May 2016 at 08:58, Eli Stevens (Gmail) <wickedgrey at gmail.com> wrote:
>> I've got a pypy clone and checkout, and have added TestFlags. When I
>> run it, I see:
>>
>>>       a.flags.writeable = False
>> E       TypeError: readonly attribute
>>
>> But nothing that looks like it should raise a TypeError in either of:
>
> Grep for 'writable'.  You'll see that it is defined as a
> GetSetProperty() with a getter but no setter so far.
>
>
> A bientôt,
>
> Armin.


More information about the pypy-dev mailing list