JuliaPy / JuliaPy/PyCall.jl

Operator(+) overloading for PyObject

オープン
#846 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Julia
スター
1.5k
フォーク
186
PR マージ指標
30日以内にマージされた PR はありません

説明

I port my following Python code into using PyPlot:
```julia
import PyPlot

const plt = PyPlot

fig, ax = plt.subplots(facecolor="w", edgecolor="k")

t = 1:24
x = 1:24
y= 24:-1:1
ax.plot(t,x, label="x")
ax2 = ax.twinx()
ax2.plot(t,y, label="y")

lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc="upper left", fontsize=20, ncol = 1)

fig.tight_layout()
plt.show()
```

In `lines + lines2`, I encounter an error:
```
PyError ($(Expr(:escape, :(ccall(#= C:\Users\meta\.julia\packages\PyCall\BcTLp\src\pyoperators.jl:12 =# @pysym(:PyNumber_Add), PyPtr, (PyPtr, PyPtr), a, b)))))
TypeError("unsupported operand type(s) for +: 'Line2D' and 'Line2D'")

Stacktrace:
[1] pyerr_check at C:\Users\meta\.julia\packages\PyCall\BcTLp\src\exception.jl:62 [inlined]
[2] pyerr_check at C:\Users\meta\.julia\packages\PyCall\BcTLp\src\exception.jl:66 [inlined]
[3] _handle_error(::String) at C:\Users\meta\.julia\packages\PyCall\BcTLp\src\exception.jl:83
[4] macro expansion at C:\Users\meta\.julia\packages\PyCall\BcTLp\src\exception.jl:97 [inlined]
[5] + at C:\Users\meta\.julia\packages\PyCall\BcTLp\src\pyoperators.jl:11 [inlined]
[6] _broadcast_getindex_evalf at .\broadcast.jl:648 [inlined]
[7] _broadcast_getindex at .\broadcast.jl:621 [inlined]
[8] getindex at .\broadcast.jl:575 [inlined]
[9] macro expansion at .\broadcast.jl:932 [inlined]
[10] macro expansion at .\simdloop.jl:77 [inlined]
[11] copyto! at .\broadcast.jl:931 [inlined]
[12] copyto! at .\broadcast.jl:886 [inlined]
[13] copy at .\broadcast.jl:862 [inlined]
[14] materialize at .\broadcast.jl:837 [inlined]
[15] broadcast_preserving_zero_d at .\broadcast.jl:826 [inlined]
[16] +(::Array{PyObject,1}, ::Array{PyObject,1}) at .\arraymath.jl:47
[17] top-level scope at In[177]:17
[18] include_string(::Function, ::Module, ::String, ::String) at .\loading.jl:1091
[19] execute_code(::String, ::String) at C:\Users\meta\.julia\packages\IJulia\rWZ9e\src\execute_request.jl:27
[20] execute_request(::ZMQ.Socket, ::IJulia.Msg) at C:\Users\meta\.julia\packages\IJulia\rWZ9e\src\execute_request.jl:86
[21] #invokelatest#1 at .\essentials.jl:710 [inlined]
[22] invokelatest at .\essentials.jl:709 [inlined]
[23] eventloop(::ZMQ.Socket) at C:\Users\meta\.julia\packages\IJulia\rWZ9e\src\eventloop.jl:8
[24] (::IJulia.var"#15#18")() at .\task.jl:356
```

It seems that operator `+` is not appropriately overloaded for PyObject.
I wonder that how to tackle this issue.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

報告された lines + lines2 のケースを再現し、その後 src/pyoperators.jl:11 と、スタックトレースに示されている Julia の配列/ブロードキャスト経路を調査します。これらの PyObject 配列を結合する際の意図されたセマンティクスを判断し、その意図に沿って操作が一貫して動作するようにして完了とします。プロジェクトのテスト構成から適切な場所が特定できる場合は、回帰テストのカバレッジも追加します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
julia, python
領域
tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。