Gurpreet Sachdeva wrote:
The purpose is, I pass a list to a class in a module but I want to use
that list out of the scope of that class and that too not in any other
class or a function but in the main program...
The problem is that when I import that, the statements in the module
which are not in the class are executed first and then the variable
gets intiallised...
I will explain with the example...

-global test
-
-class a:
-        def __init__(self,test):
-                global test
-                print test
-
-print 'Outside: '+test

I want to print that variable test which I am giving to the class as
an argument, in the scope of main...
I know it is not a good way of programming but my situation is like this...
But is this possible or not? If I pass test as 'Garry' can I (by any
way) print 'Outside: Garry' with that print statement... (in the main
scope)

Probably a better approach for this would be something like:

    class A(object):
        def __init__(self, test):
            self.test = test
        def printtest(self):
            print 'Outside: %s' % self.test

where your code in your main module looks something like:

    import amodule
    a = amodule.A('Garry')
    a.printtest()

The __init__ method is used for initializing *instances* of a class, so using the __init__ method to initialize a module-level variable doesn't really make much sense. If you really want to play around with module-level variables, you probably want to modify them with module-level functions, e.g.:

    test = 'default'
    def a(val):
        global test
        test = val
    def printtest():
        print 'Outside: %s' % test

where your code in your main module looks something like:

    import amodule
    amodule.a('Garry')
    amodule.printtest()

Note that I've moved all your code that would normally be executed at module import time into the 'printtest' function. This way you can execute this code after import.

If you really need to have the code executed at the same time as the module is imported, another option would be to exec your code in an empty module instead of importing it:

    py> a_module_str = """print 'Outside: %s' % test"""
    py> a_module = new.module('a')
    py> a_module.test = 'Garry'
    py> exec a_module_str in a_module.__dict__
    Outside: Garry

Here I create an empty module, set its 'test' attribute to 'Garry', and then execute the rest of your code (e.g. the print statement). This is certainly my least favorite approach, but it seems to do the closest thing to what you're asking for.

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to