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

Rust for Python People

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
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 ...