1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
# -*- encoding: utf-8 -*-
#
#
# Copyright (C) 2017, 2021, 2022 Jörg Lehmann <joerg@pyx-project.org>
# Copyright (C) 2017, 2021, 2022 André Wobst <wobsta@pyx-project.org>
#
# This file is part of PyX (https://pyx-project.org/).
#
# PyX is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PyX is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PyX; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
def kwsplit(kwargs, parts=None, allow_only_split=False):
"""
.. testsetup::
from pyx.utils import *
>>> kwsplit({"aaa": "bbb"})
({}, {'aaa': 'bbb'})
>>> kwsplit({"aaa": "bbb"}, allow_only_split=True)
Traceback (most recent call last):
...
ValueError: Invalid kwargs: {'aaa': 'bbb'}
>>> kwsplit({"aaa": "bbb"}, ["ccc"])
({}, {'aaa': 'bbb'})
>>> kwsplit({"aaa": "bbb"}, ["aaa"])
({}, {'aaa': 'bbb'})
>>> kwsplit({"aaa_bbb": "ccc"})
({'aaa': {'bbb': 'ccc'}}, {})
>>> kwsplit({"aaa_bbb": "ccc"}, ["aaa"])
({'aaa': {'bbb': 'ccc'}}, {})
>>> kwsplit({"aaa_bbb": "ccc"}, ["ddd"])
({}, {'aaa_bbb': 'ccc'})
>>> kwsplit({"aaa_bbb": "ccc", "ddd_eee": "fff", "ggg": "hhh"})
({'aaa': {'bbb': 'ccc'}, 'ddd': {'eee': 'fff'}}, {'ggg': 'hhh'})
>>> kwsplit({"aaa_bbb": "ccc", "ddd_eee": "fff", "ggg": "hhh"}, ["aaa"])
({'aaa': {'bbb': 'ccc'}}, {'ddd_eee': 'fff', 'ggg': 'hhh'})
"""
split = {}
rest = {}
for key, value in kwargs.items():
try:
part, subkey = key.split("_", 1)
except ValueError:
rest[key] = value
else:
if parts is None or part in parts:
if part not in split:
split[part] = {}
split[part][subkey] = value
else:
rest[key] = value
if allow_only_split and rest:
raise ValueError("Invalid kwargs: %s" % rest)
return split, rest
def merge_members_kwargs(obj, kwargs_updates, member_names):
"""return merge obj's member variables member_names and obj.kwargs with dictionary kwargs"""
new_kwargs = {}
for name in member_names:
new_kwargs[name] = getattr(obj, name)
for kwargs in kwargs_updates:
new_kwargs.update(kwargs)
return new_kwargs
|