Comments (4)
practical use case of macro -- adding defaults to a dictionary before validation
>>> glom({'optional': 'val'}, (Fill([T, Literal(T)]), lambda t: Fill(t), lambda t: Merge(t)))
Merge(Fill([{'optional': 'val'}, T]), init=<class 'dict'>, op=<method 'update' of 'dict' objects>)
base version didn't work for some reason, we should look into this since it is a blocker for macros
>>> glom({'optional': 'val'}, (Fill([T, Literal(T)]), Fill, Merge))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\kurt\workspace\glom\glom\core.py", line 1764, in glom
ret = _glom(target, spec, scope)
File "C:\Users\kurt\workspace\glom\glom\core.py", line 1785, in _glom
return scope[MODE](target, spec, scope)
File "C:\Users\kurt\workspace\glom\glom\core.py", line 1794, in _glom_auto
return _handle_tuple(target, spec, scope)
File "C:\Users\kurt\workspace\glom\glom\core.py", line 1494, in _handle_tuple
nxt = scope[glom](res, subspec, scope)
File "C:\Users\kurt\workspace\glom\glom\core.py", line 1783, in _glom
return spec.glomit(target, scope)
TypeError: glomit() missing 1 required positional argument: 'scope'
from glom.
for comparison, here is the non-marco version
# no macro
lambda defaults: Merge(Fill([defaults, T]))
# macro
lambda defaults: glom(defaults, (Fill([T, Literal(T)]), Fill, Merge))
from glom.
another practical use case -- and this works too
transform a django database configuration to a tableau REST api connection + datasource object
_BUILDER2ASSIGNER = Spec((
Let(type=T[1]),
T[0].items(),
[Invoke(Assign).specs(
lambda t: getattr(T[0], t[0]),
Invoke(Spec).specs(T[1]))],
Fill((
Invoke(Fill).specs(Fill((
Invoke(Invoke).specs(S['type']),
Literal(T)
))),
T,
Literal(T[0])
))
))
"""
_BUILDER2ASSIGNER is a meta-spec to trasform
({'a': 'b', 'c': 'd'}, type)
to
(
Fill( (Invoke(type), T) ),
(
Assign(T[0].a, T[1].b),
Assign(T[0].c, T[1].d
),
T[0]
)
"""
_DICT2LITERALS = Spec((
T.items(),
[Fill((T[0], Invoke(Literal).specs(T[1])))],
dict))
"""
_DICT2LITERALS converts {key: val} to {key: Literal(val)}
"""
def django_db2tableau_conn(project_id, django_db):
"""
convert a django database entry from settings.py into
a tableau data-source with that connection
"""
return glom(
django_db,
_BUILDER2ASSIGNER.glom((
{
'username': 'USER',
'password': 'PASSWORD',
'server_address': 'HOST',
'server_port': 'PORT',
},
TSC.ConnectionItem)))
return glom(
{},
_BUILDER2ASSIGNER.glom((
_DICT2LITERALS.glom({
'connections': [connection],
'datasource_type': 'postgres',
'name': django_db['NAME'],
}),
lambda: TSC.DatasourceItem(project_id)
))
)
from glom.
alright, some real meta-glomming happening
one thing has become clear: for large-scale meta-glom to work well, it needs to be possible to determine the mode statically
this means one of two things:
1- 'compilation' is parallel to execution, with some kind of "test" object floated through the system; something kind of like T
which will accept all operations
2- all modes are themselves compilation steps, which break the various constants out into their equivalent specs; we'd need a fleet of specs with names like auto_dict
and fill_tuple
and then meta-glom would refer to these
from glom.
Related Issues (20)
- glom.grouping is super useful actually HOT 1
- Inconsistent Delete Behavior HOT 5
- Extract nodes from json based on user input preserveing a portion of the higher level object as well HOT 1
- unprintable PathAccessError when using Scope/S
- Assign a target with an object which has a `__setattr__` which returns a callable produces a false positive for `glom.core._has_callable_glomit` HOT 4
- Feature Discussion: More granular `skip_exc` in `Coalesce` HOT 2
- Recurive wildcard produces a StopIteration exception when called on objects containing iterators HOT 2
- GitHub releases not updated for 23.1.0 and 23.1.1 HOT 2
- Scope usage changes from v22 to v23 HOT 7
- Question, how to pull items into an array in a spec? HOT 1
- Replace deprecated imp module with importlib HOT 2
- Traceback mismatch in a couple tests on 3.11+ HOT 8
- `skip` option for Coalesce doesn't seems to work HOT 2
- Inspect output is not clear HOT 1
- replicate logic with Switch HOT 2
- Missing assert in test_mutation.py HOT 1
- Missing assert in test_cli.py
- Enumerate and Assign HOT 2
- Recursive Delete-If-Empty? HOT 6
- Storing dict keys during traversal HOT 3
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 glom.