Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust for Python People

Avatar for David Majda David Majda
September 17, 2025

Rust for Python People

You’ve probably heard about Rust — a modern take on a systems programming language. Today, we’ll explore it from the perspective of a Python developer. We’ll cover its most important ideas and concepts, see why it’s almost always a better choice than C/C++, and walk through plenty of code examples to get a sense of what programming in Rust feels like. Finally, we’ll discuss when it makes sense to use Rust in a Python project and learn how to get started (it’s surprisingly easy!).

Presented at Pražské Pyvo #172.

Details:
https://pyvo.cz/praha-pyvo/2025-09/
https://www.meetup.com/pyvo-prague-python-meetup/events/311004663/

Avatar for David Majda

David Majda

September 17, 2025
Tweet

More Decks by David Majda

Other Decks in Programming

Transcript

  1. print("Hello, world!") fn main() { println!("Hello, world!"); } $ python

    hello.py Hello, world! $ cargo build ... $ cargo run ... Hello, world!
  2. i = 42 j = 43 k = i +

    j let i = 42;
  3. i = 42 j = 43 k = i +

    j let i = 42; let j = 43; let k = i + j;
  4. i = 0xFFFF_FFFF_FFFF_FFFF j = 0x0000_0000_0000_0001 k = i +

    j let i = 42; let j = 43; let k = i + j;
  5. i = 0xFFFF_FFFF_FFFF_FFFF j = 0x0000_0000_0000_0001 k = i +

    j let i = 0xFFFF_FFFF_FFFF_FFFF_u64; let j = 0x0000_0000_0000_0001_u64; let k = i + j;
  6. i = 0xFFFF_FFFF_FFFF_FFFF j = 0x0000_0000_0000_0001 k = i +

    j let i = 0xFFFF_FFFF_FFFF_FFFF_u64; let j = 0x0000_0000_0000_0001_u64; let k = i + j;
  7. i = 0xFFFF_FFFF_FFFF_FFFF j = 0x0000_0000_0000_0001 k = i +

    j let i = 0xFFFF_FFFF_FFFF_FFFF_u64; let j = 0x0000_0000_0000_0001_u64; let k = i.wrapping_add(j);
  8. i = 42 j = 43 k = i +

    j let i = 42; let j = 43; let k = i + j;
  9. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g let i = 42; let j = 43; let k = i + j;
  10. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g;
  11. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g;
  12. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g; let t = true; let f = false;
  13. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False n = None let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g; let t = true; let f = false;
  14. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False n = None s = "Hi!" let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g; let t = true; let f = false;
  15. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False n = None s = "Hi!" let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g; let t = true; let f = false; let s = "Hi!";
  16. i = 42 j = 43 k = i +

    j f = 4.2 g = 4.3 h = f + g t = True f = False n = None s = "Hi!" let i = 42; let j = 43; let k = i + j; let f = 4.2; let g = 4.3; let h = f + g; let t = true; let f = false; let s = String::from("Hi!");
  17. squares = [1, 4, 9, 16, 25] let squares =

    Vec::new(); squares.push(1); squares.push(4); ...
  18. squares = [1, 4, 9, 16, 25] let squares =

    Vec::new(); squares.push(1); squares.push(4); ...
  19. squares = [1, 4, 9, 16, 25] let mut squares

    = Vec::new(); squares.push(1); squares.push(4); ...
  20. squares = [1, 4, 9, 16, 25] let mut squares

    = Vec::with_capacity(5); squares.push(1); squares.push(4); ...
  21. squares = [1, 4, 9, 16, 25] languages = {

    "Python", "Rust" } let squares = vec![1, 4, 9, 16, 25];
  22. squares = [1, 4, 9, 16, 25] languages = {

    "Python", "Rust" } let squares = vec![1, 4, 9, 16, 25]; let mut languages = HashSet::with_capacity(2); options.insert("Python"); options.insert("Rust");
  23. squares = [1, 4, 9, 16, 25] languages = {

    "Python", "Rust" } choices = { "yes": "oui", "no": "non", "maybe": "peut-être", } let squares = vec![1, 4, 9, 16, 25]; let mut languages = HashSet::with_capacity(2); options.insert("Python"); options.insert("Rust");
  24. squares = [1, 4, 9, 16, 25] languages = {

    "Python", "Rust" } choices = { "yes": "oui", "no": "non", "maybe": "peut-être", } let squares = vec![1, 4, 9, 16, 25]; let mut languages = HashSet::with_capacity(2); options.insert("Python"); options.insert("Rust"); let mut choices = HashMap::with_capacity(3); choices.insert("yes", "oui"); choices.insert("no", "non"); choices.insert("maybe", "peut-être");
  25. def fib(n): if n == 0: return 0 elif n

    == 1: return 1 else: return fib(n - 1) + fib(n - 2) print(fib(5))
  26. def fib(n): if n == 0: return 0 elif n

    == 1: return 1 else: return fib(n - 1) + fib(n - 2) print(fib(5)) fn fib(n: i32) -> i32 { if n == 0 { 0 } else if n == 1 { 1 } else { fib(n - 1) + fib(n - 2) } } println!(fib(5));
  27. def fib(n): if n == 0: return 0 elif n

    == 1: return 1 else: return fib(n - 1) + fib(n - 2) print(fib(5)) fn fib(n: i32) -> i32 { match n { 0 => 0, 1 => 1, _ => fib(n - 1) + fib(n - 2), } } println!(fib(5));
  28. def fib(n): match n: case 0: return 0 case 1:

    return 1 case _: return fib(n - 1) + fib(n - 2) print(fib(5)) fn fib(n: i32) -> i32 { match n { 0 => 0, 1 => 1, _ => fib(n - 1) + fib(n - 2), } } println!(fib(5));
  29. for y in range(8): for x in range(8): if (x

    + y) % 2 == 0: print('⬜', end='') else: print('⬛', end='') print()
  30. for y in range(8): for x in range(8): if (x

    + y) % 2 == 0: print('⬜', end='') else: print('⬛', end='') print() for y in 0..8 { for x in 0..8 { if (x + y) % 2 == 0 { print!("⬜"); } else { print!("⬛"); } } println!(); }
  31. squares_odd = [i * i for i in range(10) if

    i % 2 == 1] let squares_odd = (0..10) .filter(|i| i % 2 == 1) .map(|i| i * i) .collect::<Vec<_>>();
  32. @dataclass class Color: r: int g: int b: int c

    = Color(255, 0, 0) struct Color { r: u8, g: u8, b: u8, } let c = Color { r: 255, g: 0, b: 0 };
  33. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 c = Color(255, 0, 0) print(c.brightness()) struct Color { r: u8, g: u8, b: u8, } let c = Color { r: 255, g: 0, b: 0 };
  34. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 c = Color(255, 0, 0) print(c.brightness()) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } let c = Color { r: 255, g: 0, b: 0 }; println!("{}", c.brightness());
  35. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def __str__(self): return f"rgb({self.r}, {self.g}, {self.b})" c = Color(255, 0, 0) print(c) print(c.brightness()) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } let c = Color { r: 255, g: 0, b: 0 }; println!("{}", c.brightness());
  36. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def __str__(self): return f"rgb({self.r}, {self.g}, {self.b})" c = Color(255, 0, 0) print(c) print(c.brightness()) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } impl fmt::Display for Color { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "rgb({}, {}, {})", self.r, self.g, self.b) } } let c = Color { r: 255, g: 0, b: 0 }; println!("{c}"); println!("{}", c.brightness());
  37. @dataclass class RGB: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 @dataclass class HSL: h: float s: float l: float def brightness(self): return self.l
  38. @dataclass class RGB: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 @dataclass class HSL: h: float s: float l: float def brightness(self): return self.l struct RGB { r: u8, g: u8, b: u8, } impl RGB { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } struct HSL { h: f64, s: f64, l: f64, } impl HSL { fn brightness(&self) -> f64 { self.l } }
  39. @dataclass class RGB: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 @dataclass class HSL: h: float s: float l: float def brightness(self): return self.l trait Color { fn brightness(&self) -> f64; } struct RGB { ... } impl Color for RGB { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } struct HSL { ... } impl Color for HSL { fn brightness(&self) -> f64 { self.l } }
  40. @dataclass class RGB: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 @dataclass class HSL: h: float s: float l: float def brightness(self): return self.l enum Color { RGB { r: u8, g: u8, b: u8 }, HSL { h: f64, s: f64, l: f64 }, } impl Color { fn brightness(&self) -> f64 { match self { Color::RGB { r, g, b } => { let r = 0.299 * *r as f64; let g = 0.587 * *g as f64; let b = 0.114 * *b as f64; (r + g + b) / 255.0 } Color::HSL { l, .. } => *l, } } }
  41. choices = { "yes": "oui", "no": "non", "maybe": "peut-être", }

    try: print(choices["sometimes"]) except KeyError: print("missing translation!")
  42. choices = { "yes": "oui", "no": "non", "maybe": "peut-être", }

    try: print(choices["sometimes"]) except KeyError: print("missing translation!") let mut choices = HashMap::with_capacity(3); choices.insert("yes", "oui"); choices.insert("no", "non"); choices.insert("maybe", "peut-être"); let result = choices.get("sometimes"); match result { Some(choice) => println!("{choice}"), None => println!("missing translation!"), }
  43. choices = { "yes": "oui", "no": "non", "maybe": "peut-être", }

    try: print(choices["sometimes"]) except KeyError: print("missing translation!") let mut choices = HashMap::with_capacity(3); choices.insert("yes", "oui"); choices.insert("no", "non"); choices.insert("maybe", "peut-être"); let result = choices.get("sometimes"); match result { Some(choice) => println!("{choice}"), None => println!("missing translation!"), } enum Option<T> { None, Some(T), }
  44. try: with open("/etc/passwd", "r") as file: print(file.read()) except Exception as

    e: print(f"error reading file: {e}") let result = fs::read_to_string("/etc/passwd"); match result { Ok(data) => println!("{data}"), Err(e) => println!("error reading file: {e}"), }
  45. try: with open("/etc/passwd", "r") as file: print(file.read()) except Exception as

    e: print(f"error reading file: {e}") let result = fs::read_to_string("/etc/passwd"); match result { Ok(data) => println!("{data}"), Err(e) => println!("error reading file: {e}"), } enum Result<T, E> { Ok(T), Err(E), }
  46. i1 = 42 i2 = i1 s1 = "Hi!" s2

    = s1 let i1 = 42; let i2 = i1;
  47. i1 = 42 i2 = i1 s1 = "Hi!" s2

    = s1 let i1 = 42; let i2 = i1; let s1 = String::from("Hi!"); let s2 = s1;
  48. i1 = 42 i2 = i1 s1 = "Hi!" s2

    = s1 let i1 = 42; let i2 = i1; let s1 = String::from("Hi!"); let s2 = s1;
  49. i1 = 42 print(i1) i2 = i1 print(i1) s1 =

    "Hi!" print(s1) s2 = s1 print(s1) let i1 = 42; let i2 = i1; let s1 = String::from("Hi!"); let s2 = s1;
  50. i1 = 42 print(i1) i2 = i1 print(i1) s1 =

    "Hi!" print(s1) s2 = s1 print(s1) let i1 = 42; println!("{i1}"); let i2 = i1; println!("{i1}"); let s1 = String::from("Hi!"); println!("{s1}"); let s2 = s1; println!("{s1}");
  51. i1 = 42 print(i1) i2 = i1 print(i1) s1 =

    "Hi!" print(s1) s2 = s1 print(s1) let i1 = 42; println!("{i1}"); let i2 = i1; println!("{i1}"); let s1 = String::from("Hi!"); println!("{s1}"); let s2 = s1; println!("{s1}");
  52. @dataclass class Color: r: int g: int b: int def

    print_color(c): print(f"rgb({c.r}, {c.g}, {c.b}") c = Color(255, 0, 0) print_color(c) print_color(c)
  53. @dataclass class Color: r: int g: int b: int def

    print_color(c): print(f"rgb({c.r}, {c.g}, {c.b}") c = Color(255, 0, 0) print_color(c) print_color(c) struct Color { r: u8, g: u8, b: u8, } fn print_color(c: Color) { println!("rgb({}, {}, {})", c.r, c.g, c.b); } let c = Color { r: 255, g: 0, b: 0 }; print_color(c) print_color(c)
  54. @dataclass class Color: r: int g: int b: int def

    print_color(c): print(f"rgb({c.r}, {c.g}, {c.b}") c = Color(255, 0, 0) print_color(c) print_color(c) struct Color { r: u8, g: u8, b: u8, } fn print_color(c: Color) { println!("rgb({}, {}, {})", c.r, c.g, c.b); } let c = Color { r: 255, g: 0, b: 0 }; print_color(c) print_color(c)
  55. @dataclass class Color: r: int g: int b: int def

    print_color(c): print(f"rgb({c.r}, {c.g}, {c.b}") c = Color(255, 0, 0) print_color(c) print_color(c) struct Color { r: u8, g: u8, b: u8, } fn print_color(c: &Color) { println!("rgb({}, {}, {})", c.r, c.g, c.b); } let c = Color { r: 255, g: 0, b: 0 }; print_color(&c) print_color(&c)
  56. @dataclass class Color: r: int g: int b: int def

    invert_color(c): c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b c = Color(255, 0, 0) invert_color(c) struct Color { r: u8, g: u8, b: u8, } fn print_color(c: &Color) { println!("rgb({}, {}, {})", c.r, c.g, c.b); } let c = Color { r: 255, g: 0, b: 0 }; print_color(&c) print_color(&c)
  57. @dataclass class Color: r: int g: int b: int def

    invert_color(c): c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b c = Color(255, 0, 0) invert_color(c) struct Color { r: u8, g: u8, b: u8, } fn invert_color(c: &Color) { c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b } let c = Color { r: 255, g: 0, b: 0 }; invert_color(&c)
  58. @dataclass class Color: r: int g: int b: int def

    invert_color(c): c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b c = Color(255, 0, 0) invert_color(c) struct Color { r: u8, g: u8, b: u8, } fn invert_color(c: &Color) { c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b } let c = Color { r: 255, g: 0, b: 0 }; invert_color(&c)
  59. @dataclass class Color: r: int g: int b: int def

    invert_color(c): c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b c = Color(255, 0, 0) invert_color(c) struct Color { r: u8, g: u8, b: u8, } fn invert_color(c: &mut Color) { c.r = 255 - c.r c.g = 255 - c.g c.b = 255 - c.b } let mut c = Color { r: 255, g: 0, b: 0 }; invert_color(&mut c)
  60. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0
  61. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } }
  62. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def brighter(a, b): a if a.brightness() > b.brightness() else b c1 = Color(255, 0, 0) c2 = Color(0, 255, 0) c3 = brighter(c1, c2) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } }
  63. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def brighter(a, b): a if a.brightness() > b.brightness() else b c1 = Color(255, 0, 0) c2 = Color(0, 255, 0) c3 = brighter(c1, c2) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } fn brighter(a: &Color, b: &Color) -> &Color { if a.brightness() > b.brightness() { a } else { b } } let c1 = Color { r: 255, g: 0, b: 0 }; let c2 = Color { r: 0, g: 255, b: 0 }; let c3 = brighter(c1, c2);
  64. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def brighter(a, b): a if a.brightness() > b.brightness() else b c1 = Color(255, 0, 0) c2 = Color(0, 255, 0) c3 = brighter(c1, c2) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } fn brighter(a: &Color, b: &Color) -> &Color { if a.brightness() > b.brightness() { a } else { b } } let c1 = Color { r: 255, g: 0, b: 0 }; let c2 = Color { r: 0, g: 255, b: 0 }; let c3 = brighter(c1, c2);
  65. @dataclass class Color: r: int g: int b: int def

    brightness(self): r = 0.299 * self.r g = 0.587 * self.g b = 0.114 * self.b return (r + g + b) / 255.0 def brighter(a, b): a if a.brightness() > b.brightness() else b c1 = Color(255, 0, 0) c2 = Color(0, 255, 0) c3 = brighter(c1, c2) struct Color { r: u8, g: u8, b: u8, } impl Color { fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } fn brighter<'a>( a: &'a Color, b: &'a Color, ) -> &'a Color { if a.brightness() > b.brightness() { a } else { b } } let c1 = Color { r: 255, g: 0, b: 0 }; let c2 = Color { r: 0, g: 255, b: 0 }; let c3 = brighter(c1, c2);
  66. def square(x): return x * x def test_square(): assert square(0)

    == 0 assert square(5) == 25 assert square(-5) == 25 fn square(x: i32) -> i32 { x * x }
  67. def square(x): return x * x def test_square(): assert square(0)

    == 0 assert square(5) == 25 assert square(-5) == 25 fn square(x: i32) -> i32 { x * x } #[cfg(test)] mod tests { use super::*; #[test] fn square_works() { assert_eq!(square(0), 0); assert_eq!(square(5), 25); assert_eq!(square(-5), 25); } }
  68. def square(x): return x * x def test_square(): assert square(0)

    == 0 assert square(5) == 25 assert square(-5) == 25 fn square(x: i32) -> i32 { x * x } #[cfg(test)] mod tests { use super::*; #[test] fn square_works() { assert_eq!(square(0), 0); assert_eq!(square(5), 25); assert_eq!(square(-5), 25); } } $ pytest ...
  69. def square(x): return x * x def test_square(): assert square(0)

    == 0 assert square(5) == 25 assert square(-5) == 25 fn square(x: i32) -> i32 { x * x } #[cfg(test)] mod tests { use super::*; #[test] fn square_works() { assert_eq!(square(0), 0); assert_eq!(square(5), 25); assert_eq!(square(-5), 25); } } $ pytest ... $ cargo test ...
  70. We didn’t cover… • Visibility and privacy • Modules •

    Smart pointers • Macros • Concurrency • Asynchronous programming • Unsafe code • …
  71. pub struct Color { pub r: u8, pub g: u8,

    pub b: u8, } impl Color { pub fn new(r: u8, g: u8, b: u8) -> Color { Color { r, g, b } } pub fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } }
  72. use pyo3::prelude::*; #[pyclass] pub struct Color { #[pyo3(get, set)] pub

    r: u8, #[pyo3(get, set)] pub g: u8, #[pyo3(get, set)] pub b: u8, } #[pymethods] impl Color { #[new] pub fn new(r: u8, g: u8, b: u8) -> Color { Color { r, g, b } } pub fn brightness(&self) -> f64 { let r = 0.299 * self.r as f64; let g = 0.587 * self.g as f64; let b = 0.114 * self.b as f64; (r + g + b) / 255.0 } } #[pymodule] mod color { #[pymodule_export] use super::Color; }
  73. [package] name = "color" version = "0.1.0" edition = "2024"

    [lib] crate-type = ["cdylib"] [dependencies] pyo3 = "0.26.0"
  74. [package] name = "color" version = "0.1.0" edition = "2024"

    [lib] crate-type = ["cdylib"] [dependencies] pyo3 = "0.26.0" $ cargo build ...