I pretty much always prefer using an options struct as soon as there is more than one optional argument.
Comes out cleaner because overriding a default argument doesn’t force you to also do all the positional arguments in front of it.
Designated initializers make it look really nice imo. I feel like the brackets are no big deal.
Python has sort of the opposite when you need to use *kwargs.