On Sun, Aug 14, 2016 at 8:49 PM, BartC <b...@freeuk.com> wrote: > Well, it's using exec(). So it is generating new program code at runtime. > That is possible in quite a few languages, even C.
It doesn't have to; that's only so it doesn't have to manually construct a Function object. Or you could make a simpler __init__ that requires keyword arguments. Here's an exec-free version: def record(name, fieldnames): if isinstance(fieldnames, str): fieldnames = fieldnames.split() class Inner(object): __slots__ = fieldnames def __init__(self, **kwargs): for n in fieldnames: if n in kwargs: setattr(self, n, kwargs[n]) def __repr__(self): fields = ', '.join("%s=%r" % (n, getattr(self, n)) for n in fieldnames) return "record %s(%s)" % (type(self).__name__, fields) Inner.__name__ = Inner.__qualname__ = name return Inner You lose the ability to construct a record with positional args, and you lose the argument name info from help() and other forms of introspection, but it works, and it doesn't use exec. How do you do that in C? Do you have an 'exec' function in C? Certainly not in any of my compilers. The nearest equivalent would be a compile-time directive, eg a preprocessor macro, and that most definitely isn't this flexible. Types just aren't first-class objects in C. ChrisA -- https://mail.python.org/mailman/listinfo/python-list