Left Right via Python-list schreef op 9/02/2024 om 17:09:
In order for the "splat" operator to work, the type of the object must
populate slot `tp_as_mapping` with a struct of this type:
https://docs.python.org/3/c-api/typeobj.html#c.PyMappingMethods and
have some non-null implementations of the methods this struct is
supposed to contain.

I can do this in C, but I cannot think of a way to do this in Python
proper.

Looks like it can simply be done in Python, no tp_as_mapping needed. I tried it like Alan Bawden suggested (sibling post of yours):

import random # just as an example
import time   # just as an example
from collections.abc import Mapping

class VirtualKwargs(Mapping):

    def __init__(self):
        self.fncs = {
            # Simple examples of functions with varying return values to be
            # called for each lookup, instead of fixed values.
            'time': time.time,
            'random': random.random,
        }

    def __len__(self):
        return len(self.fncs)

    def __iter__(self):
        return iter(self.fncs)

    def __getitem__(self, key):
        return self.fncs[key]()


def func(**kwargs):
    for k, v in kwargs.items():
        print(f'{k}: {v}')


obj = VirtualKwargs()
func(**obj)


Output (obviously changes every run):

time: 1707497521.175763
random: 0.6765831287385126

--

"Man had always assumed that he was more intelligent than dolphins because
he had achieved so much — the wheel, New York, wars and so on — whilst all
the dolphins had ever done was muck about in the water having a good time.
But conversely, the dolphins had always believed that they were far more
intelligent than man — for precisely the same reasons."
        -- Douglas Adams

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to