add_mutually_exclusive_group() はまさにこれのために設計されています-相互に排他的なグループを追加しようとしています。
あなたの質問の2番目の部分に関しては、これはあなたが望むことをするはずです:
parser.add_argument('-f', '--foobar')
(注:あなたの質問は少し混乱しています.2つの質問があり、2番目の質問は最初の質問に関する別の文に直接つながっています.多数のタイプミスは言うまでもありません..より明確な質問に答えることができます。)
更新
私が知る限り、相互に排他的な引数が必要である必要がありますが、位置引数は必要ありません。したがって、位置引数を相互に排他的にすることはできません (おそらく、そうしないと、インタープリターが何が何であるかを判断できなくなるためです)。あなたの目的のために、あなたの引数を解釈するコードはどちらの方法でも実質的に同じであるため、これは本当に重要ではないと思います。
あなたがしようとしている方法でそれを行うことができると仮定すると、次のようなことをしなければなりません:
# all == True
# pos == ('this', 'that', 'theother')
if all == true:
do_some_stuff('all')
else:
do_some_other_stuff('positional arguments')
一方、位置引数の 1 つとして「all」を受け入れる場合は、次のようにする必要があります。
# pos = ('all', 'this, 'that', 'theother')
if pos[0] == 'all': #other parameters are ignored
do_some_stuff('all')
else:
do_some_other_stuff('positional arguments')
特別な理由がない限り、後者の方法をとらない理由はないと思います。