Ambiguities
Method ambiguities are cases where multiple methods are applicable to a given set of arguments, without having a most specific method.
Examples
One easy example is the following:
julia> f(x::Int, y::Integer) = 1
f (generic function with 1 method)
julia> f(x::Integer, y::Int) = 2
f (generic function with 2 methods)
julia> println(f(1, 2))
ERROR: MethodError: f(::Int64, ::Int64) is ambiguous. Candidates: f(x::Integer, y::Int64) @ Main REPL[2]:1 f(x::Int64, y::Integer) @ Main REPL[1]:1 Possible fix, define f(::Int64, ::Int64)
This will throw an MethodError
because both methods are equally specific. The solution is to add a third method:
f(x::Int, y::Int) = ? # `?` is dependent on the use case, most times it will be `1` or `2`
Test function
Aqua.test_ambiguities
— Functiontest_ambiguities(package::Union{Module, PkgId})
test_ambiguities(packages::Vector{Union{Module, PkgId}})
Test that there is no method ambiguities in given package(s). It calls Test.detect_ambiguities
in a separated clean process to avoid false-positives.
Keyword Arguments
broken::Bool = false
: If true, it uses@test_broken
instead of@test
and shortens the error message.color::Union{Bool, Nothing} = nothing
: Enable/disable colorful output if aBool
.nothing
(default) means to inherit the setting in the current process.exclude::AbstractVector = []
: A vector of functions or types to be excluded from ambiguity testing. A function means to exclude all its methods. A type means to exclude all its methods of the callable (sometimes also called "functor") and the constructor. That is to say,MyModule.MyType
means to ignore ambiguities between(::MyType)(x, y::Int)
and(::MyType)(x::Int, y)
.recursive::Bool = true
: Passed toTest.detect_ambiguities
. Note that the default here (true
) is different fromdetect_ambiguities
. This is for testing ambiguities in methods defined in all sub-modules.- Other keyword arguments such as
imported
andambiguous_bottom
are passed toTest.detect_ambiguities
as-is.