I really don't understand (having read everything
above) why anyone prefers {1,2,3}.frozen() over f{1,2,3}. Yes,
some people coming from some other languages might get confused
(e.g. in Mathematica this is function call syntax) but that's
true of anything: you have to learn Python syntax to use Python.
The fact that {1,2,3} is a set and f{1,2,3} is a frozenset is
not difficult to explain or to understand, especially in a
language that already uses single letter prefixes for other
things.
The .frozen() method is a strangely indirect way to
achieve a minor optimisation. Outside of attempting to
achieve that optimisation it's basically useless because any
time you would have written obj.frozen() you could have
simply written frozenset(obj) so it does nothing to improve
code that uses frozensets.
With f{...} you have a nice syntax that clearly creates a
frozenset directly and that can be used for repr.