module, *attrs, bases=(), **attrs_with_defaults)

Create a new Data Entity class with provided name and attributes.

Check Data Entities documentation for various use cases.

  • entity_name – The class name for this new Data Entity type.

  • *attrs – Arbitrary names for Python attributes to be associated with objects of this entity.

Keyword Arguments
  • bases – Base data entities for this entity. Can be a string or tuple or list.

  • **attrs_with_defaults – Arbitrary attributes to be associated with objects of this entity, with the defaults that are provided.


You can create objects of newly created data entity just like a normal Python class.

Person = data_entity("Person", "name age")
person = Person(name="SomeName", age=21)


The defaults that are provided can be any of the following:
  • Any Python Object

  • A Python callable

  • Arjuna generator

  • Arjuna composite


Data entity objects behave like Python dictionaries.

So you can retrieve an attribute value as:

# or

Following dict-like operations are valid too. The key difference to note is that in these operations that attributes that have None value are excluded unlike a Python dictionary.

**entity # Unpacking of key-values

# Iterating on keys
for attr in entity:

# Iterating on key-value pairs
for attr, value in entity.items():

To retain keys/attrs corresponding to None values, you can provide remove_none=False as argument:

**entity # Unpacking of key-values

# Iterating on keys
for attr in entity.keys(remove_none=False):

# Iterating on key-value pairs
for attr, value in entity.items(remove_none=False):

Also note that because len() in Python is not flexible to allow for the above, you can use size method:

len(entity) # Will ignore attrs with None value
entity.size() # Will ignore attrs with None value
entity.size(remove_none=False) # Includes attrs with None value

All above mentioned methods also accept remove argument to explicitly exclude one or more attributes by name.

entity.keys(remove={'some_key1', 'some_key2'})

entity.items(remove={'some_key1', 'some_key2'})

entity.size(remove={'some_key1', 'some_key2'})


When you provide one or more bases, the overriding order is B1 -> B2 -> B3 ….. -> This Entity.

At each stage of this chain, you can

  • Add one or more mandatory attributes.

  • Add one or more optional attributes

  • Make an optional attribute in base entity as mandatory.

  • Make a mandatory attribute as optional by assigning a default value.

  • Change the default for an existing default attribute to something else.


Delete operation is disllowed on the data entity because it corresponds to attribute deletion. Use as_dict() method for representation that has one or more keys removed.

# Raises exception
del entity['some_attr']


You can make an object of a data entity IMMUTABLE by passing freeze=True argument.

person = Person(name="SomeName", age=21, freeze=True)
# Raises Exception
person.age = 25