Git Product home page Git Product logo

Comments (3)

dan-fritchman avatar dan-fritchman commented on August 23, 2024

OK I get what the Pydantic authors were recommending now.
And it doesn't look like this will take much effort.
Stuff like this, works:

from enum import Enum
from typing import Union
from decimal import Decimal
from pydantic import BaseModel, ValidationError, validator
from pydantic.dataclasses import dataclass


class WhatWasIt(Enum):
    STR = 0
    INT = 1
    FLOAT = 2
    DEC = 3
    NONE = 4

class TheIdea(BaseModel):
    number: Decimal
    what_was_it: WhatWasIt = WhatWasIt.STR

    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v: Union["TheIdea", str, int, float, Decimal]) -> "TheIdea":
        if isinstance(v, TheIdea):
            return v  # Done validating
        if isinstance(v, str):
            return TheIdea(number=Decimal(v), what_was_it=WhatWasIt.STR)
        if isinstance(v, int):
            return TheIdea(number=Decimal(v), what_was_it=WhatWasIt.INT)
        if isinstance(v, float):
            return TheIdea(number=Decimal(v), what_was_it=WhatWasIt.FLOAT)
        if isinstance(v, Decimal):
            return TheIdea(number=v, what_was_it=WhatWasIt.DEC)

        raise ValueError("???")


@dataclass
class ParentDataClass:
    stuff: TheIdea


models = [
    ParentDataClass(stuff=TheIdea(number=Decimal("1.0"), what_was_it=WhatWasIt.NONE)),
    ParentDataClass(stuff="1e-3"),
    ParentDataClass(stuff=3),
    ParentDataClass(stuff=3.14159),
    ParentDataClass(stuff=Decimal(0)),
]

[print(m) for m in models]

Here TheIdea is the stand-in for Prefixed.
Very cool!

from hdl21.

dan-fritchman avatar dan-fritchman commented on August 23, 2024

Commit d6e08a8 has (I think) a complete implementation of this.

In a paired change, the Scalar type gets more complicated than just Union[Prefixed, str]. Since we want most numeric-looking things to convert to Prefixed instead of str, it becomes a custom type, with similar pydantic-enabled validation machinery to Prefixed. It attempts to convert strings to numbers, and only if this fails leaves them as "expression literals".

And that "expression literal", non-Prefixed variant of Scalar is also no longer the built-in string, but a new addition: Literal. As discussed in #65, this should probably become a new kind of Module attribute.

from hdl21.

dan-fritchman avatar dan-fritchman commented on August 23, 2024

Merged in via #80

from hdl21.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.