On 11/10/2010 11:58 AM, Tres Seaver wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 11/09/2010 11:12 PM, Stephen J. Turnbull wrote:
Nick Coghlan writes:

  >  >  Module writers who compound the error by expecting to be imported
  >  >  this way, thereby bogarting the global namespace for their own
  >  >  purposes, should be fish-slapped. ;)
  >
  >  Be prepared to fish-slap all of python-dev then - we use precisely
  >  this technique to support optional acceleration modules. The pure
  >  Python versions of pairs like profile/_profile and heapq/_heapq
  >  include a try/except block at the end that does the equivalent of:
  >
  >    try:
  >      from _accelerated import * # Allow accelerated overrides
  >    except ImportError:
  >      pass # Use pure Python versions

But these identifiers will appear at the module level, not global, no?
Otherwise this technique couldn't be used.  I don't really understand
what Tres is talking about when he writes "modules that expect to be
imported this way".  The *imported* module shouldn't care, no?  This
is an issue for the *importing* code to deal with.

Right -- "private" star imports aren't the issue for me, because the
same user who creates them is responsible for the other end fo the
stick.  I was ranting about library authors who document star imports as
the expected usage pattern for their external users.

Note that I still wouldn't use star imports in the "private
acceleration" case myself.  I would prefer a pattern like:

- ----------------------- $<  -----------------------------
# spam.py

# Pure python API implementation
def foo(spat, blarg):
     ...

def bar(qux):
     ...

# Replace with accelearated C implemenataion
try:
     import _spam
except ImportError:
     pass # accelerated version not available
else:
     foo = _spam.foo
     bar = _spam.bar
- ----------------------- $<  -----------------------------

This explicit name remapping catches unintentional erros (e.g., _spam
renames a method) better than the star import.

But then you're saying that all implementations of _spam have to support the same API. What if CPython's _spam has foo, bar, and baz, but Jython's only has foo and bar, and IronPython's only has baz? Without getting into special casing or lots of try/catch blocks on individual names, I think import * is the best way to go.

Eric.
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to