Это более длинная версия ответа Дарина:
public class CustomAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value.GetType() == typeof(Foo))
{
Foo bar = (Foo)value;
//compare the properties and return the result
}
throw new InvalidOperationException("This attribute is only valid for Foo objects");
}
}
и использование:
[MetadataType(typeof(FooMD))]
public partial class Foo
{
... functions ...
}
[Custom]
public class FooMD
{
... other data annotations ...
}
Ошибка будет отображаться в @Html.ValidationSummary(false)
map
может быть микроскопически быстрее в некоторых случаях (когда вы НЕ делаете лямбда для этой цели, а используете ту же функцию в map и listcomp). Понимание списков может быть быстрее в других случаях, и большинство (не все) питонистов считают их более прямыми и ясными.
Пример крошечного преимущества карты в скорости при использовании точно такой же функции:
$ python -mtimeit -s'xs=range(10)' 'map(hex, xs)'
100000 loops, best of 3: 4.86 usec per loop
$ python -mtimeit -s'xs=range(10)' '[hex(x) for x in xs]'
100000 loops, best of 3: 5.58 usec per loop
Пример того, как сравнение производительности полностью переворачивается, когда map требуется лямбда:
$ python -mtimeit -s'xs=range(10)' 'map(lambda x: x+2, xs)'
100000 loops, best of 3: 4.24 usec per loop
$ python -mtimeit -s'xs=range(10)' '[x+2 for x in xs]'
100000 loops, best of 3: 2.32 usec per loop
Я считаю, что понимание списков, как правило, более выражает то, что я пытаюсь сделать, чем map
- они оба справляются с задачей, но первое избавляет от умственной нагрузки на попытки чтобы понять, что может быть сложным лямбда
выражением.
Там также есть интервью (я не могу найти его сразу), где Гвидо перечисляет лямбда
и функциональные функции как то, о чем он больше всего сожалеет о принятии в Python, так что вы можете утверждать, что они не являются питоническими в силу этого.
Вот один из возможных случаев:
map(lambda op1,op2: op1*op2, list1, list2)
по сравнению с:
[op1*op2 for op1,op2 in zip(list1,list2)]
Я предполагаю, что zip () - это досадные и ненужные накладные расходы, которые вам нужно потакать, если вы настаиваете на использовании понимания списков вместо этого карты. Было бы здорово, если бы кто-нибудь прояснил это утвердительно или отрицательно.