Encontrar todas las posibles permutaciones de caso en Python

Necesito elaborar una lista de todas las posibles permutaciones del caso solo en python, por ejemplo, con la entrada de ar devolvería [‘ar’, ‘Ar’, ‘aR’, ‘AR’]
o arc [‘arc’, ‘Arc’, ‘ARc’, ‘aRc’, ‘aRC’, ‘ARC’] y sé que probablemente exista algún método agradable, pero por mi vida no puedo entenderlo.

 def all_casings(input_string): if not input_string: yield "" else: first = input_string[:1] if first.lower() == first.upper(): for sub_casing in all_casings(input_string[1:]): yield first + sub_casing else: for sub_casing in all_casings(input_string[1:]): yield first.lower() + sub_casing yield first.upper() + sub_casing 

 >>> [x for x in all_casings("foo")] ['foo', 'Foo', 'fOo', 'FOo', 'foO', 'FoO', 'fOO', 'FOO'] >>> list(all_casings("foo")) ['foo', 'Foo', 'fOo', 'FOo', 'foO', 'FoO', 'fOO', 'FOO']