# Keyword Arguments

**URL:** <https://discourse.julialang.org/t/keyword-arguments/61870>\
**Category:** General Usage\
**Created:** [May 26, 2021, 5:11pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870 "2021-05-26T17:11:44Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![saraflgarcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/saraflgarcia/32/14847_2.png) [@saraflgarcia](https://discourse.julialang.org/u/saraflgarcia)\
**Post date:** [May 26, 2021, 5:11pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/1 "2021-05-26T17:11:44Z")

</div>

How do we get the number (and/or name) of keyword arguments of a function?

For instance,  
f(;x, y, z) = x+y+z  
arguments(f)

Thanks!

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [May 26, 2021, 5:16pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/2 "2021-05-26T17:16:01Z")

</div>

After some digging it looks like you want `methods(f)`

But the objects in that look kind of ugly and complicated. Could you explain more what you are trying to do?

---

<div class="post-metadata">

**Author:** ![saraflgarcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/saraflgarcia/32/14847_2.png) [@saraflgarcia](https://discourse.julialang.org/u/saraflgarcia)\
**Post date:** [May 26, 2021, 5:20pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/3 "2021-05-26T17:20:59Z")

</div>

Something similar to this function:

```julia
arguments_number(f) = first(methods(f)).nargs-1
f2(x, y) = x+y
arguments_number(f2) #2

```

But for keyword arguments

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [May 26, 2021, 5:24pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/4 "2021-05-26T17:24:56Z")

</div>

I mean, more broadly, what is the ultimate goal you wish to accomplish?

---

<div class="post-metadata">

**Author:** ![saraflgarcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/saraflgarcia/32/14847_2.png) [@saraflgarcia](https://discourse.julialang.org/u/saraflgarcia)\
**Post date:** [May 26, 2021, 5:28pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/5 "2021-05-26T17:28:50Z")

</div>

I’m reading parameters and values from a CSV file,  
However, I want to filter those that will be used by a given function.

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [May 26, 2021, 5:44pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/6 "2021-05-26T17:44:47Z")

</div>

How about `hasmethod`?

```julia
julia> f(;x, y, z) = x + y + z;

julia> hasmethod(f, Tuple{}, (:x, :y, :z))
true

```

---

<div class="post-metadata">

**Author:** ![pbayer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pbayer/32/11675_2.png) [@pbayer](https://discourse.julialang.org/u/pbayer)\
**Post date:** [May 26, 2021, 6:14pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/7 "2021-05-26T18:14:23Z")

</div>

> [@saraflgarcia](#):
>
> How do we get the number (and/or name) of keyword arguments of a function?
> 
> For instance, `f(;x, y, z) = x+y+z`

Ugly, but he following gives you the number of arguments of the generated `kwsorter` function in the methods table:

```julia
julia> methods(methods(f).mt.kwsorter).mt.max_args
3

```

I would look for another approach without the need for counting keyword arguments.

---

<div class="post-metadata">

**Author:** ![saraflgarcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/saraflgarcia/32/14847_2.png) [@saraflgarcia](https://discourse.julialang.org/u/saraflgarcia)\
**Post date:** [May 26, 2021, 6:14pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/8 "2021-05-26T18:14:56Z")

</div>

Yes, that may work, although I would have to make a trial-and-error process.  
I also find this, but I don’t know whether it’s very safe:

```julia
kwargs_number(f) = length(first(methods(f)).roots)-4

```

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [May 26, 2021, 6:28pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/9 "2021-05-26T18:28:16Z")

</div>

But shouldn’t you also know what names are available for input? I don’t quite understand why the number of keyword arguments would be important rather than which arguments in particular.

---

<div class="post-metadata">

**Author:** ![saraflgarcia](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/saraflgarcia/32/14847_2.png) [@saraflgarcia](https://discourse.julialang.org/u/saraflgarcia)\
**Post date:** [May 26, 2021, 6:31pm UTC](https://discourse.julialang.org/t/keyword-arguments/61870/10 "2021-05-26T18:31:36Z")

</div>

Yes, you’re right.  
Here’s my final solution:

```julia
filter_kwargs(args, f) =
  if hasmethod(f, Tuple{}, args)
    args
  else filter_kwargs(args[1:end-1], f)
  end

f1(; x, y, z) = x+y+z
filter_kwargs((:x, :y, :z), f2)

```

Thank you so much!
