On 11/03/2016 01:50 AM, teppo.p...@gmail.com wrote:

The guide is written in c++ in mind, yet the concepts stands for any
 programming language really. Read it through and think about it. If
 you come back to this topic and say: "yeah, but it's c++", then you
 haven't understood it.

The ideas (loose coupling, easy testing) are certainly applicable in Python -- 
the specific methods talked about in that paper, however, are not.

To go back to the original example:

def __init__(self, ...):
    self.queue = Queue()

we have several different (easy!) ways to do dependency injection:

* inject a mock Queue into the module
* make queue a default parameter

If it's just testing, go with the first option:

import the_module_to_test
the_module_to_test.Queue = MockQueue

and away you go.

If the class in question has legitimate, non-testing, reasons to specify 
different Queues, then make it a default argument instead:

def __init__(self, ..., queue=None):
    if queue is None:
        queue = Queue()
    self.queue = queue

or, if it's just for testing but you don't want to hassle injecting a MockQueue 
into the module itself:

def __init__(self, ..., _queue=None):
    if _queue is None:
        _queue = Queue()
    self.queue = _queue

or, if the queue is only initialized (and not used) during __init__ (so you can 
replace it after construction with no worries):

class Example:
    def __init__(self, ...):
        self.queue = Queue()

ex = Example()
ex.queue = MockQueue()
# proceed with test

The thing each of those possibilities have in common is that the normal 
use-case of just creating the thing and moving on is the very simple:

my_obj = Example(...)

To sum up:  your concerns are valid, but using c++ (and many other language) 
idioms in Python does not make good Python code.

--
~Ethan~
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to