However, if you subscribe to the idea that many real-world programs are naturally expressed as "a functional core inside an imperative shell"^1, then Python's stylistic flexibility might make it a good, practical choice.
If you say macros, I'd argue that's not quite the same as "functional".
I wish everything immutablejs gave me was built in to Python. :)
Tuple slicing and concatenation gives you the "immutable" behavior for ordered data. For sets and dicts, one could create a subclass that override add/insert/set methods to return a modified copy. Iterators already have excellent support.
I'm not an immutablejs user, but my first skim of the docs doesn't make it clear what's missing from Python. If the immutable subclasses would be valuable, I'll gladly make a module for it. There's already frozenset. A frozendict didn't seem as useful (according to core devs).
Tail call elimination, so you don't have the tiny recursion that Python locks you too.
Real lambdas instead of the arbitrarily limited one's Python has.
Language design involves trade-offs. For example, tail call elimination would obfuscate tracebacks and make the interpreter more complex.
Need is different than want. You might want tail call elimination, but you don't need it to write elegant functional style code.