from __future__ import annotations

from collections import namedtuple
from dataclasses import dataclass, field
from typing import NamedTuple, TypedDict

#: docstring
SENTINEL = object()


#: docstring
ze_lambda = lambda z=SENTINEL: None


def foo(x, y, z=SENTINEL):
    """docstring"""


@dataclass
class DataClass:
    """docstring"""
    a: int
    b: object = SENTINEL
    c: list[int] = field(default_factory=lambda: [1, 2, 3])


@dataclass(init=False)
class DataClassNoInit:
    """docstring"""
    a: int
    b: object = SENTINEL
    c: list[int] = field(default_factory=lambda: [1, 2, 3])


class MyTypedDict(TypedDict):
    """docstring"""
    a: int
    b: object
    c: list[int]


class MyNamedTuple1(NamedTuple):
    """docstring"""
    a: int
    b: object = object()
    c: list[int] = [1, 2, 3]


class MyNamedTuple2(namedtuple('Base', ('a', 'b'), defaults=(0, SENTINEL))):
    """docstring"""
