Organizing code - import question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Brian Blais

    #1

    Organizing code - import question

    Hello,

    I am trying to organize some of my code, and am having a little trouble with the
    import logic. I find I often have something like:

    MyPackage/
    Part1/ # wants to use functions in Common/
    __init__.py # does "from MyClass1 import MyClass1", etc,...
    MyClass1.py
    MyClass1a.py # depends on MyClass1
    MyClass1b.py # depends on MyClass1

    Part2/ # wants to use functions in Common/
    __init__.py # does "from MyClass2 import MyClass2", etc,...
    MyClass2.py # depends on MyClass1 also, such as containing a list of MyClass1
    MyClass2a.py # depends on MyClass2
    MyClass2b.py # depends on MyClass2

    Common/
    __init__.py # does "import fun1,fun2", etc,...
    fun1.py
    fun2.py



    So I have some common utilities that both classes want to access, and I have two
    separate class definitions, of which one depends on the other. In MyClass2.py, I
    can't seem to do:

    import Common.fun1

    or

    from Part1.MyClass1 import MyClass1


    I think I am either missing some syntax/path thing, or I am thinking about the
    organization in entirely the wrong way. Currently, as a hack, I am simply copying
    the code from Common into the other two directories, and making a link to the Part1
    directory in the Part2 so I can import it. There must be a better way, yes?


    thanks,

    Brian Blais

    --
    -----------------

    bblais@bryant.e du

  • Carlos Hanson

    #2
    Re: Organizing code - import question

    On May 3, 8:41 am, Brian Blais <bbl...@bryant. eduwrote:
    Hello,
    >
    I am trying to organize some of my code, and am having a little trouble with the
    import logic. I find I often have something like:
    >
    MyPackage/
    Part1/ # wants to use functions in Common/
    __init__.py # does "from MyClass1 import MyClass1", etc,...
    MyClass1.py
    MyClass1a.py # depends on MyClass1
    MyClass1b.py # depends on MyClass1
    >
    Part2/ # wants to use functions in Common/
    __init__.py # does "from MyClass2 import MyClass2", etc,...
    MyClass2.py # depends on MyClass1 also, such as containing a list of MyClass1
    MyClass2a.py # depends on MyClass2
    MyClass2b.py # depends on MyClass2
    >
    Common/
    __init__.py # does "import fun1,fun2", etc,...
    fun1.py
    fun2.py
    >
    So I have some common utilities that both classes want to access, and I have two
    separate class definitions, of which one depends on the other. In MyClass2.py, I
    can't seem to do:
    >
    import Common.fun1
    >
    or
    >
    from Part1.MyClass1 import MyClass1
    >
    I think I am either missing some syntax/path thing, or I am thinking about the
    organization in entirely the wrong way. Currently, as a hack, I am simply copying
    the code from Common into the other two directories, and making a link to the Part1
    directory in the Part2 so I can import it. There must be a better way, yes?
    >
    thanks,
    >
    Brian Blais
    >
    --
    -----------------
    >
    bbl...@bryant.e du
    http://web.bryant.edu/~bblais
    It looks like you need __init__.py in MyPackage. Then you can import
    starting with MyPackage. For example, you might use one of the
    following:

    import MyPackage
    from MyPackage.Commo n import *
    etc

    --
    Carlos Hanson

    Comment

    • Brian Blais

      #3
      Re: Organizing code - import question

      Carlos Hanson wrote:
      It looks like you need __init__.py in MyPackage. Then you can import
      starting with MyPackage. For example, you might use one of the
      following:
      >
      import MyPackage
      from MyPackage.Commo n import *
      etc
      >
      that means that MyPackage must be in the sys path too? It doesn't seem like a
      contained-module sees the container in any way.


      bb


      --
      -----------------

      bblais@bryant.e du

      Comment

      • Gabriel Genellina

        #4
        Re: Organizing code - import question

        En Thu, 03 May 2007 12:41:00 -0300, Brian Blais <bblais@bryant. edu>
        escribió:
        I am trying to organize some of my code, and am having a little trouble
        with the import logic. I find I often have something like:
        >
        MyPackage/
        Part1/ # wants to use functions in Common/
        __init__.py # does "from MyClass1 import MyClass1", etc,...
        MyClass1.py
        MyClass1a.py # depends on MyClass1
        MyClass1b.py # depends on MyClass1
        >
        Part2/ # wants to use functions in Common/
        __init__.py # does "from MyClass2 import MyClass2", etc,...
        MyClass2.py # depends on MyClass1 also, such as containing a
        list of MyClass1
        MyClass2a.py # depends on MyClass2
        MyClass2b.py # depends on MyClass2
        >
        Common/
        __init__.py # does "import fun1,fun2", etc,...
        fun1.py
        fun2.py
        >
        >
        >
        So I have some common utilities that both classes want to access, and I
        have two separate class definitions, of which one depends on the other.
        In MyClass2.py, I can't seem to do:
        >
        import Common.fun1
        >
        or
        >
        from Part1.MyClass1 import MyClass1
        To be able to do that, MyPackage should be on sys.path
        If its *container* (i.e. the directory containing MyPackage, perhaps
        site-packages) is already on sys.path, you could prefix all imports with
        the package name: import MyPackage.Commo n.fun1, or from MyPackage.Part1
        import MyClass1
        (Dont forget the __init__.py on MyPackage, to make it a real package)

        If you are using Python 2.5, you can use relative imports. Read the
        "What's new" document. In MyClass2.py you could use, then: from ..Common
        import fun1, or: from ..Part1.MyClass 1 import MyClass1

        --
        Gabriel Genellina

        Comment

        • Carlos Hanson

          #5
          Re: Organizing code - import question

          On 5/3/07, Brian Blais <bblais@bryant. eduwrote:
          Carlos Hanson wrote:
          It looks like you need __init__.py in MyPackage. Then you can import
          starting with MyPackage. For example, you might use one of the
          following:

          import MyPackage
          from MyPackage.Commo n import *
          etc
          >
          that means that MyPackage must be in the sys path too? It doesn't seem like a
          contained-module sees the container in any way.
          >
          That is exactly right. Without being in the sys path, Python does not
          know where to look to resolve the import statements.


          --
          Carlos Hanson

          Comment

          Working...