Bu ilginç bir soru. Anahtar soru, beyan edilen tür olarak tanımladığımız şeydir . ::SomeType
Her yöntem tanımında bir ifade varsa, Julia'da farklı dinamik kod oluşturma olasılıklarına sahip olduğunuz için yapmak biraz zor. Belki bu anlamda tam bir çözüm var ama bilmiyorum (öğrenmek isterim).
Aklıma gelen, göreceli olarak daha basit görünen şey, bir modülde tanımlanan herhangi bir yöntemin Any
argüman olarak kabul edilip edilmediğini kontrol etmektir . Bu benzerdir, ancak önceki ifadeye eşdeğer değildir:
julia> z1(x::Any) = 1
z1 (generic function with 1 method)
julia> z2(x) = 1
z2 (generic function with 1 method)
julia> methods(z1)
# 1 method for generic function "z1":
[1] z1(x) in Main at REPL[1]:1
julia> methods(z2)
# 1 method for generic function "z2":
[1] z2(x) in Main at REPL[2]:1
Aynı bakmak methods
hem fonksiyonların imza kabul olarak fonksiyonu x
olarak Any
.
Şimdi bir modül / paketteki Any
herhangi bir yöntem aşağıdaki kod kullanılabilir gibi bir şey içinde tanımlanan yöntemlerin herhangi bir argüman olarak kabul edip etmediğini kontrol etmek için (Ben sadece yazdım gibi kapsamlı test etmedim, ama çoğunlukla gibi görünüyor olası durumları kapsamalıdır):
function check_declared(m::Module, f::Function)
for mf in methods(f).ms
if mf.module == m
if mf.sig isa UnionAll
b = mf.sig.body
else
b = mf.sig
end
x = getfield(b, 3)
for i in 2:length(x)
if x[i] == Any
println(mf)
break
end
end
end
end
end
function check_declared(m::Module)
for n in names(m)
try
f = m.eval(n)
if f isa Function
check_declared(m, f)
end
catch
# modules sometimes return names that cannot be evaluated in their scope
end
end
end
Şimdi Base.Iterators
modül üzerinde çalıştırdığınızda şunları elde edersiniz:
julia> check_declared(Iterators)
cycle(xs) in Base.Iterators at iterators.jl:672
drop(xs, n::Integer) in Base.Iterators at iterators.jl:628
enumerate(iter) in Base.Iterators at iterators.jl:133
flatten(itr) in Base.Iterators at iterators.jl:869
repeated(x) in Base.Iterators at iterators.jl:694
repeated(x, n::Integer) in Base.Iterators at iterators.jl:714
rest(itr::Base.Iterators.Rest, state) in Base.Iterators at iterators.jl:465
rest(itr) in Base.Iterators at iterators.jl:466
rest(itr, state) in Base.Iterators at iterators.jl:464
take(xs, n::Integer) in Base.Iterators at iterators.jl:572
ve örneğin DataStructures.jl paketini kontrol ettiğinizde şunları elde edersiniz:
julia> check_declared(DataStructures)
compare(c::DataStructures.LessThan, x, y) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps.jl:66
compare(c::DataStructures.GreaterThan, x, y) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps.jl:67
cons(h, t::LinkedList{T}) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\list.jl:13
dec!(ct::Accumulator, x, a::Number) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:86
dequeue!(pq::PriorityQueue, key) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\priorityqueue.jl:288
dequeue_pair!(pq::PriorityQueue, key) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\priorityqueue.jl:328
enqueue!(s::Queue, x) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\queue.jl:28
findkey(t::DataStructures.BalancedTree23, k) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\balanced_tree.jl:277
findkey(m::SortedDict, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_dict.jl:245
findkey(m::SortedSet, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_set.jl:91
heappush!(xs::AbstractArray, x) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\arrays_as_heaps.jl:71
heappush!(xs::AbstractArray, x, o::Base.Order.Ordering) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\arrays_as_heaps.jl:71
inc!(ct::Accumulator, x, a::Number) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:68
incdec!(ft::FenwickTree{T}, left::Integer, right::Integer, val) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\fenwick.jl:64
nil(T) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\list.jl:15
nlargest(acc::Accumulator, n) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:161
nsmallest(acc::Accumulator, n) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:175
reset!(ct::Accumulator{#s14,V} where #s14, x) where V in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:131
searchequalrange(m::SortedMultiDict, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_multi_dict.jl:226
searchsortedafter(m::Union{SortedDict, SortedMultiDict, SortedSet}, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\tokens2.jl:154
sizehint!(d::RobinDict, newsz) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\robin_dict.jl:231
update!(h::MutableBinaryHeap{T,Comp} where Comp, i::Int64, v) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\mutable_binary_heap.jl:250
Önerdiğim soruya tam bir çözüm değil ama kendim için yararlı buldum, bu yüzden paylaşmayı düşündüm.
DÜZENLE
Yukarıdaki kod sadece kabul f
edilir Function
. Genel olarak çağrılabilir türlere sahip olabilirsiniz. Daha sonra check_declared(m::Module, f::Function)
imza olarak değiştirilebilir check_declared(m::Module, f)
(aslında fonksiyonun kendisi Any
ikinci argüman olarak izin verir :)) ve değerlendirilen tüm isimleri bu fonksiyona geçirebilir. Daha sonra , işlevin içinde methods(f)
pozitif olup olmadığını kontrol etmeniz gerekir length
( methods
çağrılamaz olan gibi uzunluklu bir değer döndürür 0
).
hasmethod(f, (Any,) )
geri dönecektirfalse
. Yine de argüman sayısını eşleştirmeniz gerekir (örneğinhasmethod(f, (Any,Any) )
, iki argüman işlevi için).