[Cython] memoryview slices can't be None?

mark florisson markflorisson88 at gmail.com
Tue Feb 7 23:21:38 CET 2012

On 5 February 2012 22:03, mark florisson <markflorisson88 at gmail.com> wrote:
> On 2 February 2012 21:38, Dag Sverre Seljebotn
> <d.s.seljebotn at astro.uio.no> wrote:
>> On 02/02/2012 10:16 PM, mark florisson wrote:
>>> On 2 February 2012 12:19, Dag Sverre Seljebotn
>>> <d.s.seljebotn at astro.uio.no>  wrote:
>>>> I just realized that
>>>> cdef int[:] a = None
>>>> raises an exception; even though I'd argue that 'a' is of the "reference"
>>>> kind of type where Cython usually allow None (i.e., "cdef MyClass b =
>>>> None"
>>>> is allowed even if type(None) is NoneType). Is this a bug or not, and is
>>>> it
>>>> possible to do something about it?
>>>> Dag Sverre
>>>> _______________________________________________
>>>> cython-devel mailing list
>>>> cython-devel at python.org
>>>> http://mail.python.org/mailman/listinfo/cython-devel
>>> Yeah I disabled that quite early. It was supposed to be working but
>>> gave a lot of trouble in cases (segfaults, mainly). At the time I was
>>> trying to get rid of all the segfaults and get the basic functionality
>>> working, so I disabled it. Personally, I have never liked how things
>> Well, you can segfault quite easily with
>> cdef MyClass a = None
>> print a.field
>> so it doesn't make sense to slices different from cdef classes IMO.
>>> can be None unchecked. I personally prefer to write
>>> cdef foo(obj=None):
>>>     cdef int[:] a
>>>     if obj is None:
>>>         obj = ...
>>>     a = obj
>>> Often you forget to write 'not None' when declaring the parameter (and
>>> apparently that it only allowed for 'def' functions).
>>> As such, I never bothered to re-enable it. However, it does support
>>> control flow with uninitialized slices, and will raise an error if it
>>> is uninitialized. Do we want this behaviour (e.g. for consistency)?
>> When in doubt, go for consistency. So +1 for that reason. I do believe that
>> setting stuff to None is rather vital in Python.
> Yeah I think we should go back to this discussion :) Checking for None
> and allowing slices to be None is simply  very convenient, and doesn't
> involve any drastic changes. I was never really against it, I just
> never got around to implementing it.

We should now be able to use None memoryview slices:

They also coerce back to None when coercing to object.

>> What I typically do is more like this:
>> def f(double[:] input, double[:] out=None):
>>    if out is None:
>>        out = np.empty_like(input)
>>    ...
>> Having to use another variable name is a bit of a pain. (Come on -- do you
>> use "a" in real code? What do you actually call "the other obj"? I sometimes
>> end up with "out_" and so on, but it creates smelly code quite quickly.)
>> It's easy to segfault with cdef classes anyway, so decent nonechecking
>> should be implemented at some point, and then memoryviews would use the same
>> mechanisms. Java has decent null-checking...
>> Dag Sverre
>> _______________________________________________
>> cython-devel mailing list
>> cython-devel at python.org
>> http://mail.python.org/mailman/listinfo/cython-devel

More information about the cython-devel mailing list