Comments (3)
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.
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.
Merged in via #80
from hdl21.
Related Issues (20)
- Custom generated Module naming
- Make more `Sim` types hashable
- Naming Generator-Internal Modules
- Bundle mult not quite workin
- `HierarchyWalker` not hitting instance bundles/ `Pair`
- Nested Generator Naming
- It's probably time for immutable hierarchy walking, compiling, elaboration, etc.
- Some kinda more general connectable Array
- Can't concatenate `NoConn`s
- Doc typo
- Python 3.12 HOT 3
- Smarter tracking of which VLSIR versions _should_ work
- Python 3.7-3.8 and Pydantic v2 HOT 3
- BUG: sky130 pdk pypi Install HOT 2
- Version 6 Release HOT 1
- ASAP Upload Error HOT 1
- Version 7 Release
- Add Signal Save and Save All Support HOT 1
- Faster PortRef handling for Spice export
- Probably just run the codecov ci once HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from hdl21.