Importing modules inside python class

PythonClassImportModule

Python Problem Overview


I'm currently writing a class that needs os, stat and some others.

What's the best way to import these modules in my class?

I'm thinking about when others will use it, I want the 'dependency' modules to be already imported when the class is instantiated.

Now I'm importing them in my methods, but maybe there's a better solution.

Python Solutions


Solution 1 - Python

If your module will always import another module, always put it at the top as PEP 8 and the other answers indicate. Also, as @delnan mentions in a comment, sys, os, etc. are being used anyway, so it doesn't hurt to import them globally.

However, there is nothing wrong with conditional imports, if you really only need a module under certain runtime conditions.

If you only want to import them if the class is defined, like if the class is in an conditional block or another class or method, you can do something like this:

condition = True

if condition:
    class C(object):
        os = __import__('os')
        def __init__(self):
            print self.os.listdir

    C.os
    c = C()

If you only want it to be imported if the class is instantiated, do it in __new__ or __init__.

Solution 2 - Python

PEP 8 on imports:

> Imports are always put at the top of the file, just after any module > comments and docstrings, and before module globals and constants.

This makes it easy to see all modules used by the file at hand, and avoids having to replicate the import in several places when a module is used in more than one place. Everything else (e.g. function-/method-level imports) should be an absolute exception and needs to be justified well.

Solution 3 - Python

import sys
from importlib import import_module

class Foo():

    def __init__(self):

	    if self.condition:
            self.importedModule = import_module('moduleName')

        if 'moduleName' in sys.modules:
            self.importedModule.callFunction(params)

        #or

        if self.condition:
            self.importedModule.callFunction(params)

Solution 4 - Python

This (search for the section "Imports") official paper states, that imports should normally be put in the top of your source file. I would abide to this rule, apart from special cases.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaulView Question on Stackoverflow
Solution 1 - PythonagfView Answer on Stackoverflow
Solution 2 - Pythonuser395760View Answer on Stackoverflow
Solution 3 - PythonnvdView Answer on Stackoverflow
Solution 4 - PythonConstantiniusView Answer on Stackoverflow