Passing wrapped julia objects with pyfunction and pyfunctionret
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Comece rastreando os pontos de entrada PyCall.pyfunction e PyCall.pyfunctionret, concentrando-se no comportamento de PyAny, PyObject e do objeto Julia encapsulado descrito no exemplo. Determine se o desencapsulamento é compatível; considera-se concluído quando houver uma invocação documentada que aceite o Vector{Float64} encapsulado ou uma implementação delimitada com testes cobrindo este caminho de chamada.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- Julia
- Estrelas
- 1.5k
- Forks
- 186
- Merge médio
- 7d 10h
- PRs com merge (30d)
- 2
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de JuliaPy/PyCall.jl
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 35/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 25/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 20/100
Todas as issues de JuliaPy/PyCall.jl
Issues semelhantes
-
backport 1.14 GC
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
JuliaDiff/TaylorSeries.jl#445 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
control-toolbox/CTActions#139 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
SciML/Optimization.jl#1448 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
SciML/PETScDiffEq.jl#362 ·
Mantenedores costumam responder em até 1 dia