Re: Getting globals of the caller, not the defining module
On Thu, 14 Nov 2013 20:56:34 +, Rotwang wrote: [...] How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals Bump. Did this do what you wanted, or not? Sort of. If anything, it convinced me that I don't, in fact, want what I thought I wanted. I'm still playing around with the code, but it's looking likely that auto- detecting the caller's globals is not really what I want. -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On 11/11/2013 12:02, sg...@hotmail.co.uk wrote: (Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals Bump. Did this do what you wanted, or not? -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On 12/11/2013 01:57, Terry Reedy wrote: On 11/11/2013 7:02 AM, sg...@hotmail.co.uk wrote: (Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals In Python 3, the attribute is __globals__. Er... no it isn't? Sorry if I'm mistaken but I believe you're thinking of the attribute formerly known as func_globals. But in the above inspect.stack()[1][0] is not a function, it's a frame object. In fact it's the same thing as sys._getframe().f_back, I think. -- https://mail.python.org/mailman/listinfo/python-list
Getting globals of the caller, not the defining module
Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On Mon, Nov 11, 2013 at 10:25 PM, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote: But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? You're playing with introspection, so I'd look at poking around in the stack trace. It'll be esoteric, but I think this is the right place to use it. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
(Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals # module B.py import A print(A.spam() is globals()) # prints True def f(): return A.spam() # module C.py import B print(B.f() is vars(B)) # prints True I don't really know what I'm doing but I guess it won't work in alternative implementations of Python. -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On 11/11/2013 7:02 AM, sg...@hotmail.co.uk wrote: (Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals In Python 3, the attribute is __globals__. In either case, it is only defined on Python coded functions, so one should be prepared for it to not exist. That possibility is real because there *are* builtins like map and filter that take function args and call them. Inspect has been modified in Py 3, but stack is still there. # module B.py import A print(A.spam() is globals()) # prints True def f(): return A.spam() # module C.py import B print(B.f() is vars(B)) # prints True I don't really know what I'm doing but I guess it won't work in alternative implementations of Python. -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list