(여담) #[pymodule] 속성

Pt J·2026년 3월 22일
post-thumbnail

#[pymodule] 속성

우리 예제에서는 #[pymodule] 속성을 fn rust_engine() 함수에 붙이고 있지만
maturin init 으로 처음 생성된 src/lib.rs 파일은 다음과 같이 작성되어 있다.

src/lib.rs

use pyo3::prelude::*;

/// A Python module implemented in Rust.
#[pymodule]
mod modularization {
    use pyo3::prelude::*;

    /// Formats the sum of two numbers as string.
    #[pyfunction]
    fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
        Ok((a + b).to_string())
    }
}

PyO3가 Python 모듈을 정의하는 두 가지 서로 다른 스타일로
둘 중 어느 것을 쓰든 상관은 없다.

스타일 비교

mod 스타일 (선언형)

#[pymodule] 뒤에 mod 블록이 오는 방식.

mod 블록 안에 정의된 모든 함수(#[pyfunction])나 구조체(#[pyclass])가
자동으로 Python 모듈의 멤버가 된다.

코드가 짧을 땐 간결하지만,
코드가 길어져서 파일을 나누기 시작하면 관리가 까다로워진다.

maturin init 은 가장 단순한 형태의 예제 탬플릿을 생성하므로
mod 스타일의 간결한 코드를 작성한 것이다.

fn 스타일 (등록형)

#[pymodule] 뒤에 함수 선언이 오는 방식.

Python 모듈 객체(m)를 인자로 받아서
멤버로 사용할 것들을 수동으로 하나씩 등록(add_functionadd_class)한다.
매번 등록해야 한다는 게 번거롭게 느껴질 수 있다.

src/lib.rs 파일을 중앙 관제탑 삼아
다른 파일에 있는 함수를 가져와 등록하기 수월하다.

우리는 백엔드 개발을 위한 기술 스택을 공부하고 있는 것이므로
fn 스타일의 확장성 있는 코드를 사용한 것이다.

결론

단일 파일 규모의 작은 프로젝트의 경우 mod 스타일이 간결하고 편리하다.
하지만 규모가 커질수록 확장성 있는 fn 스타일이 관리하기 수월하다.

프로젝트 규모와 상황에 맞게 적절한 방식을 선택하여 사용하면 된다.
지금까지 진행했던 실습 수준의 코드는 사실 mod 스타일로 충분하다.

profile
Peter J Online Space - since July 2020 | 아무데서나 채용해줬으면 좋겠다

0개의 댓글