# Test function.__code__ attribute.

try:
    (lambda: 0).__code__
except AttributeError:
    print("SKIP")
    raise SystemExit


def f():
    return a


ftype = type(f)

# Test __code__ access and function constructor.
code = f.__code__
print(type(ftype(code, {})) is ftype)

# Test instantiating multiple code's with different globals dicts.
code = f.__code__
f1 = ftype(code, {"a": 1})
f2 = ftype(code, {"a": 2})
print(f1(), f2())

# Test bad first argument type.
try:
    ftype(None, {})
except TypeError:
    print("TypeError")

# Test bad second argument type.
try:
    ftype(f.__code__, None)
except TypeError:
    print("TypeError")

# Test __code__ on functions with children functions.
code = (lambda: (lambda: a)).__code__
print(ftype(code, {"a": 1})()())
print(ftype(code, {"a": 2})()())
