Project-wide variable...

Terry Reedy tjreedy at udel.edu
Fri Jun 24 17:19:44 EDT 2011


On 6/24/2011 7:30 AM, Gnarlodious wrote:
> On Jun 24, 12:27 am, Terry Reedy wrote:
>
>>> 1) Can I tell Executable.py to share Data with ModuleTest.py?
>>
>> After the import is complete, yes.
>> import ModuleTest
>> ModuleTest.Data = Data
>>
>> This works if the use of Data is inside a function that is not called
>> during import, not if the use of Data is at toplevel or in a class
>> statement outside a def.
>
> That works! The solution looks like this:
>
> # controlling program:
> from Module import Data
> import ModuleTest
> ModuleTest.Data = Data
> ModuleTest.getData()
>
> # module:
> def getData():
>      print(Data.Plist.Structure)

This is a form of dependency injection, where a caller injects into a 
callee a dependency (callee) of the callee. It can be used even if the 
callee imports a dependency when it is imported. It is useful for 
testing when you want the callee to use a different dependency for 
testing. Simple example:

# MyModule
import socket
def myconnect(*args):
    ... socket.bind()

# Test_MyModule
import mock_socket
import MyModule
MyModule.socket = mock_socket
... test of MyModule, including MyModule.myconnect

Python makes this trivial without requiring that the otherwise constant 
depedency always be injected or passed (in normal production use) as a 
variable.

In your case, you are free to inject different forms of Data if you wish.

-- 
Terry Jan Reedy




More information about the Python-list mailing list