When using dpath.merge(x, y) with objects as described below, dpath raises an error when it stumbles into a tuple and appears to treat it like a list and uses extend:
importdpathx= { "foo": [] }
y= { "foo": [("bar", "baz")] }
dpath.merge(x, y)❯ python3.12
Python 3.12.1 (main, Dec 7 2023, 20:45:44) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license"for more information.
>>> import dpath
>>> >>> x = { "foo": [] }
>>> y = { "foo": [("bar", "baz")] }
>>> >>> dpath.merge(x, y)
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/__init__.py", line 279, in merge
filtered_src = search(src, '**', afilter=afilter, separator='/')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/__init__.py", line 245, in search
return segments.fold(obj, f, {})
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/segments.py", line 393, in fold
if f(obj, pair, acc) is False:
^^^^^^^^^^^^^^^^^
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/__init__.py", line 243, in f
segments.set(result, path, found, hints=segments.types(obj, path))
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/segments.py", line 371, inset
extend(current, last_segment)
File "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.1/lib/python3.12/site-packages/dpath/segments.py", line 275, in extend
thing.extend(expansion)
^^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'extend'
>>> I believe that this can be handled by catching the AttributeError that is raised:
| defextend(thing: MutableSequence, index: int, value=None): |
| """ |
| Extend a sequence like thing such that it contains at least index + |
| 1 many elements. The extension values will be None (default). |
| |
| extend(thing, int) -> [thing..., None, ...] |
| """ |
| try: |
| expansion=type(thing)() |
| |
| # Using this rather than the multiply notation in order to support a |
| # wider variety of sequence like things. |
| extra= (index+1) -len(thing) |
| foriinrange(extra): |
| expansion+= [value] |
| thing.extend(expansion) |
| exceptTypeError: |
| # We attempted to extend something that doesn't support it. In |
| # this case we assume thing is actually more like a dictionary |
| # and doesn't need to be extended. |
| pass |
| |
| returnthing |
When using
dpath.merge(x, y)with objects as described below,dpathraises an error when it stumbles into atupleand appears to treat it like a list and usesextend:I believe that this can be handled by catching the
AttributeErrorthat is raised:dpath-python/dpath/segments.py
Lines 260 to 282 in e0d412f