monty 0.0.21

A sandboxed, snapshotable Python interpreter written in Rust.
Documentation
# call-external
# Test setattr() builtin function

mut_point = make_mutable_point()

setattr(mut_point, 'x', 100)
assert mut_point.x == 100

setattr(mut_point, 'y', 200)
assert mut_point.y == 200

setattr(mut_point, 'z', 300)
assert mut_point.z == 300

setattr(mut_point, 'name', 'test')
assert mut_point.name == 'test'

setattr(mut_point, 'active', True)
assert mut_point.active == True

result = setattr(mut_point, 'x', 999)
assert result == None

frozen_point = make_point()
try:
    setattr(frozen_point, 'x', 10)
    assert False, 'setattr on frozen dataclass should raise AttributeError'
except AttributeError as e:
    assert str(e) == "cannot assign to field 'x'", str(e)

try:
    setattr()
    assert False, 'setattr() with no args should raise TypeError'
except TypeError as e:
    assert str(e) == 'setattr expected 3 arguments, got 0', str(e)

try:
    setattr(mut_point)
    assert False, 'setattr() with 1 arg should raise TypeError'
except TypeError as e:
    assert str(e) == 'setattr expected 3 arguments, got 1', str(e)

try:
    setattr(mut_point, 'x')
    assert False, 'setattr() with 2 args should raise TypeError'
except TypeError as e:
    assert str(e) == 'setattr expected 3 arguments, got 2', str(e)

try:
    setattr(mut_point, 'x', 10, 'extra')
    assert False, 'setattr() with 4 args should raise TypeError'
except TypeError as e:
    assert str(e) == 'setattr expected 3 arguments, got 4', str(e)

try:
    setattr(mut_point, 123, 'value')
    assert False, 'setattr() with non-string name should raise TypeError'
except TypeError as e:
    assert str(e) == "attribute name must be string, not 'int'", str(e)

try:
    setattr(mut_point, None, 'value')
    assert False, 'setattr() with None name should raise TypeError'
except TypeError as e:
    assert str(e) == "attribute name must be string, not 'NoneType'", str(e)

try:
    setattr(42, 'x', 10)
    assert False, 'setattr on int should raise AttributeError'
except AttributeError as e:
    assert str(e) == "'int' object has no attribute 'x' and no __dict__ for setting new attributes", str(e)

try:
    setattr('hello', 'x', 10)
    assert False, 'setattr on string should raise AttributeError'
except AttributeError as e:
    assert str(e) == "'str' object has no attribute 'x' and no __dict__ for setting new attributes", str(e)