Extended import syntax for aliasing module attributes

Hi all,
I would like to propose a potential addition to Python’s import syntax that would improve clarity and ergonomics for cases where developers want both full module access and a local alias to a specific attribute within that module.

Currently, to get both behaviors, we typically write:
import module
optimize = module.optimize

This works fine, but it is slightly verbose and less explicit in intent.

I would like to explore syntax like:
import module with module.optimize as optimize
or possibly:
import module with (
module.optimize as optimize,
module.validate as check
)

The goal is to import the full module as usual, while simultaneously assigning a local name to a chosen sub-attribute all in a single declaration.

This strikes a balance between:
Readability (makes intensions clearer)
Convenience (avoids repetitive alias assignments)
Maintainability (discourages from module import *)

I am curious to hear whether this type of syntax has been considered before, or if it might be worth formalizing into a PEP. I would be happy to help develop a draft proposal if there is interest.

Thank you for reading.
-Omar

import module
from module import optimize, validate as check

I don’t find this unreadable, inconvenient, or difficult to maintain.

13 Likes

Thank you that clarifies things.

There’s some prior art in Rust with the self keyword:

use std::collections::hash_map::{self, HashMap};

fn bar(map1: HashMap<String, usize>, map2: hash_map::HashMap<String, usize>){}

fn main() {

    // Both `hash_map` and `HashMap` are in scope.
    let map1 = HashMap::new();
    let map2 = hash_map::HashMap::new();
    bar(map1, map2);
}

I’m not a big fan of how Rust’s imports work in general, and I think this will add unnecessary complexity for very little gain.

2 Likes