Я встретил ту же проблему. Выбранное решение мне очень помогло, но я считаю необходимым добавить точность, чтобы сделать функциональный код вопроса: определить лямбда-функцию вне цикла. Кстати, значение по умолчанию не требуется.
foo = lambda d: lambda : self.root.change_directory(d)
for d in directorys:
self.command["cd " + d] = (foo(d))
Причина в следующем предложении в связанных документах:
Они получают инициализированный экземпляр, Атрибут и переданное значение.
blockquote>Для более продвинутой проверки, подпись
def validator(inst, attribute, val)
.Просто измените подписи на
def _validate_polling_interval(_, __, polling_interval):
и
def _validate_batch_size(_, __, batch_size):
, и это будет работать.
Вот полный пример описательной документации: http://www.attrs.org/en/stable/init.html#callables
P.S. Использование утверждений в производственном коде не лучшая идея. Например. запуск
python -O
лишит их. Я бы порекомендовал поднять старый добрыйValueErrors
или даже описательный его подкласс.