Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Different behavior on merge function between the JS lib and the Python lib #329

Open
LiveDevLiberate opened this issue Nov 23, 2024 · 0 comments

Comments

@LiveDevLiberate
Copy link

LiveDevLiberate commented Nov 23, 2024

Hi

Environment: Python 3.11.9 + pip 24.3.1
LIbrary: jmespath 1.0.1

I'm trying to use jmespath to extract some fields from the JSON file. But I got differnt results from the JS library and Python library.
test.json

merge(
    {
        type: type,
        id: id_str
    },
    modules.module_dynamic.{
        title: major.opus.title || archive.title || `发布了动态`,
        desc:  major.opus.summary.text || major.archive.desc,
        covers: major.opus.pics[].url[] || major.archive.covers[]
    },
    orig.modules.module_dynamic.{
        title: major.opus.title || archive.title || `转发了动态`,
        desc:  major.opus.summary.text || major.archive.desc,
        covers: major.opus.pics[].url[] || major.archive.covers[]
    },
    modules.module_author.{
        time: pub_ts
    },
    modules.module_stat.{
        stat: {
            like: like.count,
            comment: comment.count,
            forward: forward.count
        }
    }
)

It's ok, when I use jmespath playground.
image

But when I use the python lib, I got this type error. Looks likes the python library don't merge none values in the merge function.

.venv/lib/python3.11/site-packages/jmespath/__init__.py:12: in search
    return parser.Parser().parse(expression).search(data, options=options)
.venv/lib/python3.11/site-packages/jmespath/parser.py:509: in search
    result = interpreter.visit(self.parsed, value)
.venv/lib/python3.11/site-packages/jmespath/visitor.py:94: in visit
    return method(node, *args, **kwargs)
.venv/lib/python3.11/site-packages/jmespath/visitor.py:171: in visit_function_expression
    return self._functions.call_function(node['value'], resolved_args)
.venv/lib/python3.11/site-packages/jmespath/functions.py:81: in call_function
    return function(self, *resolved_args)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <jmespath.functions.Functions object at 0x7f4fc11dae90>
arguments = ({'id': '1000725331289571330', 'type': 'DYNAMIC_TYPE_DRAW'}, {'covers': ['http://i0.hdslb.com/bfs/new_dyn/10686e544526...greatest evil.', 'title': '发布了动态'}, None, {'time': 1731837923}, {'stat': {'comment': 276, 'forward': 5, 'like': 1784}})
merged = {'covers': ['http://i0.hdslb.com/bfs/new_dyn/10686e544526539b0da871b41339d83a389245745.png'], 'desc': '第六集又双叒叕看爽了[脱单do...s us to our greatest good is also the cause of our greatest evil.', 'id': '1000725331289571330', 'title': '发 布了动态', ...}
arg = None

    @signature({"types": ["object"], "variadic": True})
    def _func_merge(self, *arguments):
        merged = {}
        for arg in arguments:
>           merged.update(arg)
E           TypeError: 'NoneType' object is not iterable

.venv/lib/python3.11/site-packages/jmespath/functions.py:266: TypeError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant