The Craziest fn Thing I've Ever Seen

... And it lives in CPython!

Dataclasses

  • Represent Data
  • Convenient
  • A Decorator
from dataclasses import dataclass


@dataclass
class Person:
    name: str
    age: int
    likes: list

dan = Person("Dan", 33, ["Python", "David Bowie", "French Fries"])

print(dan.name)

Dataclasses in Kotlin

  • Represent Data
  • Convenient
  • val and var
data class User(val name: String, var age: Int)

>>> data class User(val name: String, var age: Int)

>>> val dan = User("Dan", 32)

>>> dan.name = "Johann Wolfgang von Goethe"
java.lang.IllegalAccessError: tried to access 
field Line2$User.name from class Line4

>>> dan.age = 33
>>> dan
User(name=Dan, age=33)

Frozen

@dataclass
class User:
    name: str
    age: int


dan = User("Dan", 35)
print(dan)
print("Aging Dan by one year...")
dan.age = 36
print(dan)
@dataclass(frozen=True)
class FrozenUser:
    name: str
    age: int


guido = FrozenUser("Guido", 29)
print(guido)
print("Aging Guido by one year...")
guido.age = 30
print(guido)
FrozenUser(name='Guido', age=29)
Aging Guido by one year...
Traceback (most recent call last):
  File "demo.py", line 26, in <module>
    guido.age = 30
  File "<string>", line 4, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'age'

What?

    if frozen:
        for fn in _frozen_get_del_attr(cls, field_list, globals):


def _frozen_get_del_attr(cls, fields, globals):
	...
    return (_create_fn('__setattr__',
                      ('self', 'name', 'value'),
                      (f'if type(self) is cls or name in {fields_str}:',
                        ' raise FrozenInstanceError(f"cannot assign to field {name!r}")',
                       f'super(cls, self).__setattr__(name, value)'),
                       locals=locals,
                       globals=globals),
            _create_fn('__delattr__',
                      ('self', 'name'),
                      (f'if type(self) is cls or name in {fields_str}:',
                        ' raise FrozenInstanceError(f"cannot delete field {name!r}")',
                       f'super(cls, self).__delattr__(name)'),
                       locals=locals,
                       globals=globals),
            )

It's used everywhere!

def _init_fn(fields, frozen, has_post_init, self_name):
    ...
    return _create_fn('__init__',
                      [self_name] + [_init_param(f) for f in fields if f.init],
                      body_lines,
                      locals=locals,
                      globals=globals,
                      return_type=None)
  
def _repr_fn(fields):
    return _create_fn('__repr__',
                      ('self',),
                      ['return self.__class__.__qualname__ + f"(' +
                       ', '.join([f"{f.name}={{self.{f.name}!r}}"
                                  for f in fields]) +
                       ')"'])
  

The Craziest Function

def _create_fn(name, args, body, *, globals=None, locals=None,
               return_type=MISSING):
    # Note that we mutate locals when exec() is called.  Caller
    # beware!  The only callers are internal to this module, so no
    # worries about external callers.
    if locals is None:
        locals = {}
    if 'BUILTINS' not in locals:
        locals['BUILTINS'] = builtins
    return_annotation = ''
    if return_type is not MISSING:
        locals['_return_type'] = return_type
        return_annotation = '->_return_type'
    args = ','.join(args)
    body = '\n'.join(f'  {b}' for b in body)

    # Compute the text of the entire function.
    txt = f' def {name}({args}){return_annotation}:\n{body}'

    local_vars = ', '.join(locals.keys())
    txt = f"def __create_fn__({local_vars}):\n{txt}\n return {name}"
    ns = {}
    exec(txt, globals, ns)
    return ns['__create_fn__'](**locals)

Huh?

Let's try it!

add_two_numbers = _create_fn(
    "add_two_numbers",
    ["first_number", "second_number"],
    ["total = first_number + second_number", "print(f'The sum is: {total}')"],
)
add_two_numbers(34, 22)

>>> 56

# Same function, "By hand"
def add_two_numbers(first_number, second_number):
    total = first_number + second_number
    print(f'The sum is: {total}')
    

More!

fields = ["id", "employee_kind"]
# NOTE: Slightly modified from the original source
repr_fun = _create_fn(
    "__repr__",
    ("self",),
    [
        'return self.__class__.__qualname__ + f"('
        + ", ".join([f"{f}={{self.{f}!r}}" for f in fields])
        + ')"'
    ],
)

class Crazy:
    def __init__(self):
        self.id = 123
        self.employee_kind = "Python Dev"

    def __repr__(self):
        return repr_fun(self)


c = Crazy()
print(repr(c))

>>> Crazy(id=123, employee_kind='Python Dev')

What did we learn?

  • Metaprogramming
  • Eric V. Smith & Co.
  •  
CPython != "Scary"

The Craziest Python Function I've Ever Seen

By dlindema

The Craziest Python Function I've Ever Seen

  • 320