InterpolatingIPM device model causes an error with the dependency injection stack
Environment
- Virtual-IPM version: 1.3.1
- Operating system: Ubuntu 16.04
- Python environment: See requirements.txt.
- Configuration: problematic.config.xml
Description
Using InterpolatingIPM
device model results in an error. This is because each DeviceModel
derivative defines its own injection dependencies and since InterpolatingIPM
inherits from BasicIPM
issues a call to super().__init__(particle_supervisor, configuration)
these two components get passed in twice.
Possible solutions:
- Remove the arguments for
super().__init__
inInterpolatingIPM.__init__
. - Use keyword arguments in
super().__init__
instead of positional arguments. - Move the definition of injection dependencies to the base class
DeviceModel
and remove it for each derivative.
Traceback
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 580, in get
return self._context[key]
KeyError: (('DependencyWrapper',),)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 580, in get
return self._context[key]
KeyError: (('simulation',),)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 580, in get
return self._context[key]
KeyError: (('device',),)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 580, in get
return self._context[key]
KeyError: (('device_model',),)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 902, in call_with_injection
**dependencies)
TypeError: __init__() got multiple values for argument 'particle_supervisor'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/venvs/virtual-ipm-dev/bin/virtual-ipm", line 11, in <module>
load_entry_point('virtual-ipm', 'console_scripts', 'virtual-ipm')()
File "~/IPMsim/Virtual-IPM/virtual_ipm/run.py", line 110, in main
thread.setup(create_configuration_from_args())
File "~/IPMsim/Virtual-IPM/virtual_ipm/control/threading.py", line 145, in setup
dependency_wrapper = injector_container.get(binding_key)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 743, in get
result = scope_instance.get(key, binding.provider).get(self)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 582, in get
provider = InstanceProvider(provider.get(self.injector))
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 144, in get
return injector.create_object(self._cls)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 787, in create_object
init(instance, **additional_kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 1152, in inject
kwargs=kwargs
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 894, in call_with_injection
owner_key=self_.__class__ if self_ is not None else callable.__module__,
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 937, in args_to_inject
instance = self.get(key.interface)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 743, in get
result = scope_instance.get(key, binding.provider).get(self)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 582, in get
provider = InstanceProvider(provider.get(self.injector))
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 144, in get
return injector.create_object(self._cls)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 787, in create_object
init(instance, **additional_kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 1152, in inject
kwargs=kwargs
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 894, in call_with_injection
owner_key=self_.__class__ if self_ is not None else callable.__module__,
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 937, in args_to_inject
instance = self.get(key.interface)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 743, in get
result = scope_instance.get(key, binding.provider).get(self)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 582, in get
provider = InstanceProvider(provider.get(self.injector))
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 144, in get
return injector.create_object(self._cls)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 787, in create_object
init(instance, **additional_kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 1152, in inject
kwargs=kwargs
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 894, in call_with_injection
owner_key=self_.__class__ if self_ is not None else callable.__module__,
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 937, in args_to_inject
instance = self.get(key.interface)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 743, in get
result = scope_instance.get(key, binding.provider).get(self)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 60, in wrapper
return function(*args, **kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 582, in get
provider = InstanceProvider(provider.get(self.injector))
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 144, in get
return injector.create_object(self._cls)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 787, in create_object
init(instance, **additional_kwargs)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 1152, in inject
kwargs=kwargs
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 902, in call_with_injection
**dependencies)
File "~/IPMsim/Virtual-IPM/virtual_ipm/simulation/devices/models.py", line 290, in __init__
super(InterpolatingIPM, self).__init__(particle_supervisor, configuration)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 1152, in inject
kwargs=kwargs
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 904, in call_with_injection
reraise(e, CallError(self_, callable, args, dependencies, e, self._stack))
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 73, in reraise
raise exception.with_traceback(tb)
File "~/venvs/virtual-ipm-dev/lib/python3.5/site-packages/injector.py", line 902, in call_with_injection
**dependencies)
injector.CallError: Call to InterpolatingIPM.__init__(<virtual_ipm.simulation.auxiliaries.ParticleSupervisor object at 0x7feb9d046400>, <anna.adaptors.XMLAdaptor object at 0x7feb9d0b4080>, particle_supervisor=<virtual_ipm.simulation.auxiliaries.ParticleSupervisor object at 0x7feb9d046400>, configuration=<anna.adaptors.XMLAdaptor object at 0x7feb9d0b4080>) failed: __init__() got multiple values for argument 'particle_supervisor' (injection stack: [<class 'virtual_ipm.control.threading.DependencyWrapper'>, <class 'virtual_ipm.simulation.simulation.IPMSimulation'>, <class 'virtual_ipm.simulation.devices.manager.DeviceManager'>])
Edited by Dominik Vilsmeier