4

How do I define the function in the importer so that it is visible inside imported? I tried this

importer.py is

def build(): print "building" build() import imported 

Whereby, imported.py is simply

build() 

Yet, this fails

building Traceback (most recent call last): File "C:\Users\valentin\Desktop\projects\maxim\miniGP\b01\evaluator\importer.py", line 6, in <module> import imported File "C:\Users\valentin\Desktop\projects\maxim\miniGP\b01\evaluator\imported.py", line 1, in <module> build() NameError: name 'build' is not defined 

Update After I have got the response to make the circular import, so that import and imported depend on each other, I feel that I need to make clear that this is not always good. My purpose is to specify some common strategy in the imported module. It will use some user-defined functions, e.g. build. User defines the necessary function(s) and calls the strategy. The point is that the shared strategy must not depend on specific user definitions. I believe that in place of import, I need something like evaluate(imported.py), which I believe is a basic function in any script language, including Python. irc://freenode/python insists that I must use import but I do not understand how.

2
  • Part of our confusion is because that's exactly what import does, as a side-effect of importing the module itself. (So, if foo.py contains bar = 1 + 1 and you import foo, you then have access to foo.bar == 2 because foo.py was evaluated!) Commented Nov 4, 2013 at 14:59
  • I do not understand which confusion you are talking about. Commented Nov 4, 2013 at 15:45

3 Answers 3

12

importer.py

def build(): print("building") build() #this extra call will print "building" once more. 

imported.py

from importer import build build() 

Note that both importer.py and imported.py must be in same directory. I hope this solve your problem

Sign up to request clarification or add additional context in comments.

13 Comments

Won't it create a curcular reference? How many times is print("building") executed?
as much as you call build() function. For my case It will print just once.
Have you tried it yet! using import means to make reference to your module, not to execute it. And a function call build() inside the imported will actually call the function from importer.py which is then executed not more than once. So try it before you ask it
I have tried it, and in my laptop its just once, and with 2 build() function its twice.. double check your problem I am sure its not the way of python
I have discovered that I need execfile. Unfortunately enemy does not let me to make this as answer. But let's keep the right answer here.
|
7

Imports are not includes: they are idempotent and should always be at the top of a module.

There is no circularity; once import foo is seen, further instances of import foo will not load the module again.

You are getting the NameError because in the context of imported.py, there is no name build, it is known as importer.build().

I have no idea what you are trying to do with code as oddly structured as that.

1 Comment

Importer defines some functions and calls some common code. This way you parametrize your common code. There is nothing strange in this normality.
-14

I know that this is a blasphemy but the thing that allows to import a module without tying the imported with importer is easily available in Python as a script language. You can always evaluate a file with execfile

1 Comment

execfile() isn't "blasphemy", it's a plain bad idea. Also, it's quite unlike importing. It's clear from your question that this is what you want, but it's not clear why you want this. This is not a normal thing to do in Python, by any means. Structure your project to fit Python, instead.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.