diff --git a/tests/snippets/builtin_ascii.py b/tests/snippets/builtin_ascii.py new file mode 100644 index 0000000000..694c1916c7 --- /dev/null +++ b/tests/snippets/builtin_ascii.py @@ -0,0 +1,4 @@ +assert ascii('hello world') == "'hello world'" +assert ascii('안녕 세상') == "'\\uc548\\ub155 \\uc138\\uc0c1'" +assert ascii('안녕 RustPython') == "'\\uc548\\ub155 RustPython'" +assert ascii(5) == '5' \ No newline at end of file diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index f422688e8e..0affb002d9 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -59,7 +59,19 @@ fn builtin_any(iterable: PyIterable, vm: &VirtualMachine) -> PyResult PyResult { + let repr = vm.to_repr(&obj)?; + let mut ascii = String::new(); + for c in repr.value.chars() { + if c.is_ascii() { + ascii.push(c) + } else { + let hex = format!("\\u{:x}", c as i64); + ascii.push_str(&hex) + } + } + Ok(ascii) +} fn builtin_bin(x: PyIntRef, _vm: &VirtualMachine) -> String { let x = x.as_bigint(); @@ -788,6 +800,7 @@ pub fn make_module(vm: &VirtualMachine, module: PyObjectRef) { "abs" => ctx.new_rustfunc(builtin_abs), "all" => ctx.new_rustfunc(builtin_all), "any" => ctx.new_rustfunc(builtin_any), + "ascii" => ctx.new_rustfunc(builtin_ascii), "bin" => ctx.new_rustfunc(builtin_bin), "bool" => ctx.bool_type(), "bytearray" => ctx.bytearray_type(),