elasticai.creator.ir.base.required_field#

Module Contents#

Classes#

RequiredField

A descriptor that designates a mandatory field of an abstract ir data class. The descriptor accesses the data dictionary of the owning abstract ir data object to read and write values. You can use the set_convert and get_convert functions to transform values during read/write accesses. That allows to keep dictionary of primitive (serializable) data types in memory, while still providing abstract ways to manipulate that data in complex ways. This is typically required when working with Nodes and Graphs to create new intermediate representations and transform one graph into another.

SimpleRequiredField

ReadOnlyField

ReadOnlyMethodField

StaticMethodField

Functions#

read_only_field

Decorate a method as getter for a read only field.

static_required_field

Decorate a static method as getter for a read only field.

is_required_field

is_required_field_type

register_required_field_type

Data#

API#

elasticai.creator.ir.base.required_field.StoredT#

‘TypeVar(…)’

elasticai.creator.ir.base.required_field.VisibleT#

‘TypeVar(…)’

class elasticai.creator.ir.base.required_field.RequiredField(set_convert: collections.abc.Callable[[elasticai.creator.ir.base.required_field.VisibleT], elasticai.creator.ir.base.required_field.StoredT], get_convert: collections.abc.Callable[[elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT])[source]#

Bases: typing.Generic[elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT]

A descriptor that designates a mandatory field of an abstract ir data class. The descriptor accesses the data dictionary of the owning abstract ir data object to read and write values. You can use the set_convert and get_convert functions to transform values during read/write accesses. That allows to keep dictionary of primitive (serializable) data types in memory, while still providing abstract ways to manipulate that data in complex ways. This is typically required when working with Nodes and Graphs to create new intermediate representations and transform one graph into another.

NOTE: In most cases you want to ensure that the conditions

  • x == get_convert(set_convert(x))

  • x == set_convert(get_convert(x)) hold for all applicable x.

E.g.

>>> from elasticai.creator.ir import IrData
>>> class A(IrData):
...    number: RequiredField[str, int] = RequiredField(set_transform=str, get_transform=int)
>>> a = A({'number': "12"})
>>> a.number = a.number + 3
>>> a.data
{'number': "15"}

Initialization

__slots__#

(‘set_convert’, ‘get_convert’, ‘name’)

__set_name__(owner: type[elasticai.creator.ir.base._has_data.HasData], name: str) None[source]#

IMPORTANT: do not remove owner even though it’s not used see https://docs.python.org/3/reference/datamodel.html#descriptors for more information

__get__(instance: elasticai.creator.ir.base._has_data.HasData, owner=None) elasticai.creator.ir.base.required_field.VisibleT[source]#

IMPORTANT: do not remove owner even though it’s not used see https://docs.python.org/3/reference/datamodel.html#descriptors for more information

__set__(instance: elasticai.creator.ir.base._has_data.HasData, value: elasticai.creator.ir.base.required_field.VisibleT) None[source]#
class elasticai.creator.ir.base.required_field.SimpleRequiredField[source]#

Bases: typing.Generic[elasticai.creator.ir.base.required_field.StoredT]

slots#

(‘name’,)

__set_name__(owner: type[elasticai.creator.ir.base._has_data.HasData], name: str) None[source]#
__get__(instance: elasticai.creator.ir.base._has_data.HasData, owner=None) elasticai.creator.ir.base.required_field.StoredT[source]#
__set__(instance: elasticai.creator.ir.base._has_data.HasData, value: elasticai.creator.ir.base.required_field.StoredT) None[source]#
class elasticai.creator.ir.base.required_field.ReadOnlyField(get_convert: collections.abc.Callable[[elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT])[source]#

Bases: typing.Generic[elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT]

slots#

(‘get_convert’,)

__set_name__(owner: type[elasticai.creator.ir.base._has_data.HasData], name: str) None[source]#
__get__(instance: elasticai.creator.ir.base._has_data.HasData, owner: type[elasticai.creator.ir.base._has_data.HasData] | None = None) elasticai.creator.ir.base.required_field.VisibleT[source]#
class elasticai.creator.ir.base.required_field.ReadOnlyMethodField(get_convert: collections.abc.Callable[[elasticai.creator.ir.base.required_field._HasDataT, elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT])[source]#

Bases: typing.Generic[elasticai.creator.ir.base.required_field._HasDataT, elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT]

__slots__#

(‘get_convert’, ‘name’)

__set_name__(owner: type, name: str) None[source]#
__get__(instance: elasticai.creator.ir.base.required_field._HasDataT, owner=None) elasticai.creator.ir.base.required_field.VisibleT[source]#
class elasticai.creator.ir.base.required_field.StaticMethodField(get_convert: collections.abc.Callable[[elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT])[source]#

Bases: typing.Generic[elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT]

__slots__#

(‘set_convert’, ‘get_convert’, ‘name’)

__set_name__(owner: type, name: str) None[source]#
__get__(instance: elasticai.creator.ir.base.required_field._HasDataT, owner=None) elasticai.creator.ir.base.required_field.VisibleT[source]#
__set__(instance: elasticai.creator.ir.base.required_field._HasDataT, value: elasticai.creator.ir.base.required_field.VisibleT) None[source]#
setter(fn: collections.abc.Callable[[elasticai.creator.ir.base.required_field.VisibleT], elasticai.creator.ir.base.required_field.StoredT]) None[source]#
elasticai.creator.ir.base.required_field.read_only_field(fn: collections.abc.Callable[[elasticai.creator.ir.base.required_field._HasDataT, elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT]) elasticai.creator.ir.base.required_field.ReadOnlyMethodField[elasticai.creator.ir.base.required_field._HasDataT, elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT][source]#

Decorate a method as getter for a read only field.

This works similar to the property decorator, but will automatically pass the content of the .data dictionary to the decorated method, that matches its name, e.g., decorating a method name will call it with self.data['name']. The method will also be bound as an instance method, i.e., the owning instance will be passed as the first argument.

Additionally, the name of the decorated method will be registered as a required field for all other purposes.

Example

from elasticai.creator.ir import IrData, required_field

class MyData(IrData):
    def __init__(self, data: dict[str, Attribute]):
        self.data = data
        self.length_scaling = 2

    @required_field
    def name(self, value: str) -> str:
        return value

    @type.setter
    def _(self, value: str) -> str:
        return value.lower()

For more information see required_field.

elasticai.creator.ir.base.required_field.static_required_field(fn: collections.abc.Callable[[elasticai.creator.ir.base.required_field.StoredT], elasticai.creator.ir.base.required_field.VisibleT]) elasticai.creator.ir.base.required_field.StaticMethodField[elasticai.creator.ir.base.required_field.StoredT, elasticai.creator.ir.base.required_field.VisibleT][source]#

Decorate a static method as getter for a read only field.

Opposed to read_only_field this decorator will not pass the owning instance to the decorated method. This is to avoid hard to catch inconsistencies if the owning instances state changes between read and write operations.

The main purpose of this decorator is to providea a more readable alternative to RequiredField.

Note

Type checkers will not be able to pickup that the decorated methods are static by means of our custom descriptor. That means you will probably have to decorate the method with @staticmethod before applying @static_required_field.

Example

from elasticai.creator.ir import IrData, static_required_field

class MyData(IrData):
    @static_required_field
    @staticmethod
    def length(value: int) -> float:
        return value * 2.0

    @length.setter
    @staticmethod
    def _(value: float) -> int:
        return int(value / 2.0)

See also read_only_field.

elasticai.creator.ir.base.required_field.is_required_field(o: object) typing_extensions.TypeIs[elasticai.creator.ir.base.required_field.RequiredField | elasticai.creator.ir.base.required_field.ReadOnlyField | elasticai.creator.ir.base.required_field.SimpleRequiredField][source]#
elasticai.creator.ir.base.required_field.is_required_field_type(cls: type) typing_extensions.TypeIs[type[elasticai.creator.ir.base.required_field.RequiredField] | type[elasticai.creator.ir.base.required_field.ReadOnlyField] | type[elasticai.creator.ir.base.required_field.RequiredField]][source]#
elasticai.creator.ir.base.required_field.register_required_field_type(cls: type) None[source]#