when to use import statements in the header, when to use import statements in the blocks where they are used?

Dave Angel d at davea.name
Tue Feb 7 21:41:49 EST 2012


You forgot to include the list in your reply, so I'm forwarding it for 
you.   One way you could have done it was to reply-all.


On 02/07/2012 09:32 PM, Patto wrote:
> Dave Angel:
>
> On Wed, Feb 8, 2012 at 10:05 AM, Dave Angel<d at davea.name>  wrote:
>
>> On 02/07/2012 08:48 PM, Lei Cheng wrote:
>>
>>> Hi all,
>>>
>>>     In a py file, when to use import statements in the header, when to use
>>> import statements in the blocks where they are used?
>>>     What are the best practices?
>>>     Thanks!
>>>
>>> Pat
>>>
>>>   Best practice is to put all the imports at the beginning of the module,
>> so they are easy to spot.
>>
>> If you put an import inside a function, it gets re-executed each time the
>> function is called, which is a waste of time.  Not too much, since import
>> first checks sys.modules to see if it's already loaded.
>>
>> Also, avoid the     from xxx import *    form, as it pollutes the
>> namespace.  And it makes it hard to figure out where a particular name is
>> declared.
>>
>> I believe these and other best practices can be found in pep8.
>>
>> http://www.python.org/dev/**peps/pep-0008/<http://www.python.org/dev/peps/pep-0008/>
>>
>> --
>>
>> DaveA
>>
>>
> yeah, I read pep8.
> However I find in the file path/to/djcelery/loaders.py from django-celery
> source, there are so many import/from statements used inside functions, I
> do not know why the author coded like this. Are there any special facts?
>

I can't speak for django or django-celery.  There are people that 
disagree on this, and there are some reasons to override the ones I 
mentioned.  One would be large modules that are not used in most 
circumstances, or not used till the program has run for a while.

If you put the import inside a function, you can save on startup time by 
deferring some of the logic till later.  And if there's a module that 
probably won't be used at all (eg. an error handler), perhaps you can 
avoid loading it at all.

I still think readability trumps all the other reasons, for nearly all 
programs.  Only once you decide you have a performance problem should 
you change that.

-- 

DaveA



More information about the Python-list mailing list