Passing information between modules

Roel Schroeven roel at roelschroeven.net
Sun Nov 20 13:50:24 EST 2022


Stefan Ram schreef op 20/11/2022 om 11:39:
>    The idea is about parameterizing the behavior of a module.
>    For example, the module "M" may contain functions that contain
>    "input.read()" to get input and "output.write()" to write
>    output. Then one would write code like (the following is
>    not correct Python code, just pseudo code assuming a possible
>    extended Python where one can assigned to a module before
>    it's loaded):
>
> import sys
>
> M.input = sys.stdin
> M.output = sys.stdout
> import M
>
>    . So now M would use sys.stdin for input and sys.stdout
>    for output.
I feel this is a bad idea. This uses global state for customizing local 
behavior. Yes, maybe you want to customize behavior in one of your 
modules, or even only in some functions, or maybe in several or even all 
of your modules. But by changing module "M", you're changing it for 
*every* user of it, even for standard library modules or third party 
packages. You can't customize it in different ways in different parts of 
your code. And it's a kind of spooky action at a distance: the behavior 
of a module gets changed by another, possibly completely unrelated, 
module. This has the potential to grossly violate the principle of least 
surprise.
>    If someone else would ask this, I'd tell him to use a class:
>
> import MM
> import sys
>
> M = MM.moduleclass( input=sys.stdin, output=sys.stdout )
That is a *much* better solution, and I would even say it's the only 
acceptable solution.
>    , but this is another layer of indirection, so it's a bit
>    more complicated than the direct approach of parameterizing
>    a module.
I'm not even sure it's more complicated. It's more explicit, which I like.

You could have a hybrid approach, like what the random module does. The 
functions in the random module are actually methods of a global hidden 
instance of class random.Random; if you want random generators with 
separate states you can create your own instance(s) of random.Random, or 
of random.SystemRandom.

-- 
"You can fool some of the people all the time, and all of the people some
of the time, but you cannot fool all of the people all of the time."
         -- Abraham Lincoln
"You can fool too many of the people too much of the time."
         -- James Thurber



More information about the Python-list mailing list