Skip to content

Instantly share code, notes, and snippets.

@fuji44
Last active November 19, 2022 08:37
Show Gist options
  • Save fuji44/b469427c49780f1711ccdb0b82af2d8a to your computer and use it in GitHub Desktop.
Save fuji44/b469427c49780f1711ccdb0b82af2d8a to your computer and use it in GitHub Desktop.
Python: Set the value of a nested field in src to an attribute in dest.

Python: Set the value of a nested field in src to an attribute in dest

data.py

from dataclasses import dataclass, field


@dataclass
class Maker:
    id: str = field(default=None)
    name: str = field(default=None)


@dataclass
class Product:
    id: str = field(default=None)
    name: str = field(default=None)
    maker: Maker = field(default=None)

util.py

def set(dest: object, dest_attr: str, src: object, src_field: str):
    if "." not in src_field:
        dest[dest_attr] = getattr(src, src_field)
        return
    fields = src_field.split(".")
    nested_obj = getattr(src, fields[0])
    set(dest, dest_attr, nested_obj, ".".join(fields[1:]))

main.py

from data import Product, Maker
from util import set

maker = Maker(id="m001", name="Maker A")
product = Product(id="p001", name="Product A", maker=maker)

store = {}

set(store, "product_id", product, "id")
set(store, "product_name", product, "name")
set(store, "maker_id", product, "maker.id")
set(store, "maker_name", product, "maker.name")

print(store)
# {'product_id': 'p001', 'product_name': 'Product A', 'maker_id': 'm001', 'maker_name': 'Maker A'}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment