How about this, to piggy back on the original idea. Every module starts with an __exports__ empty list. We allow only these two syntaxes from the proposal:
But instead of populating __all__, they populate __exports__. When an exogenous import of the library happens, if it sees __exports__, it replaces __all__ with __exports__, and deletes every symbol that’s not in __exports__.
The deletion behaviour solves the three conciseness problems (having to delete symbols, having to create a parallel structure, worrying about pollution by relative imports). Thus, this new syntax proposal would not just be a bit of syntactic sugar for producing __all__. It would be a gateway to producing concise external interfaces.
I agree with @jamestwebber that the * form should be discouraged here. If the goal is to produce concise interfaces, it probably shouldn’t be provided. (After all, there is no redundancy problem since you typically either have an externally-imported module that exports its symbols or an externally-imported package that exports the symbols in the module.)