# IntEnum as optional argument

**URL:** <https://numba.discourse.group/t/intenum-as-optional-argument/2461>\
**Category:** Support: How do I do ...?\
**Created:** [March 9, 2024, 6:38pm UTC](https://numba.discourse.group/t/intenum-as-optional-argument/2461 "2024-03-09T18:38:52Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Oyibo](https://avatars.discourse-cdn.com/v4/letter/o/4af34b/32.png) [@Oyibo](https://numba.discourse.group/u/Oyibo)\
**Post date:** [March 9, 2024, 6:38pm UTC](https://numba.discourse.group/t/intenum-as-optional-argument/2461/1 "2024-03-09T18:38:52Z")

</div>

Hey Numba team,

I’m encountering an issue while trying to use an IntEnum as an optional argument in a jitted function. Whenever I attempt to pass an IntEnum member as an optional argument, I get a `TypeError: '>' not supported between instances of 'Conversion' and 'NoneType'`. Explicit casting into an integer doesn’t seem to be supported.

```auto
from enum import IntEnum
import numba as nb

class Number(IntEnum):
    ONE = 1
    TWO = 2
    THREE = 3

@nb.njit(['i8(i8, i8)', 'i8(i8, Omitted(None))'])
def add(a, b=None):
    b = b or Number.ONE
    return a+b

print('add(1, 1) => ', add(1, 1))
print('add(1) => ', add(1))
print('add(1, Number.ONE) => ', add(1, Number.ONE))
# add(1, 1) -> 2
# add(1) -> 2
# TypeError: '>' not supported between instances of 'Conversion' and 'NoneType'

```

Surprisingly, if you’ve previously called a function that uses IntEnum as an ordinary argument, you can then use the IntEnum as an optional argument, too.

```auto
from enum import IntEnum
import numba as nb

class Number(IntEnum):
    ONE = 1
    TWO = 2
    THREE = 3

@nb.njit(['i8(i8, i8)'])
def add_dummy(a, b):
    return a+b

add_dummy(1, 1)
add_dummy(1, Number.ONE)

@nb.njit(['i8(i8, i8)', 'i8(i8, Omitted(None))'])
def add(a, b=None):
    b = b or Number.ONE
    return a+b

print('add(1, 1) => ', add(1, 1))
print('add(1) => ', add(1))
print('add(1, Number.ONE) => ', add(1, Number.ONE))
# add(1, 1) -> 2
# add(1) -> 2
# add(1, Number.ONE) => 2

```

Is there a way to provide sufficient type hints and prevent the TypeError?

---

<div class="post-metadata">

**Author:** ![Oyibo](https://avatars.discourse-cdn.com/v4/letter/o/4af34b/32.png) [@Oyibo](https://numba.discourse.group/u/Oyibo)\
**Post date:** [March 12, 2024, 11:11pm UTC](https://numba.discourse.group/t/intenum-as-optional-argument/2461/2 "2024-03-12T23:11:29Z")

</div>

Here is a version with type inference:

```auto
from enum import IntEnum
import numba as nb

class Number(IntEnum):
    ONE = 1
    TWO = 2
    THREE = 3

@nb.njit
def add(a, b=None):
    if b is None:
        bint = Number.ONE
    else:
        bint = b
    return a + bint

print('add(1, 1) => ', add(1, 1))
print('add(1) => ', add(1))
print('add(1, Number.ONE) => ', add(1, Number.ONE))
print(add.signatures)
# add(1, 1) => 2
# add(1) => 2
# add(1, Number.ONE) => 2
# [(int64, int64), (int64, omitted(default=None)), (int64, IntEnum<int64>(Number))]

```

Here is a version with explicit signatures:

```auto
from enum import IntEnum
import numba as nb
import numba.types as nbt

class Number(IntEnum):
    ONE = 1
    TWO = 2
    THREE = 3

# Register the IntEnum with Numba.
NumberType = nb.typeof(Number.ONE)

@nb.njit(['i8(i8, i8)', 'i8(i8, Omitted(None))', nbt.i8(nbt.i8, NumberType)])
def add(a, b=None):
    if b is None:
        bint = Number.ONE
    else:
        bint = b
    return a + bint

print('add(1, 1) => ', add(1, 1))
print('add(1) => ', add(1))
print('add(1, Number.ONE) => ', add(1, Number.ONE))

```

Unfortunately, these implementations result in an additional function signature which might be avoidable.

---

<div class="post-metadata">

**Author:** ![Oyibo](https://avatars.discourse-cdn.com/v4/letter/o/4af34b/32.png) [@Oyibo](https://numba.discourse.group/u/Oyibo)\
**Post date:** [March 17, 2024, 11:34pm UTC](https://numba.discourse.group/t/intenum-as-optional-argument/2461/3 "2024-03-17T23:34:54Z")

</div>

This seems to work as intended.

```auto
from enum import IntEnum
import numba as nb

class Number(IntEnum):
    ONE = 1
    TWO = 2
    THREE = 3

# Register Numba type for your IntEnum class
@nb.extending.typeof_impl.register(Number)
def typeof_number(obj, c):
    return nb.types.int64

@nb.njit
def add(a, b=None):
    b = b or Number.ONE
    return a + b

print('add(1, 1) => ', add(1, 1))
print('add(1) => ', add(1))
print('add(1, Number.ONE) => ', add(1, Number.ONE))
print(add.signatures)
# add(1, 1) => 2
# add(1) => 2
# add(1, Number.ONE) => 2
# [(int64, int64), (int64, omitted(default=None))]

```
