I opened #27609 to keep track of multiple completion issues. Some additions to what I said above.
1. I would like to move the actual fetch code to run.py, since it is normally executed in the user process. See #27534, but also below.
2. Idle currently differentiates between completion invocation by <tab> or '.' and by <<force-completions>>, which defaults to Cntl-space. I believe a main difference is that it will only call functions in the object expression, as in "f().", in the latter case. I believe the distinction operates by calling for completions or not. (I need to check.)
That distinction can be used here by only importing with <<force-completion>>, and then it should. With that limitation, I think I am now in favor of adding this. Importing a module is roughly equivalent to calling a function. Either can do anything. But the distinction has be known within the fetch code. This could be done with a wrapper function.