Thursday, March 31, 2011

Does python have something like C++'s using keyword?

In C++ you can often drastically improve the readability of your code by careful usage of the "using" keyword, for example:

void foo()
{
    std::vector< std::map <int, std::string> > crazyVector;
    std::cout << crazyVector[0].begin()->first;
}

becomes

void foo()
{
    using namespace std; // limited in scope to foo
    vector< map <int, string> > crazyVector;
    cout << crazyVector[0].begin()->first;
}

Does something similar exist for python, or do I have to fully qualify everything?

I'll add the disclaimer that I know that using has its pitfalls and it should be appropriately limited in scope.

From stackoverflow
  • import X
    

    or

    from X import *
    

    or

    from X import a, b, c
    

    Where X is the Python module you want to use.

    It would be helpful for you to give us a Python code sample that you think needs cleaned up.

  • Sure, python's dynamism makes this trivial. If you had a class buried deep in a namespace: foo.bar.baz.blah, you can do:

    def foo:
        f = foo.bar.baz.blah
        f1 = f()
    
  • As Bill said, Python does have the construction

    from X import *
    

    but you can also explicitly specify which names you want imported from the module (namespace):

    from X import foo, bar, blah
    

    This tends to make the code even more readable/easier to understand, since someone seeing an identifier in the source doesn't need to hunt through all imported modules to see where it comes from. Here's a related question: http://stackoverflow.com/questions/539578/namespace-specification-in-absence-of-ambuguity

    EDIT: in response to Pax's comment, I'll mention that you can also write things like

    import X.foo
    

    but then you'll need to write

    X.foo.moo()
    

    instead of just

    foo.moo()
    

    This is not necessarily a bad thing, of course. I usually use a mixture of the from X import y and import X.y forms, whatever I feel makes my code clearest. It's certainly a subjective thing to some extent.

    paxdiablo : You might want to expand this to include "import X" which then allows you to use X.y things from that module. I sometimes prefer this to reduce polluting the namespace.
    David Zaslavsky : Good call, done ;-)
    Constantin : Why "unlike C++"? Can't you use "using std::string;"?
    David Zaslavsky : Oh yeah, I forgot about that... I'm not primarily a C++ programmer. Python's import is still a little more powerful though, because you can import individual functions and variables, which I don't think is possible in C++.
    Johannes Schaub - litb : David, it's possible in c++ too. (using a "using declaration"). well. can you explain whether you can use python's "import" within functions too, please?
    David Zaslavsky : Generally yes, in Python "import" is a statement that can be used anywhere, say, a function call could be. The wildcard import can only be used at the module level, though.
  • Note that

    from foo import bar
    

    works even if bar is a module in the foo package. This lets you limit your namespace pollution without having to name each function/class in foo.bar that you might care to use. It also aids readers of your code, because they'll see a call to bar.baz() and have a better idea where baz came from.

0 comments:

Post a Comment