Что вы спрашиваете, почему это:
def func(a=[], b = 2):
pass
не является внутренне эквивалентным этому:
def func(a=None, b = None):
a_default = lambda: []
b_default = lambda: 2
def actual_func(a=None, b=None):
if a is None: a = a_default()
if b is None: b = b_default()
return actual_func
func = func()
, за исключением случая прямого вызова func (None , None), которые мы будем игнорировать.
Другими словами, вместо оценки параметров по умолчанию, почему бы не сохранить их каждый из них и оценить их при вызове функции?
Один ответ, вероятно, прямо там - он фактически превратит каждую функцию с параметрами по умолчанию в закрытие. Даже если это все скрыто в интерпретаторе, а не полномасштабное закрытие, данные должны быть где-то сохранены. Он будет медленнее и будет использовать больше памяти.
Я предполагаю, что это фиксированный список. Самый простой способ был бы с провайдером:
public class MyProvider : IProvider
{
public object Create(IContext context)
{
return new Dictionary<string, IMyInterface>{
{"alpha", context.Kernel.Get<ImpClassOne>()},
{"beta", context.Kernel.Get<ImplClassTwo>()}
}
}
public Type Type
{
get { return typeof(IDictionary<string, IMyInterface>); }
}
}
Вы можете зарегистрировать провайдера в своем ядре, например:
kernel.Bind<IDictionary<string, IMyInterface>>().ToProvider<MyProvider>();
, а затем [Inject] для свойства будет использовать провайдер для создания словаря.
В случае, если ключ можно каким-то образом получить / сгенерировать / вычитать из IMyInterface
, например. из свойства Name, тогда есть простое решение.
public class DictionaryProvider : Provider<IDictionary<string, IMyInterface>>
{
private IEmumerable<IMyInterface> instances;
public DictionaryProvider(IEmumerable<IMyInterface> instances>)
{
this.instances = instances;
}
protected override IDictionary<string, IMyInterface> CreateInstance(IContext context)
{
return this.instances.ToDictionary(i => i.Name);
}
}
В противном случае решение ryber, вероятно, является самым простым способом.