Help needed - function apparently global cannot be called.

Rami Chowdhury rami.chowdhury at merton.oxon.org
Tue Sep 7 21:54:17 CEST 2010


Hi Ian,

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:
>
> http://docs.python.org/reference/executionmodel.html#naming-and-binding
>
>  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.

-- 
Rami Chowdhury
"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...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100908/339038b5/attachment.html>


More information about the Python-list mailing list