# Is slurpping typed keyword args invalid?

**URL:** <https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568>\
**Category:** General Usage\
**Created:** [September 14, 2020, 3:02am UTC](https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568 "2020-09-14T03:02:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [September 14, 2020, 3:02am UTC](https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568/1 "2020-09-14T03:02:39Z")

</div>

Slurrping keyword args is a fairly common usage:

```julia
julia> foo(; x...) = 1
foo (generic function with 1 method)

julia> foo()
1

```

But, if I annotate with type, then this function becomes non-callable…

```julia
julia> bar(; x::Int...) = 2
bar (generic function with 1 method)

julia> bar()
ERROR: MethodError: no method matching #bar#141(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(bar))
Closest candidates are:
  #bar#141(::Int64, ::typeof(bar)) at REPL[52]:1

```

So I guess this is not a valid usage but if that’s the case then why it didn’t stop me from defining the function?

---

<div class="post-metadata">

**Author:** ![marius311](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marius311/32/3953_2.png) [@marius311](https://discourse.julialang.org/u/marius311)\
**Post date:** [September 14, 2020, 6:26am UTC](https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568/2 "2020-09-14T06:26:34Z")

</div>

Assuming that what you want by `bar(; x::Int...)` is that the _value_ of the keyword arguments be `Int`, then I think you’re looking for:

```julia
bar(;x::Pairs{<:Any,<:Int}...) = ...

```

Note the `<:Int` instead of just `Int` makes it so it accepts `bar()` with no arguments (you can figure this out by defining `bar(;x...) = typeof(x)` and seeing that `bar()` returns a `Pairs{Union{},Union{}}` which is `<:Pairs{<:Any,<:Int}`, but not `<:Pairs{<:Any,Int}`)

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [September 14, 2020, 6:53am UTC](https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568/3 "2020-09-14T06:53:52Z")

</div>

I should have mentioned that I was actually expecting it to be a valid usage.

@marius311 That’s a nice workaround!

```julia
julia> bar(; x::Iterators.Pairs{<:Any,<:Int}...) = isempty(x) ? 0 : sum(values(x))

julia> bar()
0

julia> bar(; x = 1, y = 2)
3

ulia> bar(; x = 1, y = 3.0)
ERROR: MethodError: no method matching #bar#192(::Base.Iterators.Pairs{Symbol,Real,Tuple{Symbol,Symbol},NamedTuple{(:x, :y),Tuple{Int64,Float64}}}, ::typeof(bar))

```

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [September 14, 2020, 7:32am UTC](https://discourse.julialang.org/t/is-slurpping-typed-keyword-args-invalid/46568/4 "2020-09-14T07:32:39Z")

</div>

> [@marius311](#):
>
> you can figure this out by defining `bar(;x...) = typeof(x)` and seeing that `bar()` returns a `Pairs{Union{},Union{}}`

I am not sure this is part of the exposed API though — if not, the representation could change at any point.
