chitralverma commented on code in PR #7812:
URL: https://github.com/apache/opendal/pull/7812#discussion_r3457414420


##########
bindings/python/src/lib.rs:
##########
@@ -43,72 +43,120 @@ use pyo3_stub_gen::{define_stub_info_gatherer, derive::*};
 pub use services::*;
 
 #[pymodule(gil_used = false)]
-fn _opendal(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
-    // Add version
-    m.add("__version__", env!("CARGO_PKG_VERSION"))?;
-
-    // Operator module
-    add_pymodule!(py, m, "operator", [Operator, AsyncOperator])?;
-
-    // File module
-    add_pymodule!(py, m, "file", [File, AsyncFile])?;
-
-    // Capability module
-    add_pymodule!(py, m, "capability", [Capability])?;
-
-    // Services module
-    add_pymodule!(py, m, "services", [PyScheme])?;
-
-    // Layers module
-    add_pymodule!(
-        py,
-        m,
-        "layers",
-        [
-            Layer,
-            CapabilityOverrideLayer,
-            RetryLayer,
-            ConcurrentLimitLayer,
-            MimeGuessLayer
-        ]
-    )?;
-
-    // Types module
-    add_pymodule!(
-        py,
-        m,
-        "types",
-        [Entry, EntryMode, Metadata, PresignedRequest]
-    )?;
-
-    m.add_class::<WriteOptions>()?;
-    m.add_class::<ReadOptions>()?;
-    m.add_class::<ListOptions>()?;
-    m.add_class::<StatOptions>()?;
-    m.add_class::<DeleteOptions>()?;
-
-    // Exceptions module
-    add_pyexceptions!(
-        py,
-        m,
-        "exceptions",
-        [
-            Error,
-            Unexpected,
-            Unsupported,
-            ConfigInvalid,
-            NotFound,
-            PermissionDenied,
-            IsADirectory,
-            NotADirectory,
-            AlreadyExists,
-            IsSameFile,
-            ConditionNotMatch,
-            RateLimited,
-            RangeNotSatisfied,
-        ]
-    )?;
-    Ok(())
+mod _opendal {
+    use pyo3::prelude::*;
+
+    #[pymodule]
+    mod operator {
+        #[pymodule_export]
+        use crate::{AsyncOperator, Operator};
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "operator")
+        }
+    }
+
+    #[pymodule]
+    mod file {
+        #[pymodule_export]
+        use crate::{AsyncFile, File};
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "file")
+        }
+    }
+
+    #[pymodule]
+    mod capability {
+        #[pymodule_export]
+        use crate::Capability;
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "capability")
+        }
+    }
+
+    #[pymodule]
+    mod services {
+        #[pymodule_export]
+        use crate::PyScheme;
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "services")
+        }
+    }
+
+    #[pymodule]
+    mod layers {
+        #[pymodule_export]
+        use crate::{
+            CapabilityOverrideLayer, ConcurrentLimitLayer, Layer, 
MimeGuessLayer, RetryLayer,
+        };
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "layers")
+        }
+    }
+
+    #[pymodule]
+    mod types {
+        #[pymodule_export]
+        use crate::{Entry, EntryMode, Metadata, PresignedRequest};
+
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            crate::register_in_sys(m, "types")
+        }
+    }
+
+    // Exceptions are `PyErr` subtypes, not `#[pyclass]`es, so they are added
+    // procedurally rather than via `#[pymodule_export]`.
+    #[pymodule]
+    mod exceptions {
+        #[pymodule_init]
+        fn init(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> 
pyo3::PyResult<()> {
+            use pyo3::prelude::*;
+
+            use crate::{
+                AlreadyExists, ConditionNotMatch, ConfigInvalid, Error, 
IsADirectory, IsSameFile,
+                NotADirectory, NotFound, PermissionDenied, RangeNotSatisfied, 
RateLimited,
+                Unexpected, Unsupported, add_exceptions,
+            };
+
+            add_exceptions!(

Review Comment:
   It's unaffected. This block only *registers* the exception types on the 
module; error conversion is separate. OpenDAL errors are converted explicitly 
via `.map_err(format_pyerr)` (there's no `From<…> for PyErr` impl in the 
binding), and the `create_exception!` types keep their pyo3-generated 
`From<Self> for PyErr`. None of that is touched by this refactor — verified 
that raising/catching `NotFound` still works end-to-end.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to