Python : import module once for a whole package

2019-04-12 10:23发布

I'm currently coding an app which is basically structured that way :

main.py
+ Package1
+--- Class1.py
+--- Apps
+ Package2
+--- Class1.py
+--- Apps

So I have two questions : First, inside both packages, there are modules needed by all Apps, eg : re. Is there a way I can import a module for the whole package at once, instead of importing it in every file that needs it ?

And, as you can see, Class1 is used in both packages. Is there a good way to share it between both packages to avoid code duplication ?

3条回答
Animai°情兽
2楼-- · 2019-04-12 10:59

To answer your second question, if your two modules named Class1.py are in fact the same, then you should not copy it to both packages. Place it in a package which will contain only code which is common to both, and then import it. It is absolutely not necessary to copy the file and try to maintain each change in both copies.

查看更多
We Are One
3楼-- · 2019-04-12 11:04

Q1:
You Must find a way to import your package, thus you have two choices:
(Please correct me if I'm wrong or not thorough)

1. Look at James' solution, which you need to define a class, put all the modules inside and finally import them to your Sub-classes

2. Basically import nothing to your Main class, but instead, import only once to your Sub-classes

For example:(inside A_1 subclass) import re
def functionThatUseRe(input): pass

Then inside your main class, just do try: from YourPackage import A_1 #windows except: import A_1 #MAC OSX
A_1.functionThatUseRe("")

And you completely avoided importing modules multiple times

Q2: put your class1.py in the same directory with your main class, or move it to another folder, in Package1(&2).Apps

import Class1

Start using the code from there

查看更多
做自己的国王
4楼-- · 2019-04-12 11:20

I would strongly recommend against doing this: by separating the imports from the module that uses the functionality, you make it more difficult to track dependencies between modules.

If you really want to do it though, one option would be to create a new module called common_imports (for example) and have it do the imports you are after.

Then in your other modules, add the following:

from common_imports import *

This should give you all the public names from that module (including all the imports).

查看更多
登录 后发表回答