basic class question..

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Tue Nov 17 03:19:30 CET 2009


On Sun, 15 Nov 2009 16:26:59 -0800, Pyrot wrote:

> On 11월15일, 오후9시52분, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
>> Pyrot schrieb:
>>
>> > class rawDNA:
>> >    import string
[...]
> (Tthe core reason that I'm bothering with this at all is because I heard
> imports are costly(in time, space, processing power). If this turns out
> to be a non-issue, than my questions regarding Imports are all moot :->)

Importing a module is only costly the first time (in any session) that 
you do so. Modules are cached, so the second time it is relatively fast.


> I forgot to write about my second question which was:
> 
> what happens when I use the import statement within a class/function
> declaration?
> I'm thinking either
> 1) It imports during the class/function declaration 
> 2) It imports the first time a class/function call(x = rawDNA() ) occurs

It imports when the class/function statement is *run*.

def f():
    import math

The body of the function doesn't run until you call the function, so the 
import doesn't happen until you call f().

class K:
    import math
    def method(self):
        import string

The class definition runs when you create the class, which imports math. 
But string is only imported when you call K().method().

> But if it's 2) then is the import valid outside of the function/class?

No. The *name* "math" exists only inside the scope of the function, or 
class, and is not visible outside. 

>>> class K:
...     import math
...
>>> K.math
<module 'math' from '/usr/lib/python2.5/lib-dynload/mathmodule.so'>
>>> math
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined



> what happens when the last function reference is removed?(del x)

You wrote:

x = rawDNA()

Deleting x won't do anything to the class rawDNA, or to the module string 
which is referenced by the rawDNA class.

If you delete the rawDNA class, that won't do anything to the string 
module cached in sys.



> I respect your(or anyone who would like to help me) time, so all I ask
> is some kind of document or "Best practices" guide dealing all about
> "import".


99.9% of the time you don't need to worry about it. Just import the 
modules you want at the top level of your program, and be happy that it 
all works fine.

The other 0.1% of the time, you might have one or two good reasons for 
putting imports inside functions:

(1) Encapsulation: you want to import a module to use in a function, 
without making it visible to other functions.

(2) Just In Time importing. Imports at the top level slow down your 
program's start up. Normally, this is trivial and it is not worth the 
extra complexity to do something about it, but if you have a particularly 
expensive module which happens to be used only in one function which is 
rarely needed, then you can speed up your program for the majority of 
times by putting the import inside that one function.


However, putting imports inside functions which are then called by 
threads can lead to deadlocks. So you also have to balance the risk of 
that happening.



-- 
Steven



More information about the Python-list mailing list