यह एक दिलचस्प सवाल है। प्रमुख प्रश्न यह है कि हम घोषित प्रकार के रूप में क्या परिभाषित करते हैं । यदि आपका मतलब है कि ::SomeType
हर विधि की परिभाषा में एक कथन है तो यह करना थोड़ा मुश्किल है क्योंकि आपके पास जूलिया में गतिशील कोड पीढ़ी की अलग-अलग संभावनाएं हैं। शायद इस अर्थ में एक पूर्ण समाधान है, लेकिन मैं इसे नहीं जानता (मैं इसे सीखना पसंद करूंगा)।
हालांकि मेरे दिमाग में जो बात आती है, वह यह है कि ऐसा करने के लिए अपेक्षाकृत सरल प्रतीत होता है कि क्या किसी मॉड्यूल के भीतर परिभाषित कोई विधि Any
इसके तर्क के रूप में स्वीकार करती है। यह समान है लेकिन पहले के बयान के समान नहीं है:
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
methods
फ़ंक्शन के लिए समान रूप में दोनों कार्यों के हस्ताक्षर के x
रूप में स्वीकार करता है Any
।
अब यह जांचने के लिए कि क्या मॉड्यूल / पैकेज में कोई भी विधि Any
इसे परिभाषित करने के किसी भी तरीके के तर्क के रूप में स्वीकार करती है, जैसे कि निम्नलिखित कोड का उपयोग किया जा सकता है (मैंने इसे बड़े पैमाने पर परीक्षण नहीं किया है जैसा कि मैंने अभी इसे लिखा है, लेकिन यह ज्यादातर लगता है कवर संभव मामले):
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
अब जब आप इसे Base.Iterators
मॉड्यूल पर चलाते हैं तो आपको मिलता है:
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
और जब आप उदाहरण के लिए DataStructures.jl पैकेज की जाँच करें:
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
मैं जो प्रस्ताव करता हूं वह आपके प्रश्न का पूर्ण समाधान नहीं है लेकिन मैंने इसे अपने लिए उपयोगी पाया है इसलिए मैंने इसे साझा करने के बारे में सोचा।
संपादित करें
उपरोक्त कोड केवल f
होना स्वीकार करता है Function
। सामान्य तौर पर आपके पास ऐसे प्रकार हो सकते हैं जो कॉल करने योग्य हो सकते हैं। तब check_declared(m::Module, f::Function)
हस्ताक्षर को बदल दिया जा सकता है check_declared(m::Module, f)
(वास्तव में तब फ़ंक्शन खुद को Any
दूसरे तर्क के रूप में अनुमति देगा :)) और इस फ़ंक्शन के सभी मूल्यांकित नामों को पास करेगा। तब आपको जांचना होगा कि क्या फ़ंक्शन के अंदर methods(f)
सकारात्मक length
है ( methods
गैर-कॉल करने योग्य रिटर्न के लिए एक मूल्य है जिसकी लंबाई है 0
)।
hasmethod(f, (Any,) )
वापस आ जाएगाfalse
। आपको अभी भी तर्कों की संख्या का मिलान करने की आवश्यकता होगी (हालांकि,hasmethod(f, (Any,Any) )
दो-तर्क फ़ंक्शन के लिए)।