| 619 | |
| 620 | #[pyfunction] |
| 621 | fn getattr( |
| 622 | obj: PyObjectRef, |
| 623 | attr: PyObjectRef, |
| 624 | default: OptionalArg<PyObjectRef>, |
| 625 | vm: &VirtualMachine, |
| 626 | ) -> PyResult { |
| 627 | let attr = attr.try_to_ref::<PyStr>(vm).map_err(|_e| { |
| 628 | vm.new_type_error(format!( |
| 629 | "attribute name must be string, not '{}'", |
| 630 | attr.class().name() |
| 631 | )) |
| 632 | })?; |
| 633 | |
| 634 | if let OptionalArg::Present(default) = default { |
| 635 | Ok(vm.get_attribute_opt(obj, attr)?.unwrap_or(default)) |
| 636 | } else { |
| 637 | obj.get_attr(attr, vm) |
| 638 | } |
| 639 | } |
| 640 | |
| 641 | #[pyfunction] |
| 642 | fn globals(vm: &VirtualMachine) -> PyDictRef { |