Steven D'Aprano <[EMAIL PROTECTED]> wrote: > On Tue, 02 Dec 2008 11:12:31 +0000, Nick Craig-Wood wrote: > > > I prefer the "from module import function". That means that if "module" > > doesn't supply "function" it raises an exception at compile time, not > > run time when you try to run "module.function". > > Wanna bet? > > > >>> def spam(): > ... from math import harmonic_series > ... return harmonic_series() > ... > >>> dis.dis(spam) > 2 0 LOAD_CONST 1 (-1) > 3 LOAD_CONST 2 (('harmonic_series',)) > 6 IMPORT_NAME 0 (math) > 9 IMPORT_FROM 1 (harmonic_series) > 12 STORE_FAST 0 (harmonic_series) > 15 POP_TOP > > 3 16 LOAD_FAST 0 (harmonic_series) > 19 CALL_FUNCTION 0 > 22 RETURN_VALUE > >>> spam() > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "<stdin>", line 2, in spam > ImportError: cannot import name harmonic_series > > > The same thing happens if the from...import is at the top level of the > module, except that compilation is immediately followed by > execution.
You are technically right I am sure. However the error happens when you import the module with the error in, not when you run stuff from it which is the major difference. $ echo -e "from os import sausage\n" > import_test.py $ python Python 2.5.2 (r252:60911, Sep 29 2008, 21:15:13) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> # This does produce an error >>> import import_test Traceback (most recent call last): File "<stdin>", line 1, in <module> File "import_test.py", line 1, in <module> from os import sausage ImportError: cannot import name sausage >>> $ # This produces an error also $ python import_test.py Traceback (most recent call last): File "import_test.py", line 1, in <module> from os import sausage ImportError: cannot import name sausage $ Unlike $ echo -e "import os\ndef f(): os.sausage\n" > import_test.py $ python Python 2.5.2 (r252:60911, Sep 29 2008, 21:15:13) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> # This doesn't produce an error >>> import import_test >>> # Until you actually call it >>> import_test.f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "import_test.py", line 2, in f def f(): os.sausage AttributeError: 'module' object has no attribute 'sausage' >>> $ # No error here either $ python import_test.py $ > > It then becomes very easy to see which functions you use from any > > given module too. > > If that's important to you. Personally, I find it more useful to know > where a function is defined. We can agree to differ there I'm sure ;-) -- Nick Craig-Wood <[EMAIL PROTECTED]> -- http://www.craig-wood.com/nick -- http://mail.python.org/mailman/listinfo/python-list