# Strange method overwriting case -\> precompilation issue

**URL:** https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835
**Category:** General Usage
**Tags:** precompilation
**Created:** [February 27, 2024, 9:36am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835 "2024-02-27T09:36:31Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Marcell\_Havlik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marcell_havlik/32/37424_2.png) [@Marcell\_Havlik](https://discourse.julialang.org/u/Marcell_Havlik)
#### Post date: [February 27, 2024, 9:36am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/1 "2024-02-27T09:36:31Z")

</div>

Hey,

I have a module: [Arithmetics.jl](https://github.com/Cvikli/Arithmetics.jl)  
I have precompilation issue due to.

```julia
mean(arr; dims) = sum(arr, dims=dims) / prod(size(arr, r) for r in dims)
mean(arr) = sum(arr) / length(arr)

```

It says that `mean(arr)` is overwritten with `mean(arr;dims)` which sounds nonsense as `mean(arr; dims)` doesn’t create the one arg version of `mean`.

What is this problem?

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [February 27, 2024, 9:41am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/2 "2024-02-27T09:41:24Z")

</div>

> [@Marcell\_Havlik](#):
>
> It says that `mean(arr)` is overwritten with `mean(arr;dims)` which sounds nonsense as `mean(arr; dims)` doesn’t create the one arg version of `mean`.

It does create it:

```julia
julia> f(a; b) = a + b
f (generic function with 1 method)

julia> f(1)
ERROR: UndefKeywordError: keyword argument `b` not assigned

```

---

<div class="post-metadata">

### Author: ![Marcell\_Havlik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marcell_havlik/32/37424_2.png) [@Marcell\_Havlik](https://discourse.julialang.org/u/Marcell_Havlik)
#### Post date: [February 27, 2024, 9:44am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/3 "2024-02-27T09:44:26Z")

</div>

Wow, indeed, thank you for pointing it out.

Then how could I create the `dims` version and specify a custom version for the “ **without the keyword version** ” without breaking precompilation? :o

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [February 27, 2024, 11:38am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/4 "2024-02-27T11:38:35Z")

</div>

You could maybe do something like

```julia
function mean(arr; dims=nothing)
    if dims === nothing
        return mean(arr) = sum(arr) / length(arr)
    else
        return sum(arr, dims=dims) / prod(size(arr, r) for r in dims)
    end
end

```

---

<div class="post-metadata">

### Author: ![Marcell\_Havlik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marcell_havlik/32/37424_2.png) [@Marcell\_Havlik](https://discourse.julialang.org/u/Marcell_Havlik)
#### Post date: [February 27, 2024, 11:48am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/5 "2024-02-27T11:48:25Z")

</div>

Yes, ok. Not the best but. Okay. Thank you @kristoffer.carlsson!

I also saw this: [Keyword arguments affect methods dispatch · Issue #9498 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/issues/9498)  
I hope this will be figured out. I believe the “keyword” error should be handled from the compiler side. So the compiler should know “Just In Time”, that the function just doesn’t exist and offer similar methods. It would be more beneficial to send a “it just doesn’t exist” instead of it generating these boilerplate functions with `UndefKeywordError`. If that could avoid these kind of overwrite issues in the future.  
Mainly, because this became serious issues of today, from 1.10 as it treats precompilation error very seriously already!

---

<div class="post-metadata">

### Author: ![uniment](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/uniment/32/24532_2.png) [@uniment](https://discourse.julialang.org/u/uniment)
#### Post date: [February 27, 2024, 2:28pm UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/6 "2024-02-27T14:28:40Z")

</div>

Julia does not dispatch on keyword arguments. If you want dispatch, you can use a helper function which turns the keyword argument into a positional argument:

```julia
mean(arr; dims=nothing) = _mean(arr, dims)
_mean(arr, ::Nothing) = sum(arr) / length(arr)
_mean(arr, dims) = sum(arr; dims) / prod(size(arr, r) for r in dims)

```

This approach is used for example in [reduce.jl](https://github.com/JuliaLang/julia/blob/master/base/reduce.jl#L175).

---

<div class="post-metadata">

### Author: ![aplavin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aplavin/32/222056_2.png) [@aplavin](https://discourse.julialang.org/u/aplavin)
#### Post date: [February 27, 2024, 3:52pm UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/7 "2024-02-27T15:52:33Z")

</div>

Well, if precompilation is not crucial for you, your code just works as expected:

```julia
julia> f(x; kw) = 2
f (generic function with 1 method)

julia> f(x) = 1
f (generic function with 1 method)

julia> f("a")
1

julia> f("a"; kw="b")
2

```

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [February 27, 2024, 5:16pm UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/8 "2024-02-27T17:16:56Z")

</div>

> [@aplavin](#):
>
> your code just works as expected:

This is pretty much a bug though.

---

<div class="post-metadata">

### Author: ![Marcell\_Havlik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marcell_havlik/32/37424_2.png) [@Marcell\_Havlik](https://discourse.julialang.org/u/Marcell_Havlik)
#### Post date: [March 1, 2024, 10:28am UTC](https://discourse.julialang.org/t/strange-method-overwriting-case-precompilation-issue/110835/9 "2024-03-01T10:28:37Z")

</div>

Excellent version! Really thank you!  
Actually, this is close to perfect with the current overloading problem. 🙂
