sqlobject использует что-то вроде этого, вот пример:
MyTable.select((MyTable.q.name == "bob") | (MyTable.q.age == 5))
Основная проблема в этом подходе - приоритет операторов.Для этого нужно гораздо больше скобок.Более хороший подход состоит в том, чтобы использовать функции And () и Or () и использовать префиксную нотацию вместо инфиксной нотации.Преимущество этого в том, что он может быть обнаружен новым программистом, который читает ваш код.
В вашем примере выше я бы предложил что-то вроде:
Field(validators=[required, Or(postal_code, zip_code)])
Где все валидаторы в этом спискеAnded вместе неявно.Это упрощает тривиальный случай (тривиальный случай означает «соответствовать всем этим валидаторам») и, следовательно, может иметь довольно сложные выражения, такие как:
Field(validators=Or(And(IsAmerica(), zip_code),
And(Not(IsAmerica()), city))])
Конечно, это всего лишь предположение.Как продемонстрировано, используя & и |отлично работают в некоторых системах (Django, sqlobject).В моем примере вы можете ясно видеть, что сложные случаи имеют проблемы со многими слоями скобок, и это компромисс, который вы должны рассмотреть.