import error between 2 modules

J

jimgardener

I am new to python,and am learning from the tutorials
i created 2 .py files like below and put the main in one of them

empmodule.py
----------
from workmodule import Worker

class Employer:
def __init__(self,n):
self.name=n
self.worker=Worker()
def getemployerName(self):
return self.name
def callWorker(self,message):
self.worker.answerCall(message)
if __name__ == "__main__":
emp=Employer()
emp.callWorker("report to work")


workmodule.py
------------------
from empmodule import Employer
class Worker:
def __init__(self):
self.emp=Employer()
def answerCall(self,msg):
print "Worker :"+msg+" received
from :"+self.emp.getemployerName()


is this kind of mutual import not allowed in python?
I am getting
"from workmodule import Worker
ImportError: cannot import name Worker"

any advice/pointers most welcome
thanks
jim
 
L

Laszlo Nagy

jimgardener said:
I am new to python,and am learning from the tutorials
i created 2 .py files like below and put the main in one of them

empmodule.py
----------
from workmodule import Worker

class Employer:
def __init__(self,n):
self.name=n
self.worker=Worker()
def getemployerName(self):
return self.name
def callWorker(self,message):
self.worker.answerCall(message)
if __name__ == "__main__":
emp=Employer()
emp.callWorker("report to work")


workmodule.py
------------------
from empmodule import Employer
class Worker:
def __init__(self):
self.emp=Employer()
def answerCall(self,msg):
print "Worker :"+msg+" received
from :"+self.emp.getemployerName()


is this kind of mutual import not allowed in python?
I am getting
"from workmodule import Worker
ImportError: cannot import name Worker"

any advice/pointers most welcome
thanks
You are doing a circular import. Here is some things you can do:


#1. import the module names, not definitions inside them. For example:

import empmodule
.....
self.emp = empmodule.Employer()


#2. place both classes in the same file




By the way, your program must semantically be wrong. When you create an
Employer instance from your main program, it will try to create a worker
in its constuctor:

self.worker = workmodule.Worker()

When the worker is being created, it tries to create an employer in its
constuctor:

self.emp = empmodule.Employer()

These constructors will be calling each other forever. This will be an
infinite recursion. In the end, no constructor call will be finished and
you will not create any objects but reach recursion limit instead.

Best,

Laszlo
 
M

Maric Michaud

Le Wednesday 27 August 2008 12:38:33 jimgardener, vous avez écrit :
empmodule.py
----------
from workmodule import Worker

class Employer:
    def __init__(self,n):
        self.name=n
        self.worker=Worker()
    def getemployerName(self):
        return self.name
    def callWorker(self,message):
        self.worker.answerCall(message)
if __name__ == "__main__":
    emp=Employer()
    emp.callWorker("report to work")


workmodule.py
------------------
from empmodule import Employer
class Worker:
    def __init__(self):
        self.emp=Employer()
    def answerCall(self,msg):
        print "Worker :"+msg+" received
from :"+self.emp.getemployerName()

For this case you could do your import directly in the __init__ func and watch
the infinite loop you did in action !

empmodule.py
----------
from workmodule import Worker

class Employer:
def __init__(self,n):
self.name=n
self.worker=Worker(self)
def getemployerName(self):
return self.name
def callWorker(self,message):
self.worker.answerCall(message)
if __name__ == "__main__":
emp=Employer()
emp.callWorker("report to work")


workmodule.py
------------------
class Worker:
def __init__(self, employer):
from empmodule import Employer
if not isinstance(employer, Employer):
raise ValueError("Not an employer")
self.emp=employer()
 
J

jimgardener

These constructors will be calling each other forever. This will be an infinite recursion.

sorry,that was a quite stupid mistake on my part..thanks for pointing
out..
jim
 
F

Fredrik Lundh

jimgardener said:
is this kind of mutual import not allowed in python?

it is, but you need to understand how things work before you can use it
without getting yourself into trouble. this page might help:

http://effbot.org/zone/import-confusion.htm

see the "Circular Import" section for a discussion of what's going on
here, and "Which Way Should I Use" for some guidelines (pay special
attention to the last item in that list ;-)

</F>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,430
Messages
2,571,676
Members
48,796
Latest member
Greg L.

Latest Threads

Top