Help needed - function apparently global cannot be called.
rami.chowdhury at merton.oxon.org
Tue Sep 7 21:54:17 CEST 2010
On Tue, Sep 7, 2010 at 20:00, Ian <hobson42 at gmaiil.com> wrote:
> On 07/09/2010 11:50, Bruno Desthuilliers wrote:
> note the order of the above - log is defined before the import.
> And ? Do you think it will affect the imported module in any way ? Like,
> say, magically "inject" your log function in the DelNotePrinter module ?-)
> Just that log is defined before the global log is encountered to that if
> the compiler needed to set up a link at compile time it was able to do so.
I think I see where you're going wrong -- this bit me too when I was
learning Python, having come from PHP. Unlike PHP, when you import a module
in Python it does *not* inherit the importing module's namespace. So the
"log" function you're accessing in DelNotePrinter.py is not the one you
defined above the import statement.
> In Python, "global" means "module-level", and it's only necessary when you
> want to rebind a module-level name from within a function or method.
> Exactly! I want to bind the name log to the function I wrote.
As Bruno pointed out, the "global" statement is only necessary if you want
to "rebind" a name -- i.e. if you want to modify how an object appears to
the global scope. It's not necessary if you simply want to call a function.
> I have read http://docs.python.org/reference/simple_stmts.html#globalvery carefully and I still don't understand.
> The statement definition makes no sense if you don't understand namespaces
> and bindings:
> Thanks for the pointer. What a truly execrable piece of writing - full of
> over-long sentences and multiple subordinate clauses. It routinely uses
> terms before definition, and sometimes without definition. It is
> astonishingly bad.
Perhaps you could help rewrite it? I'm sure the maintainers would be very
happy to get a documentation patch.
> The third sentence reads "Each occurrence of a name in the program text
> refers to the *binding* of that name established in the innermost function
> block containing the use." What does that mean? It appears to mean that it
> is the assignment in the innermost function block that binds for all uses,
> not the first, not module blocks, not class blocks and not code blocks - but
> the innermost function block. That might be correct, but somehow I doubt it,
> for it would mean that earlier bindings are ignored or invalidated or not
> used or something - even if the inner block is not executed.
> I am not stupid and English is my mother tongue, and I have read that page
> many times. The implications of the passage are still opaque to me.
> How can I call a global function placed at the top of the source. Do I
> really have to move a 4 line function into its own file and import it again
> and again and again?
The short answer is yes. If you have this and similar functions that you
call from various modules, then it's ideal to put them in a utility module
of their own. However, as imported modules are cached in Python, this isn't
as expensive as you might think if you are more used to other languages.
"Never assume malice when stupidity will suffice." -- Hanlon's Razor
408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD)
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Python-list