Where are you raising the ArgumentTypeError? In a type function?
The definition of ArgumentTypeError is just pass; it doesn't do anything except subclass Exception.
It is referenced in _get_value, which calls the type function on your argument string. That method treats TypeError and ValueError in the same way. It recasts the error as ArgumentError, which adds the argument dest (name) to the message. parse_known_args ends up converting that to a call to parser.error.
It's the parser.error method that adds the print_usage.
So simply changing that method might be the solution to your problem.
https://docs.python.org/3/library/argparse.html#exiting-methods
I'm not sure what happens if your type function returns some other error - it might bubble all the way to the top.
The formal way to change the parser.error method is to subclass ArgumentParser, but you can kludge a one time change with:
In [269]: parser=argparse.ArgumentParser()
In [270]: def myerror(message):
.....: print(message)
In [271]: parser.error=myerror
In [272]: parser.add_argument('foo')
Out[272]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [273]: parser.parse_args([])
the following arguments are required: foo
Out[273]: Namespace(foo=None)
This just showed the message, and did not exit. If I'd stuck closer to the original it would have exited as well.
--help. The suppression case is only when a known argument receives an invalid parameter, such as in the documentation where we useparser.add_argument('foo', type=perfect_square), and the user doesn't provide a number that's a perfect square. In that example, we see that the program prints the usage statement and the error message. Gabe wants only the error message.