Skip to content

Commit d242b1c

Browse files
committed
Register conversion rules in owning modules
1 parent e8af3f2 commit d242b1c

7 files changed

Lines changed: 106 additions & 49 deletions

File tree

src/Convert/Convert.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import ..PythonCall:
2121
pyconvert
2222

2323
export pyconvert_isunconverted,
24-
pyconvert_add_rule_high_priority,
2524
pyconvert_result,
2625
pyconvert_result,
2726
pyconvert_tryconvert,
@@ -40,6 +39,7 @@ function __init__()
4039
init_ctypes()
4140
init_numpy()
4241
init_pandas()
42+
init_pyconvert_canonical()
4343
end
4444

4545
end

src/Convert/numpy.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ const NUMPY_SIMPLE_TYPES = [
9999

100100
function init_numpy()
101101
# simple numeric scalar types
102+
priority = 1
102103
for (t, T) in NUMPY_SIMPLE_TYPES
103104
isbool = occursin("bool", t)
104105
isint = occursin("int", t) || isbool
@@ -142,27 +143,27 @@ function init_numpy()
142143
pyconvert_rule_timedelta64)
143144
pyconvert_add_rule("numpy:timedelta64", Missing, Missing, pyconvert_rule_timedelta64)
144145
pyconvert_add_rule("numpy:timedelta64", Nothing, Nothing, pyconvert_rule_timedelta64)
145-
end
146-
147-
function init_numpy_high_priority()
148146
for (t, T) in NUMPY_SIMPLE_TYPES
149147
pyconvert_add_rule_high_priority(
150148
"numpy:$t",
151149
T,
152150
Any,
153151
pyconvert_rule_numpysimplevalue{T,true}(),
152+
priority,
154153
)
155154
end
156155
pyconvert_add_rule_high_priority(
157156
"numpy:datetime64",
158157
DateTime64,
159158
Any,
160159
pyconvert_rule_datetime64,
160+
priority,
161161
)
162162
pyconvert_add_rule_high_priority(
163163
"numpy:timedelta64",
164164
TimeDelta64,
165165
Any,
166166
pyconvert_rule_timedelta64,
167+
priority,
167168
)
168169
end

src/Convert/pandas.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ pyconvert_rule_pandas_na(::Type{Nothing}, x::Py) = pyconvert_return(nothing)
22
pyconvert_rule_pandas_na(::Type{Missing}, x::Py) = pyconvert_return(missing)
33

44
function init_pandas()
5-
pyconvert_add_rule("pandas.api.typing:NAType",
5+
pyconvert_add_rule_high_priority(
6+
"pandas.api.typing:NAType",
67
Missing,
78
Any,
8-
pyconvert_rule_pandas_na)
9+
pyconvert_rule_pandas_na,
10+
0,
11+
)
912
pyconvert_add_rule("pandas.api.typing:NAType", Nothing, Nothing, pyconvert_rule_pandas_na)
1013
end

src/Convert/pyconvert.jl

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ function pyconvert_add_rule_high_priority(
6363
type::Type,
6464
scope::Type,
6565
func::Function,
66+
priority::Int,
6667
)
6768
@nospecialize type scope func
6869
type <: scope || throw(
@@ -75,7 +76,7 @@ function pyconvert_add_rule_high_priority(
7576
type,
7677
scope,
7778
func,
78-
typemax(Int) - length(PYCONVERT_RULES),
79+
typemax(Int) ÷ 2 + priority * (typemax(Int) ÷ 16) - length(PYCONVERT_RULES),
7980
),
8081
)
8182
empty!.(values(PYCONVERT_RULES_CACHE))
@@ -400,50 +401,69 @@ function init_pyconvert()
400401
end
401402

402403
function init_pyconvert_canonical()
403-
pyconvert_add_rule("types:NoneType", Nothing, Any, pyconvert_rule_none)
404-
pyconvert_add_rule("builtins:bool", Bool, Any, pyconvert_rule_bool)
405-
pyconvert_add_rule("builtins:float", Float64, Any, pyconvert_rule_float)
406-
pyconvert_add_rule(
404+
priority = 0
405+
pyconvert_add_rule_high_priority("types:NoneType", Nothing, Any, pyconvert_rule_none, priority)
406+
pyconvert_add_rule_high_priority("builtins:bool", Bool, Any, pyconvert_rule_bool, priority)
407+
pyconvert_add_rule_high_priority("builtins:float", Float64, Any, pyconvert_rule_float, priority)
408+
pyconvert_add_rule_high_priority(
407409
"builtins:complex",
408410
Complex{Float64},
409411
Any,
410412
pyconvert_rule_complex,
413+
priority,
411414
)
412-
pyconvert_add_rule(
415+
pyconvert_add_rule_high_priority("numbers:Integral", Integer, Any, pyconvert_rule_int, priority)
416+
pyconvert_add_rule_high_priority(
413417
"numbers:Rational",
414418
Rational{<:Integer},
415419
Any,
416420
pyconvert_rule_fraction,
421+
priority,
417422
)
418-
pyconvert_add_rule("numbers:Integral", Integer, Any, pyconvert_rule_int)
419-
pyconvert_add_rule("builtins:str", String, Any, pyconvert_rule_str)
420-
pyconvert_add_rule(
423+
pyconvert_add_rule_high_priority("builtins:str", String, Any, pyconvert_rule_str, priority)
424+
pyconvert_add_rule_high_priority(
421425
"builtins:bytes",
422426
Base.CodeUnits{UInt8,String},
423427
Any,
424428
pyconvert_rule_bytes,
429+
priority,
425430
)
426-
pyconvert_add_rule(
431+
pyconvert_add_rule_high_priority(
427432
"builtins:range",
428433
StepRange{<:Integer,<:Integer},
429434
Any,
430435
pyconvert_rule_range,
436+
priority,
431437
)
432-
pyconvert_add_rule("builtins:tuple", NamedTuple, Any, pyconvert_rule_iterable)
433-
pyconvert_add_rule("builtins:tuple", Tuple, Any, pyconvert_rule_iterable)
434-
pyconvert_add_rule("datetime:datetime", DateTime, Any, pyconvert_rule_datetime)
435-
pyconvert_add_rule("datetime:date", Date, Any, pyconvert_rule_date)
436-
pyconvert_add_rule("datetime:time", Time, Any, pyconvert_rule_time)
437-
pyconvert_add_rule(
438+
pyconvert_add_rule_high_priority(
439+
"builtins:tuple",
440+
NamedTuple,
441+
Any,
442+
pyconvert_rule_iterable,
443+
priority,
444+
)
445+
pyconvert_add_rule_high_priority("builtins:tuple", Tuple, Any, pyconvert_rule_iterable, priority)
446+
pyconvert_add_rule_high_priority(
447+
"datetime:datetime",
448+
DateTime,
449+
Any,
450+
pyconvert_rule_datetime,
451+
priority,
452+
)
453+
pyconvert_add_rule_high_priority("datetime:date", Date, Any, pyconvert_rule_date, priority)
454+
pyconvert_add_rule_high_priority("datetime:time", Time, Any, pyconvert_rule_time, priority)
455+
pyconvert_add_rule_high_priority(
438456
"datetime:timedelta",
439457
Microsecond,
440458
Any,
441459
pyconvert_rule_timedelta,
460+
priority,
442461
)
443-
pyconvert_add_rule(
462+
pyconvert_add_rule_high_priority(
444463
"builtins:BaseException",
445464
PyException,
446465
Any,
447466
pyconvert_rule_exception,
467+
priority,
448468
)
449469
end

src/JlWrap/base.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ pyjlvalue(x) = @autopy x _pyjl_getvalue(x_)
2323
function init_base()
2424
setptr!(pyjlbasetype, incref(Cjl.PyJuliaBase_Type[]))
2525
pyjuliacallmodule.JlBase = pyjlbasetype
26+
Convert.pyconvert_add_rule_high_priority(
27+
"juliacall:JlBase",
28+
Any,
29+
Any,
30+
pyconvert_rule_jlvalue,
31+
2,
32+
)
2633
end
2734

28-
init_base_rule_high_priority() =
29-
Convert.pyconvert_add_rule_high_priority("juliacall:JlBase", Any, Any, pyconvert_rule_jlvalue)
30-
3135
pyconvert_rule_jlvalue(::Type{T}, x::Py) where {T} =
3236
pyconvert_tryconvert(T, _pyjl_getvalue(x))
3337

src/PythonCall.jl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,4 @@ for k in [
2727
]
2828
@eval using .JlWrap: $k
2929
end
30-
function __init__()
31-
JlWrap.init_base_rule_high_priority()
32-
Wrap.init_wrap_rules_high_priority()
33-
Convert.init_numpy_high_priority()
34-
Convert.init_pyconvert_canonical()
35-
end
36-
3730
end

src/Wrap/Wrap.jl

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,55 @@ include("PyTable.jl")
3232
include("PyPandasDataFrame.jl")
3333

3434
function __init__()
35-
pyconvert_add_rule("collections.abc:Sequence",
35+
priority = 0
36+
Convert.pyconvert_add_rule_high_priority(
37+
"collections.abc:Sequence",
3638
PyList,
3739
Any,
38-
pyconvert_rule_sequence)
39-
pyconvert_add_rule("collections.abc:Set", PySet, Any, pyconvert_rule_set)
40-
pyconvert_add_rule("collections.abc:Mapping", PyDict, Any, pyconvert_rule_mapping)
41-
pyconvert_add_rule("collections.abc:Iterable",
40+
pyconvert_rule_sequence,
41+
priority,
42+
)
43+
Convert.pyconvert_add_rule_high_priority(
44+
"collections.abc:Set",
45+
PySet,
46+
Any,
47+
pyconvert_rule_set,
48+
priority,
49+
)
50+
Convert.pyconvert_add_rule_high_priority(
51+
"collections.abc:Mapping",
52+
PyDict,
53+
Any,
54+
pyconvert_rule_mapping,
55+
priority,
56+
)
57+
Convert.pyconvert_add_rule_high_priority(
58+
"collections.abc:Iterable",
4259
PyIterable,
4360
Any,
44-
pyconvert_rule_iterable)
45-
pyconvert_add_rule("io:IOBase", PyIO, Any, pyconvert_rule_io)
46-
pyconvert_add_rule(
61+
pyconvert_rule_iterable,
62+
priority,
63+
)
64+
Convert.pyconvert_add_rule_high_priority(
65+
"io:IOBase",
66+
PyIO,
67+
Any,
68+
pyconvert_rule_io,
69+
priority,
70+
)
71+
Convert.pyconvert_add_rule_high_priority(
4772
"pandas:DataFrame",
4873
PyPandasDataFrame,
4974
Any,
5075
pyconvert_rule_pandasdataframe,
76+
priority,
5177
)
52-
pyconvert_add_rule(
78+
Convert.pyconvert_add_rule_high_priority(
5379
"pandas.api.extensions:ExtensionArray",
5480
PyList,
5581
Any,
5682
pyconvert_rule_sequence,
83+
priority,
5784
)
5885

5986
pyconvert_add_rule("<arraystruct>", Array, AbstractArray, pyconvert_rule_array)
@@ -64,13 +91,22 @@ function __init__()
6491
pyconvert_add_rule("<arrayinterface>", AbstractArray, AbstractArray, pyconvert_rule_array)
6592
pyconvert_add_rule("<array>", AbstractArray, AbstractArray, pyconvert_rule_array)
6693
pyconvert_add_rule("<buffer>", AbstractArray, AbstractArray, pyconvert_rule_array)
67-
end
68-
69-
function init_wrap_rules_high_priority()
70-
pyconvert_add_rule_high_priority("<arraystruct>", PyArray, Any, pyconvert_rule_array_nocopy)
71-
pyconvert_add_rule_high_priority("<arrayinterface>", PyArray, Any, pyconvert_rule_array_nocopy)
72-
pyconvert_add_rule_high_priority("<array>", PyArray, Any, pyconvert_rule_array_nocopy)
73-
pyconvert_add_rule_high_priority("<buffer>", PyArray, Any, pyconvert_rule_array_nocopy)
94+
Convert.pyconvert_add_rule_high_priority(
95+
"<arraystruct>",
96+
PyArray,
97+
Any,
98+
pyconvert_rule_array_nocopy,
99+
1,
100+
)
101+
Convert.pyconvert_add_rule_high_priority(
102+
"<arrayinterface>",
103+
PyArray,
104+
Any,
105+
pyconvert_rule_array_nocopy,
106+
1,
107+
)
108+
Convert.pyconvert_add_rule_high_priority("<array>", PyArray, Any, pyconvert_rule_array_nocopy, 1)
109+
Convert.pyconvert_add_rule_high_priority("<buffer>", PyArray, Any, pyconvert_rule_array_nocopy, 1)
74110
end
75111

76112
end

0 commit comments

Comments
 (0)