# Is it possible to override keyword arguments for specific types?

**URL:** https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924
**Category:** General Usage
**Tags:** question
**Created:** [August 23, 2018, 8:57am UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924 "2018-08-23T08:57:34Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)
#### Post date: [August 23, 2018, 8:57am UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/1 "2018-08-23T08:57:34Z")

</div>

I have library code that looks like the following:

```julia
foo(x) = 1
foo(::Float64) = 2.0
foo2(x; height=foo(x)) = "hi"

```

and I want to override `foo2` in the special case where `foo(x)` returns a `MyType`. Looking at [https://docs.julialang.org/en/stable/devdocs/functions/#Keyword-arguments-1](https://docs.julialang.org/en/stable/devdocs/functions/#Keyword-arguments-1) it seems like it should be possible if I can get access to the autogenerated function `#foo2#1`. Is this possible?

For context, the actual function is `Base.show_delim_array` and I’m trying to override it in the case that `l=last(LinearIndices(itr))` is of type `Infinity` from InfiniteArrays.jl. This seems like the easiest way of preventing `show(stdout, 1:∞)` from printing forever. Of course, I can override this for special array types, but this has limitations for “composed arrays” like `view(1:∞, 3:∞)`.

I know this is a “bad” idea, but I view it as a temporary work around until I can make a PR to Base to give me the right overloading abilities.

---

<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: [August 23, 2018, 9:07am UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/2 "2018-08-23T09:07:33Z")

</div>

I don’t think you can dispatch on keyword argument types.

I’ve also encountered this issue with the keyword argument frenzy that happened in 0.7. Previously I could just overload a function by specifying the argument type but then it got moved to a keyword and it is no longer possible.

---

<div class="post-metadata">

### Author: ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)
#### Post date: [August 23, 2018, 9:17am UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/3 "2018-08-23T09:17:48Z")

</div>

That’s unfortunate. Though note it is possible to override as long as keywords are explicitly stated:

```julia
julia> foo(;height=1) = "hi"
foo (generic function with 1 method)

julia> (::Core.kwftype(typeof(foo)))(::NamedTuple{(:height,),Tuple{Float64}}, ::typeof(foo)) = "bye"

julia> foo()
"hi"

julia> foo(height=3)
"hi"

julia> foo(height=3.0)
"bye"

```

Maybe a function analogous to `Core.kwftype` could be added?

---

<div class="post-metadata">

### Author: ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)
#### Post date: [August 23, 2018, 2:41pm UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/4 "2018-08-23T14:41:47Z")

</div>

You actually can dispatch on keyword arguments now…sort of. The syntax is kind of awkward, but I noticed that Base does this for things like mapfoldl: [https://github.com/JuliaLang/julia/blob/09bfc83f724874af2d7eefe925436848c7b1038f/base/reduce.jl#L37](https://github.com/JuliaLang/julia/blob/09bfc83f724874af2d7eefe925436848c7b1038f/base/reduce.jl#L37)

---

<div class="post-metadata">

### Author: ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)
#### Post date: [August 23, 2018, 3:27pm UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/5 "2018-08-23T15:27:08Z")

</div>

That requires the function being designed to allow it, right? So I wouldn’t be able to override an existing function like `Base.show_delim_array`?

---

<div class="post-metadata">

### Author: ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)
#### Post date: [August 23, 2018, 3:37pm UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/6 "2018-08-23T15:37:20Z")

</div>

Right, it only works if there’s a generic “catchall” version of the function that grabs up the keyword arguments and then calls some inner function with `kw.data`.

---

<div class="post-metadata">

### Author: ![danielmatz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/danielmatz/32/2285_2.png) [@danielmatz](https://discourse.julialang.org/u/danielmatz)
#### Post date: [August 23, 2018, 6:08pm UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/7 "2018-08-23T18:08:25Z")

</div>

Do you know if there is a way to use this trick for multiple keyword arguments without dispatch caring about the order?

```julia
julia> NamedTuple{(:a, :b)} <: NamedTuple{(:b, :a)}
false

```

---

<div class="post-metadata">

### Author: ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)
#### Post date: [August 24, 2018, 8:15pm UTC](https://discourse.julialang.org/t/is-it-possible-to-override-keyword-arguments-for-specific-types/13924/8 "2018-08-24T20:15:00Z")

</div>

Whoops: `show_delim_array` has default arguments, not keyword arguments, so easy to override.
