import problem

Mohsen Pahlevanzadeh mohsen at pahlevanzadeh.org
Mon Sep 16 02:44:12 EDT 2013


On Mon, 2013-09-16 at 02:56 +0000, Steven D'Aprano wrote:
> On Mon, 16 Sep 2013 06:53:26 +0430, Mohsen Pahlevanzadeh wrote:
> 
> > Dear all,
> > 
> > i have the following two line codes:
> > ############################
> >     	import  ui.interface.interface
> > 	obj = ui.interface.interface.InterfaceCodes()
> > ###########################333
> > I have same code in another package and work fine. but i get the :
> > 
> > #####################################################3 
> 
> This traceback following suggests that your package is a complete tangled 
> mess of wild card imports. Perhaps I am misreading something, but the 
> following suggests that your package is highly coupled, with strong 
> dependencies between different modules. This is a poor design and will 
> give you many, many problems. As you are already having.
> 
> Do you understand what I mean when I talk about modules being "highly 
> coupled"?
> 
> Are you a Java or C++ developer learning Python? Your code suggests to me 
> that you might be. If you are, you should read these to get some ideas of 
> how your Java intuitions will lead you astray in Python:
> 
> http://dirtsimple.org/2004/12/python-is-not-java.html
> http://dirtsimple.org/2004/12/java-is-not-python-either.html
> 
> 
> I assume that everything under the "amlak" directory is your code. Is 
> that correct?
> 
> Here's the traceback again:
> 
> > Traceback (most
> > recent call last):
> >   File "./main.py", line 31, in <module>
> >     from materials.materials import *
> >   File "/home/mohsen/codes/amlak/amlak/src/materials/materials.py", line
> > 40, in <module>
> >     from  ui.interface.interface import *
> >   File "/home/mohsen/codes/amlak/amlak/src/ui/interface/interface.py",
> > line 32, in <module>
> >     from ui.materialsFrame import *
> >   File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFrame.py", line
> > 24, in <module>
> >     from ui.materialsFindFrame import *
> >   File "/home/mohsen/codes/amlak/amlak/src/ui/materialsFindFrame.py",
> > line 14, in <module>
> >     from common.objects.objects import *
> >   File "/home/mohsen/codes/amlak/amlak/src/common/objects/objects.py",
> > line 28, in <module>
> >     obj = ui.interface.interface.InterfaceCodes()
> > AttributeError: 'module' object has no attribute 'interface'
> > ########################################### 
> 
> 
> So your main module does a wild-card import from materials.materials, 
> which does a wild-card import from ui.interface.interface, which does a 
> wild-card import from ui.materialsFrame, which does a wild-card import 
> from ui.materialsFindFrame, which does a wild-card import from 
> common.objects.objects, which requires ui.interface.interface to have 
> already been loaded and imported. But it hasn't been, because it is still 
> being imported.
> 
> The *immediate* problem is that, in effect, before you can import 
> ui.interface.interface, you need to import ui.interface.interface. 
> Obviously this is going to cause you problems. Google on "recursive 
> imports" to learn about the sorts of problems and how to avoid them.
> 
> The second problem is that, in general, you should try to avoid wild-card 
> imports. They're not always bad, but they were really invented for use in 
> the interactive interpreter so you can do things like this:
> 
> from math import *
> sqrt(42)
> sin(1.5)
> 
> 
> Using them inside non-interactive code is not forbidden exactly, but it 
> is frowned upon since it makes understanding your code harder.
> 
> The third problem is that your code layout looks like you are fighting 
> Python, trying to force it to be something it is not. For starters, if 
> you're writing packages that look like this:
> 
> ui.interface.interface
> 
> that's simply poor design for Python. My guess is that you might be 
> following the Java convention of putting exactly one class per source 
> file. That is not the way Python code should be written. Modules should 
> contain all the related classes and functions, at least up to the point 
> that the module becomes so large that it is painful to work with. How 
> large is that? In my opinion, this is getting close to the maximum I 
> personally would be comfortable with:
> 
> http://hg.python.org/cpython/file/3.3/Lib/decimal.py
> 
> 
> although some people might be happy with large files.
> 
> But what is important is that related code should be together in the one 
> file, not split across multiple modules and multiple packages.
> 
> If you are trying to "future proof" your code, and thinking "today it is 
> small, but one day it will be big and will need to be a package with 
> dozens of modules", that doesn't matter. Don't write the code you think 
> you will need in five years. Write the code you need now. Google "YAGNI" 
> for more.
> 
> I am sorry that I cannot just give you a simple one-line fix for your 
> error. As far as I can see, the fix is to re-design the package so that 
> it is flatter, with fewer imports, and avoid the recursive import.
> 
> Good luck!
> 
> 
> 
> -- 
> Steven
Dear Steven,

I moved all of files to root of source directory, And create an put my
constructor to objects.py file :
#################################
interfaceCodesObj =  interface.InterfaceCodes()
#############################333
And in another files that i import object such as:
######################
from objects import * 
######################
i get the the folloiwing traceback:
####################################3
Traceback (most recent call last):
  File "/home/mohsen/codes/amlak/amlak/src/materialsFindFrame.py", line
187, in <lambda>
    QtCore.QObject.connect(self.checkBox,
QtCore.SIGNAL(_fromUtf8("toggled(bool)")), lambda:
interfaceCodesObj.unSetFilterDict("name"))
NameError: global name 'interfaceCodesObj' is not defined
Traceback (most recent call last):
  File "/home/mohsen/codes/amlak/amlak/src/materialsFindFrame.py", line
192, in <lambda>
    QtCore.QObject.connect(self.checkBox,
QtCore.SIGNAL(_fromUtf8("toggled(bool)")), lambda:
interfaceCodesObj.setFilterDict(self,self.checkBox,"name",self.lineEdit.text()))
NameError: global name 'interfaceCodesObj' is not defined
Traceback (most recent call last):
  File "/home/mohsen/codes/amlak/amlak/src/materialsFindFrame.py", line
198, in <lambda>
    QtCore.QObject.connect(self.checkBox,
QtCore.SIGNAL(_fromUtf8("toggled(bool)")), lambda:
interfaceCodesObj.responseToRequestForData(self))
NameError: global name 'interfaceCodesObj' is not defined 
#######################################################

I'm forced to used wildcard such as from~import  syntax.
you said correctly, i was C++ developer.

Yours,
Mohsen




More information about the Python-list mailing list