# Parametered optional named arguments

**URL:** <https://discourse.julialang.org/t/parametered-optional-named-arguments/66541>\
**Category:** General Usage\
**Created:** [August 17, 2021, 11:13am UTC](https://discourse.julialang.org/t/parametered-optional-named-arguments/66541 "2021-08-17T11:13:05Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Philippe\_Maincon1](https://avatars.discourse-cdn.com/v4/letter/p/ec9cab/32.png) [@Philippe\_Maincon1](https://discourse.julialang.org/u/Philippe_Maincon1)\
**Post date:** [August 17, 2021, 11:13am UTC](https://discourse.julialang.org/t/parametered-optional-named-arguments/66541/1 "2021-08-17T11:13:05Z")

</div>

When I call the function

```julia
function f(;
    field ::NTuple{Nfield,Symbol},
    fieldscale ::NTuple= (),#NTuple{Nfield ,Float64}(1. for i =1: Nfield),
    afield ::NTuple{Nafield,Symbol}=(;),
    afieldscale ::NTuple= ()) where{Nfield,Nafield} #NTuple{Nafield,Float64}(1. for i =1:Nafield) ) where{Nfield,Nafield}
    @show Nfield,Nafield
end

```

with

```julia
f(field=(:a,))

```

I get

```julia
 MethodError: no method matching 
  var"#f#48"(::Tuple{Symbol}, ::Tuple{}, ::NamedTuple{(), Tuple{}}, ::Tuple{}, ::typeof(f))
Closest candidates are:
  var"#f#48"(::Tuple{Vararg{Symbol, Nfield}}, ::Tuple{Vararg{T, N}} where {N, T},
 ::Tuple{Vararg{Symbol, Nafield}}, ::Tuple{Vararg{T, N}} where {N, T}, 
::typeof(f)) where {Nfield, Nafield} at c:\...\try_parametered_optional_args.jl:5

```

And this puzzles me: First, the error message reports a call argument pattern _which I haven’t used!_. I’m innocent.

Besides, why does it fail at all? My call is with the named argument `field` and all other arguments are optional.

Thinking of it, I propose an answer: dispatch does not use named arguments, so a `where` statement on parameters to a keyword argument makes no sense, and I am being puzzled by a confusing compiler error. Is it? 😀

---

<div class="post-metadata">

**Author:** ![SteffenPL](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/steffenpl/32/206270_2.png) [@SteffenPL](https://discourse.julialang.org/u/SteffenPL)\
**Post date:** [August 17, 2021, 11:32am UTC](https://discourse.julialang.org/t/parametered-optional-named-arguments/66541/2 "2021-08-17T11:32:04Z")

</div>

The default parameters don’t match the type

```julia
julia> typeof((;))
NamedTuple{(), Tuple{}}

```

---

<div class="post-metadata">

**Author:** ![SteffenPL](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/steffenpl/32/206270_2.png) [@SteffenPL](https://discourse.julialang.org/u/SteffenPL)\
**Post date:** [August 17, 2021, 11:33am UTC](https://discourse.julialang.org/t/parametered-optional-named-arguments/66541/3 "2021-08-17T11:33:12Z")

</div>

This works

```julia
function f(;
    field ::NTuple{Nfield,Symbol},
    fieldscale ::NTuple= (),#NTuple{Nfield ,Float64}(1. for i =1: Nfield),
    afield ::NTuple{Nafield,Symbol}=NTuple{0,Symbol}(),
    afieldscale ::NTuple= ()) where{Nfield,Nafield} #NTuple{Nafield,Float64}(1. for i =1:Nafield) ) where{Nfield,Nafield}
    @show Nfield,Nafield
end

f(field=(:a,))

```

---

<div class="post-metadata">

**Author:** ![Philippe\_Maincon1](https://avatars.discourse-cdn.com/v4/letter/p/ec9cab/32.png) [@Philippe\_Maincon1](https://discourse.julialang.org/u/Philippe_Maincon1)\
**Post date:** [August 17, 2021, 11:36am UTC](https://discourse.julialang.org/t/parametered-optional-named-arguments/66541/4 "2021-08-17T11:36:18Z")

</div>

Oh heck, yes, having the default parameter of the right type is arguably a good idea!!!

Thank you Steffen!
