Probabilmente, non hai davvero bisogno di un'iniezione di dipendenza qui. Ma se lo fai, quindi semplicemente iniettare tramite un parametro di funzione è il modo più semplice per andare in Python. Ricorda: in Python, tutte le variabili incl. i nomi delle classi vengono risolti in fase di esecuzione, quindi è possibile passare oggetti di classe in giro come variabili ordinarie. Ad esempio:
def transform_the_xml(xml, arr, StepClass=DefaultClass):
for i in arr:
j = f(x) # some complex computation
obj = StepClass(i, j)
xml = obj.run(xml)
In alternativa, è possibile "iniettare" una funzione factory che crea un oggetto, ma che non ha un aspetto diverso dal caso precedente (si userebbe solo una convenzione di denominazione diversa per l'argomento).
Si noti che un oggetto con un singolo metodo è solo un modo complicato per scrivere una funzione. Potremmo scrivere in modo equivalente:
def transform_the_xml(xml, arr, step=None):
if step is None:
def step(i, j, xml):
return DefaultClass(i, j).run(xml)
for i in arr:
j = f(x) # some complex computation
xml = step(i, j, xml)
Quindi, puoi facilmente iniettare qualsiasi implementazione di step
desiderata durante il test dell'unità.