15

Let's say I have some BaseModel, and I want to check that it's options list is not empty. I can perfectly do it with a validator:

class Trait(BaseModel):
    name: str
    options: List[str]

    @validator("options")
    def options_non_empty(cls, v):
        assert len(v) > 0
        return v

Are there any other, more elegant, way to do this?

keddad
  • 1,398
  • 3
  • 14
  • 35
  • I wasn't that clear: I'm not looking to shrink the size of validator function, I'm looking to find a way not to use it at all. – keddad Apr 27 '20 at 21:29

2 Answers2

39

If you want to use a @validator:

return v if v else doSomething

Python assumes boolean-ess of an empty list as False

If you don't want to use a @validator:

In Pydantic, use conlist:

from pydantic import BaseModel, conlist
from typing import List

class Trait(BaseModel):
    name: str
    options: conlist(str, min_items=1)
Kirtiman Sinha
  • 843
  • 8
  • 19
2

In Python, empty lists are falsey, while lists with any number of elements are truthy:

>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool([False])
True
>>> bool([[]])
True

This means that you can simply assert v or assert Trait.options to confirm that the list is non-empty.

water_ghosts
  • 716
  • 5
  • 12