Passing information between modules

dn PythonList at DancesWithMice.info
Sat Nov 19 14:37:29 EST 2022


On 18/11/2022 23.53, Stefan Ram wrote:
>    Can I use "sys.argv" to pass information between modules
>    as follows?
> 
>    in module A:
> 
> import sys
> sys.argv.append( "Hi there!" )
> 
>    in module B:
> 
> import sys
> message = sys.argv[ -1 ]
> 
>    . "sys.argv" is said to be a list by the standard
>    documentation, so it should be guaranteed to be
>    appendable as lists are appendable.
> 
>    Moreover, in my own program, after its startup, third parties
>    do not inspect "sys.argv". So by appending something to it
>    (or modifying it) I do not tamper with information that might
>    be misinterpreted by any third party outside of my own code.
> 
>    Another hack might be:
> 
>    in module A
> 
> import builtins
> builtins.message = "Hi there!"
> 
>    in module B
> 
> import builtins
> message = builtins.message
> 
>    But I'm not sure whether modules (such as "builtins" here)
>    are guaranteed to be modifyable and visible by the language
>    reference in this way though


The re-use of built-in features is risky, if only because of the remote 
possibility that a future version of Python will add something that 
clashes. That's why Python makes such good (and careful) use of namespaces!

In some respects we have the (OP) problem because Python does not have 
"interfaces" as a formal component of the language. So, we often 
get-away with taking an easier course - but in doing-so, may forget that 
they serve specific purposes.


There is a general idea that globals are harmful, a code-smell, etc; and 
therefore something to be avoided. However, the global namespace is a 
(built-in!) feature of Python, so why not use it?

The problem comes when we try to re-use module A or B in some other 
application. It may not be relatively-obvious that some global, eg 
config, must be previously-defined and made-available. If you're 
prepared to accept that risk - and presumably combat the criticism by 
carefully (and prominently) documenting it, just as with any other 
docstring, where's the problem? (caveat emptor!)


Considering the use-case, it is unlikely to be as trivial as the 
example-given (OP). A classic example would be set of credentials to 
access an RDBMS and specific table(s).

A 'standard' solution is to collect all such configuration-data at the 
start of the application, into an object (or other data-structure) - I 
usually call it "env" (an instantiation of "Environment").

Thereafter, when needing such data within a module, calling the 
particular function/class/method by name (moduleNM.function(...) ), and 
passing only that section of the env[ironment] required. Such achieved 
by passing some sub-structure of env, or by passing a retrieval/get method.
(a module handling GUI, for example, has no business looking at 
RDBMS-creds - which it would be able to do if the whole env was passed!)


but...

the module's code will expect its data in a particular form (an 
interface!), which must be documented and understood by both the 
provider and consumer (people and software)

- which sounds like the same 'solution' to the 'globals problem'...

-- 
Regards,
=dn


More information about the Python-list mailing list