# Default parameters in script module

**URL:** <https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144>\
**Category:** Module Development\
**Created:** [May 27, 2022, 10:11pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144 "2022-05-27T22:11:59Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![nicholas.robinson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nicholas.robinson/32/22188_2.png) [@nicholas.robinson](https://forum.inductiveautomation.com/u/nicholas.robinson)\
**Post date:** [May 27, 2022, 10:11pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/1 "2022-05-27T22:11:59Z")

</div>

Asking here because I’m approaching this for the first time. I have a function I want to take 2 parameters sometimes, 3 the other but I don’t ever want to have confusion for the end user.

In python we can do this simply:

```auto
def func(param1, param1, param3="default")

```

So far for Java I have discovered function overloading, but I wanted to check what everyone’s preferred method is, and if possible see some examples.

Thanks,

Nick

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 27, 2022, 10:30pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/2 "2022-05-27T22:30:26Z")

</div>

This is to be exposed to the user as a script function installed by the module? If so, I recommend using the fully keyword-compatible signature, like this one from my EtherNet/IP module:

```auto
import org.python.core.ArgParser;
.....
	@KeywordArgs(names = { "name", "slot", "id", "port" }, types = { String.class, Integer.class, Long.class,
			Integer.class })
	static public CipMsgProcessor getMsgPort(PyObject[] args, String[] keywords) {
		ArgParser ap = new ArgParser("getMsgPort", args, keywords, new String[] { "name", "slot", "id", "port" });
		String name = ap.getString(0, null);
		int slot = ap.getInt(1, -1);
		long id = (Long) Py.tojava(ap.getPyObject(2, new PyLong(-1L)), Long.class);
		int port = ap.getInt(3, 1);
		........

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [May 27, 2022, 10:46pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/3 "2022-05-27T22:46:45Z")

</div>

Yeah, the critical piece is making your Java method accept `PyObject[], String[]` - that’s what Jython uses to allow keyword args invocation.

I’ll also plug [`PyArgParser`](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.16/com/inductiveautomation/ignition/common/script/PyArgParser.html) over Jython’s `ArgParser` or the older `PyArgumentMap` in the Ignition codebase.

---

<div class="post-metadata">

**Author:** ![nicholas.robinson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nicholas.robinson/32/22188_2.png) [@nicholas.robinson](https://forum.inductiveautomation.com/u/nicholas.robinson)\
**Post date:** [May 27, 2022, 11:19pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/4 "2022-05-27T23:19:32Z")

</div>

@paul-griffith @pturmel

This might be a bit brute, but this is what I have done for now. Note that this is not used in the designer or client, we use it to parse SAML response, and it is called from the user attribute mapping of an ID provider:

```auto
    @Override
    protected ArrayList<String> assignRoles(List<String> samlResponse, String hostName) {
        return assignRoles(samlResponse, hostName, "US");
    }

    @Override
    protected ArrayList<String> assignRoles(List<String> samlResponse, String hostName, String country) 
    {

    }

```

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 27, 2022, 11:22pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/5 "2022-05-27T23:22:27Z")

</div>

Hard to argue with working code. 🤷‍♂️

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [May 27, 2022, 11:34pm UTC](https://forum.inductiveautomation.com/t/default-parameters-in-script-module/60144/6 "2022-05-27T23:34:55Z")

</div>

Ah, okay, so this is purely Java \<-\> Java. If so, then yeah, overloading is the way to go.

Or, switch to the superior JVM language, Kotlin 🙂

> **[Functions | Kotlin](https://kotlinlang.org/docs/functions.html#default-arguments)**
