JuliaPy / PythonCall.jl

Python and Julia in harmony.
https://juliapy.github.io/PythonCall.jl/stable/
MIT License
717 stars 61 forks source link

Single-index access to matrix results in confusing error #432

Open PhilReinhold opened 6 months ago

PhilReinhold commented 6 months ago

Affects: JuliaCall

Describe the bug

from juliacall import Main as jl
z = jl.seval("[0 1; 2 3]")
z[0]

results in the stack trace

File ~/.julia/packages/PythonCall/wXfah/src/jlwrap/array.jl:310, in __getitem__(self, k)
    308     return bool(len(self))
    309 def __getitem__(self, k):
--> 310     return self._jl_callmethod($(pyjl_methodnum(pyjlarray_getitem)), k)
    311 def __setitem__(self, k, v):
    312     self._jl_callmethod($(pyjl_methodnum(pyjlarray_setitem)), k, v)

JuliaError: "an error occurred while setting an error"

I would expect z[0] to have the same output as list(z)[0]. The latter outputs just 0. Fair enough if you want to choose a different semantics though, since z[0,:] is another reasonable choice. Regardless, the error message is confusing as it stands.

Your system

cjdoris commented 6 months ago

The particular error message you're seeing is a bug. As it says, it tried to throw a different (better) error, but that failed for some reason so it threw this generic message instead. I can look into why.

However its correct that z[0] is disallowed for matrices - there is no standard convention for what that should mean (Julia and numpy return very different things) so this package defines neither.

You can wrap the array with numpy.asarray(z) if you'd like to use numpy's behaviour.