JuliaPy / JuliaPy/PyCall.jl

Passing wrapped julia objects with pyfunction and pyfunctionret

Aperta
#1,013 0 commenti 1 reazione 0 assegnatari Vedi su GitHub
Lingua principale
Julia
Stelle
1.5k
Fork
186
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

For performance reasons I would like to wrap Julia functions I am using in Python with the `PyCall.pyfunctionret` and `PyCall.pyfunction` wrappers. One of my Julia functions returns an object that is explicitly not converted to a python object using the `PyCall.pyfunctionret` function. Now I would like to pass this object back into Julia and wrap the function with the `PyCall.pyfunction` wrapper.

The following example works, but from my understanding it does not actually benefit much from using the `pyfunction` wrapper, since I have to use the `PyAny` type and PyCall would still have to infer the type of the object. I would like to specify something more specific than `PyAny` in my call to `pyfunction`.

So I have this in julia:
```
function example(firstnumber, secondnumber)
return Float64[firstnumber, secondnumber]
end

function useobject(obj::Vector{Float64})
println("this is the object:", obj)
end
```

And in python:
```
from julia import Main
Main.eval('using PyCall; include("juliafunctions.jl")')

jl_function = Main.eval("pyfunctionret(example, Any, Float64, Float64)")

# These two work as expected - the first returns a converted python object
# (which is a numpy array in this case) and the second returns a simple
# wrapped julia object.
python_object = Main.example(1, 2)
jl_object = jl_function(1, 2)

# Now here is my problem. This works, but I would like to replace
# PyAny here, to avoid the automatic type inference pyjulia has to do in
# this case:
jl_secondfunction = Main.eval("pyfunction(useobject, PyAny)")
jl_secondfunction(jl_object)
```
I also tried `pyfunction(useobject, PyObject)` but that just doesn't work at all and I tried `pyfunction(useobject, Any)`, which comes slightly closer to what I want because it passes the wrapped python object into Julia. However, that fails since it doesn't find the correct method for type PyObject.

My questions are the following:
- Is my understanding of pyfunction and the use of the PyAny type correct, as in that PyCall still needs to infer the type of the passed in object before attempting any conversion?
- Is there a way to pass in the object and have PyCall just unwrap the wrapped julia object? If so what do I need to do to use it? I couldn't figure it out from the documentation

I would be happy to help improving the documentation or adding this feature if it isn't available and if someone could point me in the right direction.

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.