Hello, On Tue, 1 Dec 2020 10:59:04 -0500 Ricky Teachey <ri...@teachey.org> wrote:
> Hi Paul it's an interesting proposal. I have a couple clarifying > questions about it. > > On Tue, Dec 1, 2020 at 10:32 AM Paul Sokolovsky <pmis...@gmail.com> > wrote: > > > Effectively, with the current Python execution model, all code is > > executed at "import-time". This proposal seeks to introduce > > well-defined distinction between import-time vs run-time. For this, > > it introduces the `__main__()` function, localted in the `__main__` > > module of the application (from which application execution > > starts). All top-level code in the `__main__` module is executed to > > completion, including code in recursively imported modules. This > > completes the "import-time" phase of the application. After that, > > the `__main__()` function is executed, which begins the "run-time' > > phase. > > Two questions about this. > > 1. What about single module packages? If there is no __main__ module, > how does the interpreter find my __main__() function? The application main module loading happens as usual (whether it's file.py or -m module switch is used). It's just normally, after main module top-level code finishes execution, the interpreter exits (because the application exited). In strict mode instead, interpreter looks up __main__() function in this main module, and executes it. > 2. In order to maintain the distinction between "import time" and "run > time", will it be illegal to explicitly run __main__() in the __main__ > module at import time? If not, would __main__() still be run (a > *second time*) at run time....? Even the "TL;DR" version gives the idiom to make an application (its main module) be compatible with both standard and strict mode. And full version gives the details of why it is so. That's pretty much the simple(st) method, why do you ask for something else? > > ``` > __ > > # import time section > > def __main__(): > # run time > print("foo") > > __main__() > ``` > > Is the output: > > foo > foo Yes, if run in the strict mode, the __main__() will be executed twice. > > ...or it is just: > > foo > > ...? > > > > ## Discussion and implications > > > > The baseline implications should be fairly obvious from the text > > above: > > > > ``` > > def fun(): > > pass > > > > # This (defining the function of the same name) will lead to warning > > # at import-time. > > def fun(): > > pass > > > > import mod > > > > # This (assigning to a var in another module) is possible > > # both at import-time and run-time. > > mod.var = 1 > > > > # This will lead to warning at import-time and RuntimeError at > > runtime. mod.func = lambda *a, **kw: print("Stabbed out!") > > ``` > > > > In the above code snippet, are you assuming that mod.func already > exists, and the last line in the module is redefining the existing > mod.func, and this is what causes the runtime error? Yes, that's it. > > --- > Ricky. -- Best regards, Paul mailto:pmis...@gmail.com _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/HCHRSD7V6IU2YPABZCOH6JEDRP3HW5NM/ Code of Conduct: http://python.org/psf/codeofconduct/